diff --git a/scumm/smush/frenderer.cpp b/scumm/smush/frenderer.cpp index eb75a2bde42..93534d7c025 100644 --- a/scumm/smush/frenderer.cpp +++ b/scumm/smush/frenderer.cpp @@ -232,3 +232,77 @@ bool FontRenderer::drawStringCentered(const char * str, char * buffer, const Poi delete []substrings; return true; } + +bool FontRenderer::drawStringWrap(const char * str, char * buffer, const Point & size, int32 x, int32 y, int32 width) const { + debug(9, "FontRenderer::drawStringWrap(%s, %d, %d)", str, x, y); + assert(strchr(str, '\n') == 0); + char * * words = split(str, ' '); + int32 nb_sub = 0; + + while(words[nb_sub]) nb_sub++; + + int32 * sizes = new int32[nb_sub]; + int32 i = 0, max_width = 0, height = 0, nb_subs = 0, left_x; + + for(i = 0; i < nb_sub; i++) + sizes[i] = stringWidth(words[i]); + + char * * substrings = new char *[nb_sub]; + int32 * substr_widths = new int32[nb_sub]; + int32 space_width = charWidth(' '); + + i = 0; + while(i < nb_sub) { + int32 substr_width = sizes[i]; + char * substr = new char[1000]; + strcpy(substr, words[i]); + int32 j = i + 1; + + while(j < nb_sub && (substr_width + space_width + sizes[j]) < width) { + substr_width += sizes[j++] + space_width; + } + + for(int32 k = i + 1; k < j; k++) { + strcat(substr, " "); + strcat(substr, words[k]); + } + + substrings[nb_subs] = substr; + substr_widths[nb_subs++] = substr_width; + i = j; + height += stringHeight(substr); + } + + delete []sizes; + for(i = 0; i < nb_sub; i++) { + delete []words[i]; + } + delete []words; + + if(y + height > size.getY()) { + y = size.getY() - height; + } + + for(i = 0; i < nb_subs; i++) + max_width = MAX(max_width, substr_widths[i]); + + if(max_width + x > size.getX()) + left_x = size.getX() - max_width + charWidth(' '); + else + left_x = x; + + if(max_width + left_x > size.getX()) + left_x = size.getX() - max_width; + + for(i = 0; i < nb_subs; i++) { + int32 substr_width = substr_widths[i]; + drawSubstring((const byte *)substrings[i], buffer, size, left_x, y); + y += stringHeight(substrings[i]); + delete []substrings[i]; + } + + delete []substr_widths; + delete []substrings; + return true; +} + diff --git a/scumm/smush/frenderer.h b/scumm/smush/frenderer.h index c0210ab4d76..e3d6c236f21 100644 --- a/scumm/smush/frenderer.h +++ b/scumm/smush/frenderer.h @@ -148,6 +148,7 @@ public: @return \c true if everything went fine, \c false otherwise */ bool drawStringCentered(const char * str, char * buffer, const Point & size, int32 y, int32 xmin, int32 width, int32 offset) const; + bool drawStringWrap(const char * str, char * buffer, const Point & size, int32 x, int32 y, int32 width) const; /*! @brief draw a string at an absolute position. @param str the string to draw. diff --git a/scumm/smush/player.cpp b/scumm/smush/player.cpp index b61a746e400..7154b4b38e1 100644 --- a/scumm/smush/player.cpp +++ b/scumm/smush/player.cpp @@ -380,11 +380,35 @@ void SmushPlayer::handleTextResource(Chunk & b) { assert(fr != 0); fr->setColor(color); if(!_curBuffer) { _curBuffer = _renderer->lockFrame(_frame); } - if(flags == 0 || flags == 4) { + + // flags: + // bit 0 - center 1 + // bit 1 - not used 2 + // bit 2 - ??? 4 + // bit 3 - wrap around 8 + if(flags == 0) { fr->drawStringAbsolute(str, _curBuffer, _frameSize, pos_x, pos_y); - } else { + } + else if(flags == 1) { fr->drawStringCentered(str, _curBuffer, _frameSize, MAX(pos_y, top), left, width, pos_x); } + else if(flags == 4) { + fr->drawStringAbsolute(str, _curBuffer, _frameSize, pos_x, pos_y); + } + else if(flags == 5) { + fr->drawStringCentered(str, _curBuffer, _frameSize, MAX(pos_y, top), left, width, pos_x); + } + else if(flags == 8) { + fr->drawStringWrap(str, _curBuffer, _frameSize, pos_x, MAX(pos_y, top), width); + } + else if(flags == 12) { + fr->drawStringWrap(str, _curBuffer, _frameSize, pos_x, MAX(pos_y, top), width); + } + else if(flags == 13) { + fr->drawStringCentered(str, _curBuffer, _frameSize, MAX(pos_y, top), left, width, pos_x); + } + else + warning("SmushPlayer::handleTextResource. Not handled flags: %d\n", flags); } void SmushPlayer::readPalette(Palette & out, Chunk & in) {