Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DIRECTOR: LINGO: Implement TextCastMember property STUB (kTheTextFont, kTheTextHeight, kTheTextStyle, kTheTextSize) #3957

Merged
merged 8 commits into from Jun 6, 2022
54 changes: 46 additions & 8 deletions engines/director/lingo/lingo-object.cpp
Expand Up @@ -27,6 +27,8 @@
#include "director/cast.h"
#include "director/channel.h"
#include "director/castmember.h"
#include "director/movie.h"
#include "director/score.h"
#include "director/window.h"
#include "director/util.h"
#include "director/lingo/lingo.h"
Expand Down Expand Up @@ -984,6 +986,19 @@ Datum TextCastMember::getField(int field) {
}

bool TextCastMember::setField(int field, const Datum &d) {
Channel *toEdit = nullptr;
Common::Array<Channel *> channels = g_director->getCurrentMovie()->getScore()->_channels;
for (uint i = 0; i < channels.size(); i++) {
if (channels[i]->_sprite->_cast == this) {
toEdit = channels[i];
break;
}
}
if (toEdit) {
Common::Rect bbox = toEdit->getBbox();
toEdit->_widget = createWidget(bbox, toEdit, toEdit->_sprite->_spriteType);
}

switch (field) {
case kTheBackColor:
{
Expand Down Expand Up @@ -1029,22 +1044,45 @@ bool TextCastMember::setField(int field, const Datum &d) {
}
return true;
case kTheTextFont:
warning("STUB: set textFont");
// d is STRING here
_fontId = d.asInt();
if (!toEdit) {
warning("Channel containing this CastMember %d doesn't exist", (int) _castId);
return false;
}
((Graphics::MacText *)toEdit->_widget)->enforceTextFont((uint16) g_director->_wm->_fontMan->getFontIdByName(d.asString()));
_ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText();
_ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true);
_modified = true;
return false;
toEdit->_widget->removeWidget(_widget);
return true;
case kTheTextHeight:
_lineSpacing = d.asInt();
_modified = true;
return false;
case kTheTextSize:
setTextSize(d.asInt());
return false;
if (!toEdit) {
warning("Channel containing this CastMember %d doesn't exist", (int) _castId);
return false;
}
((Graphics::MacText *)toEdit->_widget)->setTextSize(d.asInt());
_ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText();
_ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true);
_modified = true;
toEdit->_widget->removeWidget(_widget);
return true;
case kTheTextStyle:
_textSlant = d.asInt();
{
if (!toEdit) {
warning("Channel containing this CastMember %d doesn't exist", (int) _castId);
return false;
}
int slant = g_director->_wm->_fontMan->parseSlantFromName(d.asString());
((Graphics::MacText *)toEdit->_widget)->enforceTextSlant(slant);
_ptext = ((Graphics::MacText *)toEdit->_widget)->getPlainText();
_ftext = ((Graphics::MacText *)toEdit->_widget)->getTextChunk(0, 0, -1, -1, true);
_modified = true;
return false;
toEdit->_widget->removeWidget(_widget);
return true;
}
default:
break;
}
Expand Down
23 changes: 15 additions & 8 deletions graphics/macgui/macfontmanager.cpp
Expand Up @@ -512,22 +512,24 @@ int MacFontManager::parseFontSlant(Common::String slant) {
int MacFontManager::parseSlantFromName(const Common::String &name) {
int slantVal = 0;

if (name.contains(" Bold"))
if (name.contains(" Bold") || name.equalsIgnoreCase("Bold"))
slantVal |= kMacFontBold;
if (name.contains(" Italic"))
if (name.contains(" Italic") || name.equalsIgnoreCase("Italic"))
slantVal |= kMacFontItalic;
if (name.contains(" Regular"))
if (name.contains(" Regular") || name.equalsIgnoreCase("Regular"))
slantVal |= kMacFontRegular;
if (name.contains(" Underline"))
if (name.contains(" Underline") || name.equalsIgnoreCase("Underline"))
slantVal |= kMacFontUnderline;
if (name.contains(" Shadow"))
if (name.contains(" Shadow") || name.equalsIgnoreCase("Shadow"))
slantVal |= kMacFontShadow;
if (name.contains(" Outline"))
if (name.contains(" Outline") || name.equalsIgnoreCase("Outline"))
slantVal |= kMacFontOutline;
if (name.contains(" Condense"))
if (name.contains(" Condense") || name.equalsIgnoreCase("Condense"))
slantVal |= kMacFontCondense;
if (name.contains(" Extend"))
if (name.contains(" Extend") || name.equalsIgnoreCase("Extend"))
slantVal |= kMacFontExtend;
if (name.contains(" Plain") || name.equalsIgnoreCase("Plain"))
slantVal = kMacFontRegular;

return slantVal;
}
Expand Down Expand Up @@ -591,6 +593,11 @@ int MacFontManager::getFontIdByName(Common::String name) {
if (_fontIds.contains(name))
return _fontIds[name];

for (auto it = _fontIds.begin(); it != _fontIds.end(); it++) {
if (it->_key.equalsIgnoreCase(name)) {
return it->_value;
}
}
return 1;
}

Expand Down
39 changes: 39 additions & 0 deletions graphics/macgui/mactext.cpp
Expand Up @@ -337,6 +337,18 @@ void MacText::setColors(uint32 fg, uint32 bg) {
_contentIsDirty = true;
}

void MacText::enforceTextFont(uint16 fontId) {
for (uint i = 0; i < _textLines.size(); i++) {
for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
_textLines[i].chunks[j].fontId = fontId;
}
}

_fullRefresh = true;
render();
_contentIsDirty = true;
}

void MacText::setTextSize(int textSize) {
for (uint i = 0; i < _textLines.size(); i++) {
for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
Expand Down Expand Up @@ -472,6 +484,22 @@ void MacText::setTextSlant(int textSlant, int start, int end) {
setTextChunks(start, end, textSlant, setTextSlantCallback);
}

void MacText::enforceTextSlant(int textSlant) {
for (uint i = 0; i < _textLines.size(); i++) {
for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
if (textSlant) {
_textLines[i].chunks[j].textSlant |= textSlant;
} else {
_textLines[i].chunks[j].textSlant = textSlant;
}
}
}

_fullRefresh = true;
render();
_contentIsDirty = true;
}

// this maybe need to amend
// currently, we just return the text size of first character.
int MacText::getTextSize(int start, int end) {
Expand Down Expand Up @@ -1620,6 +1648,17 @@ Common::U32String MacText::getEditedString() {
return getTextChunk(_editableRow, 0, -1, -1);
}

Common::U32String MacText::getPlainText() {
Common::U32String res;
for (uint i = 0; i < _textLines.size(); i++) {
for (uint j = 0; j < _textLines[i].chunks.size(); j++) {
res += _textLines[i].chunks[j].text;
}
}

return res;
}

Common::U32String MacText::cutSelection() {
if (!isCutAllowed())
return Common::U32String();
Expand Down
3 changes: 3 additions & 0 deletions graphics/macgui/mactext.h
Expand Up @@ -194,6 +194,7 @@ class MacText : public MacWidget {
void appendText(const Common::U32String &str, const Font *font, uint16 r = 0, uint16 g = 0, uint16 b = 0, bool skipAdd = false);

int getTextFont() { return _defaultFormatting.fontId; }
void enforceTextFont(uint16 fontId);

// because currently, we are counting linespacing as font height
int getTextSize() { return _defaultFormatting.fontSize; }
Expand All @@ -210,6 +211,7 @@ class MacText : public MacWidget {

int getTextSlant(int start, int end);
void setTextSlant(int textSlant, int start, int end);
void enforceTextSlant(int textSlant);

// director text related-functions
int getMouseChar(int x, int y);
Expand Down Expand Up @@ -272,6 +274,7 @@ class MacText : public MacWidget {

Common::U32String getEditedString();
Common::U32String getText() { return _str; }
Common::U32String getPlainText();

void setSelRange(int selStart, int selEnd);

Expand Down