diff options
-rw-r--r-- | scumm/smush/smush_font.cpp | 80 | ||||
-rw-r--r-- | scumm/smush/smush_font.h | 2 | ||||
-rw-r--r-- | scumm/smush/smush_player.cpp | 16 |
3 files changed, 35 insertions, 63 deletions
diff --git a/scumm/smush/smush_font.cpp b/scumm/smush/smush_font.cpp index 38d6ffaa6b..d983a7d6a9 100644 --- a/scumm/smush/smush_font.cpp +++ b/scumm/smush/smush_font.cpp @@ -137,6 +137,12 @@ int SmushFont::draw2byte(byte *buffer, int dst_width, int x, int y, int idx) { } void SmushFont::drawSubstring(const char *str, byte *buffer, int dst_width, int x, int y) { + // This happens in the Full Throttle intro. I don't know if our + // text-drawing functions are buggy, or if this function is supposed + // to have to check for it. + if (x < 0) + x = 0; + for (int i = 0; str[i] != 0; i++) { if ((byte)str[i] >= 0x80 && _vm->_CJKMode) { x += draw2byte(buffer, dst_width, x, y, (byte)str[i] + 256 * (byte)str[i+1]); @@ -168,69 +174,23 @@ void SmushFont::drawStringAbsolute(const char *str, byte *buffer, int dst_width, } } -void SmushFont::drawStringCentered(const char *str, byte *buffer, int dst_width, int dst_height, int x, int y, int left, int right) { - debug(9, "SmushFont::drawStringCentered(%s, %d, %d, %d, %d)", str, x, y, left, right); - - const int width = right - left; - char *s = strdup(str); - char *words[MAX_WORDS]; - int word_count = 0; - - char *tmp = s; - while (tmp) { - assert(word_count < MAX_WORDS); - words[word_count++] = tmp; - tmp = strpbrk(tmp, " \t\r\n"); - if (tmp == 0) - break; - *tmp++ = 0; - } - - int i = 0, max_width = 0, height = 0, line_count = 0; +void SmushFont::drawStringCentered(const char *str, byte *buffer, int dst_width, int dst_height, int x, int y) { + debug(9, "SmushFont::drawStringCentered(%s, %d, %d)", str, x, y); - char *substrings[MAX_WORDS]; - int substr_widths[MAX_WORDS]; - const int space_width = getCharWidth(' '); - - i = 0; - while (i < word_count) { - char *substr = words[i++]; - int substr_width = getStringWidth(substr); - - while (i < word_count) { - int word_width = getStringWidth(words[i]); - if ((substr_width + space_width + word_width) >= width) - break; - substr_width += word_width + space_width; - *(words[i]-1) = ' '; // Convert 0 byte back to space - i++; + while (str) { + char line[256]; + char *pos = strchr(str, '\n'); + if (pos) { + memcpy(line, str, pos - str - 1); + line[pos - str - 1] = 0; + str = pos + 1; + } else { + strcpy(line, str); + str = 0; } - - substrings[line_count] = substr; - substr_widths[line_count++] = substr_width; - if (max_width < substr_width) - max_width = substr_width; - height += getStringHeight(substr); - } - - if (y > dst_height - height) { - y = dst_height - height; - } - - max_width = (max_width + 1) >> 1; - x = left + width / 2; - - if (x < left + max_width) - x = left + max_width; - if (x > right - max_width) - x = right - max_width; - - for (i = 0; i < line_count; i++) { - drawSubstring(substrings[i], buffer, dst_width, x - substr_widths[i] / 2, y); - y += getStringHeight(substrings[i]); + drawSubstring(line, buffer, dst_width, x - getStringWidth(line) / 2, y); + y += getStringHeight(line); } - - free(s); } void SmushFont::drawStringWrap(const char *str, byte *buffer, int dst_width, int dst_height, int x, int y, int left, int right) { diff --git a/scumm/smush/smush_font.h b/scumm/smush/smush_font.h index ae5932693a..3b0925361a 100644 --- a/scumm/smush/smush_font.h +++ b/scumm/smush/smush_font.h @@ -44,7 +44,7 @@ public: void setColor(byte c) { _color = c; } void drawStringAbsolute (const char *str, byte *buffer, int dst_width, int x, int y); - void drawStringCentered (const char *str, byte *buffer, int dst_width, int dst_height, int x, int y, int left, int right); + void drawStringCentered (const char *str, byte *buffer, int dst_width, int dst_height, int x, int y); void drawStringWrap (const char *str, byte *buffer, int dst_width, int dst_height, int x, int y, int left, int right); void drawStringWrapCentered(const char *str, byte *buffer, int dst_width, int dst_height, int x, int y, int left, int right); }; diff --git a/scumm/smush/smush_player.cpp b/scumm/smush/smush_player.cpp index 5cac54780e..37d8c4ea46 100644 --- a/scumm/smush/smush_player.cpp +++ b/scumm/smush/smush_player.cpp @@ -561,13 +561,25 @@ void SmushPlayer::handleTextResource(Chunk &b) { sf->drawStringAbsolute(str, _data, _width, pos_x, pos_y); break; case 1: - sf->drawStringCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, right); + sf->drawStringCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top)); break; case 8: + // FIXME: Is 'right' the maximum line width here, just + // as it is in the next case? It's used several times + // in The Dig's intro, where 'left' and 'right' are + // always 0 and 321 respectively. Someone will have to + // compare it to the original to see if we draw them + // correctly. sf->drawStringWrap(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, right); break; case 9: - sf->drawStringWrapCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, right); + // In this case, the 'right' parameter is actually the + // maximum line width. This explains why it's sometimes + // smaller than 'left'. + // + // Note that in The Dig's "Spacetime Six" movie it's + // 621. I have no idea what that means. + sf->drawStringWrapCentered(str, _data, _width, _height, pos_x, MAX(pos_y, top), left, MIN(left + right, _width)); break; default: warning("SmushPlayer::handleTextResource. Not handled flags: %d", flags); |