aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTorbjörn Andersson2005-09-28 06:33:13 +0000
committerTorbjörn Andersson2005-09-28 06:33:13 +0000
commit1a48b01fefa916888c3139dfcc834463493a5308 (patch)
treed2559364bef67a3dd58b200767fe0f23fbc83067
parent2854ddbc809c01306761294be7851342808f6995 (diff)
downloadscummvm-rg350-1a48b01fefa916888c3139dfcc834463493a5308.tar.gz
scummvm-rg350-1a48b01fefa916888c3139dfcc834463493a5308.tar.bz2
scummvm-rg350-1a48b01fefa916888c3139dfcc834463493a5308.zip
Some more IHNM-related stuff:
* Use the script-specified text area for subtitles, if there is one. * Fixed a word-wrapping bug that would happen if a new line began with a space. I don't know about ITE, but IHNM puts two spaces after periods. Of course, the case where I saw this happen will probably go away once we start using the right font, but it could still happen elsewhere. svn-id: r18890
-rw-r--r--saga/actor.cpp47
-rw-r--r--saga/animation.cpp2
-rw-r--r--saga/font.cpp27
-rw-r--r--saga/font.h4
-rw-r--r--saga/sfuncs.cpp2
5 files changed, 51 insertions, 31 deletions
diff --git a/saga/actor.cpp b/saga/actor.cpp
index 73bc427f21..4b0fbf4189 100644
--- a/saga/actor.cpp
+++ b/saga/actor.cpp
@@ -1017,34 +1017,41 @@ void Actor::handleSpeech(int msec) {
}
if (_activeSpeech.actorsCount == 1) {
- width = _activeSpeech.speechBox.width();
- height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1;
-
- if (height > 40 && width < _vm->getDisplayWidth() - 100) {
- width = _vm->getDisplayWidth() - 100;
+ if (_speechBoxScript.width() > 0) {
+ _activeSpeech.drawRect.left = _speechBoxScript.left;
+ _activeSpeech.drawRect.right = _speechBoxScript.right;
+ _activeSpeech.drawRect.top = _speechBoxScript.top;
+ _activeSpeech.drawRect.bottom = _speechBoxScript.bottom;
+ } else {
+ width = _activeSpeech.speechBox.width();
height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1;
- }
- _activeSpeech.speechBox.setWidth(width);
+ if (height > 40 && width < _vm->getDisplayWidth() - 100) {
+ width = _vm->getDisplayWidth() - 100;
+ height = _vm->_font->getHeight(kMediumFont, _activeSpeech.strings[0], width - 2, _activeSpeech.getFontFlags(0)) + 1;
+ }
+
+ _activeSpeech.speechBox.setWidth(width);
+
+ if (_activeSpeech.actorIds[0] != 0) {
+ actor = getActor(_activeSpeech.actorIds[0]);
+ _activeSpeech.speechBox.setHeight(height);
- if (_activeSpeech.actorIds[0] != 0) {
- actor = getActor(_activeSpeech.actorIds[0]);
- _activeSpeech.speechBox.setHeight(height);
+ if (_activeSpeech.speechBox.right > _vm->getDisplayWidth() - 10) {
+ _activeSpeech.drawRect.left = _vm->getDisplayWidth() - 10 - width;
+ } else {
+ _activeSpeech.drawRect.left = _activeSpeech.speechBox.left;
+ }
- if (_activeSpeech.speechBox.right > _vm->getDisplayWidth() - 10) {
- _activeSpeech.drawRect.left = _vm->getDisplayWidth() - 10 - width;
+ height2 = actor->_screenPosition.y - 50;
+ _activeSpeech.speechBox.top = _activeSpeech.drawRect.top = MAX(10, (height2 - height) / 2);
} else {
_activeSpeech.drawRect.left = _activeSpeech.speechBox.left;
+ _activeSpeech.drawRect.top = _activeSpeech.speechBox.top + (_activeSpeech.speechBox.height() - height) / 2;
}
-
- height2 = actor->_screenPosition.y - 50;
- _activeSpeech.speechBox.top = _activeSpeech.drawRect.top = MAX(10, (height2 - height) / 2);
- } else {
- _activeSpeech.drawRect.left = _activeSpeech.speechBox.left;
- _activeSpeech.drawRect.top = _activeSpeech.speechBox.top + (_activeSpeech.speechBox.height() - height) / 2;
+ _activeSpeech.drawRect.setWidth(width);
+ _activeSpeech.drawRect.setHeight(height);
}
- _activeSpeech.drawRect.setWidth(width);
- _activeSpeech.drawRect.setHeight(height);
}
_activeSpeech.playing = true;
diff --git a/saga/animation.cpp b/saga/animation.cpp
index a5f6e9bd68..04f383aac7 100644
--- a/saga/animation.cpp
+++ b/saga/animation.cpp
@@ -119,6 +119,8 @@ void Anim::playCutaway(int cut, bool fade) {
free(buf);
free(resourceData);
+ // Play the animation
+
int cutawaySlot = -1;
for (int i = 0; i < ARRAYSIZE(_cutawayAnimations); i++) {
diff --git a/saga/font.cpp b/saga/font.cpp
index 649feb6e00..bcd9b785a8 100644
--- a/saga/font.cpp
+++ b/saga/font.cpp
@@ -62,6 +62,10 @@ Font::~Font(void) {
}
}
+FontData *Font::getFont(FontId fontId) {
+ return _fonts[fontId];
+}
+
void Font::loadFont(uint32 fontResourceId) {
FontData *font;
byte *fontResourcePointer;
@@ -70,7 +74,6 @@ void Font::loadFont(uint32 fontResourceId) {
int c;
ResourceContext *fontContext;
-
debug(1, "Font::loadFont(): Reading fontResourceId %d...", fontResourceId);
fontContext = _vm->_resource->getContext(GAME_RESOURCEFILE);
@@ -134,7 +137,6 @@ void Font::loadFont(uint32 fontResourceId) {
_fonts[_loadedFonts++] = font;
}
-
void Font::createOutline(FontData *font) {
int i;
int row;
@@ -249,7 +251,7 @@ int Font::getStringWidth(FontId fontId, const char *text, size_t count, FontEffe
validate(fontId);
- font = _fonts[fontId];
+ font = getFont(fontId);
txt = (const byte *) text;
@@ -273,7 +275,7 @@ int Font::getHeight(FontId fontId) {
validate(fontId);
- font = _fonts[fontId];
+ font = getFont(fontId);
return font->normal.header.charHeight;
}
@@ -285,7 +287,7 @@ void Font::draw(FontId fontId, Surface *ds, const char *text, size_t count, cons
validate(fontId);
- font = _fonts[fontId];
+ font = getFont(fontId);
if (flags & kFontOutline) {
offsetPoint.x--;
@@ -554,7 +556,7 @@ void Font::textDrawRect(FontId fontId, Surface *ds, const char *text, const Comm
textPoint.y = rect.top;
if (fitWidth >= textWidth) {
- // Entire string fits, draw it
+ // Entire string fits, draw it
textPoint.x -= (textWidth / 2);
draw(fontId, ds, text, textLength, textPoint, color, effectColor, flags);
return;
@@ -604,6 +606,19 @@ void Font::textDrawRect(FontId fontId, Surface *ds, const char *text, const Comm
searchPointer = measurePointer + 1;
}
wc = 0;
+
+ // Advance the search pointer to the next non-space.
+ // Otherwise, the first "word" to be measured will be
+ // an empty string. Measuring or drawing a string of
+ // length 0 is interpreted as measure/draw the entire
+ // buffer, which certainly is not what we want here.
+ //
+ // This happes because a string may contain several
+ // spaces in a row, e.g. after a period.
+
+ while (*searchPointer == ' ')
+ searchPointer++;
+
measurePointer = searchPointer;
startPointer = searchPointer;
} else {
diff --git a/saga/font.h b/saga/font.h
index 9ef83bb50f..46d6d229a3 100644
--- a/saga/font.h
+++ b/saga/font.h
@@ -76,7 +76,6 @@ public:
}
};
-
struct FontHeader {
int charHeight;
int charWidth;
@@ -106,6 +105,7 @@ class Font {
public:
Font(SagaEngine *vm);
~Font(void);
+ FontData *getFont(FontId fontId);
int getStringWidth(FontId fontId, const char *text, size_t count, FontEffectFlags flags);
int getHeight(FontId fontId);
int getHeight(FontId fontId, const char *text, int width, FontEffectFlags flags);
@@ -124,7 +124,6 @@ class Font {
}
private:
-
void loadFont(uint32 fontResourceId);
void createOutline(FontData *font);
void draw(FontId fontId, Surface *ds, const char *text, size_t count, const Common::Point &point, int color, int effectColor, FontEffectFlags flags);
@@ -139,7 +138,6 @@ class Font {
return byteLength;
}
-
static const int _charMap[256];
SagaEngine *_vm;
diff --git a/saga/sfuncs.cpp b/saga/sfuncs.cpp
index b64be9bdc6..d5b2f1caa3 100644
--- a/saga/sfuncs.cpp
+++ b/saga/sfuncs.cpp
@@ -1970,8 +1970,6 @@ void Script::sfSetSpeechBox(SCRIPTFUNC_PARAMS) {
_vm->_actor->_speechBoxScript.top = param2;
_vm->_actor->_speechBoxScript.setWidth(param3);
_vm->_actor->_speechBoxScript.setHeight(param4);
-
- debug(0, "STUB: sfSetSpeechBox(%d, %d, %d, %d)", param1, param2, param3, param4);
}
void Script::sfDebugShowData(SCRIPTFUNC_PARAMS) {