int16 GfxText16::Size(Common::Rect &rect, const char *text, uint16 languageSplitter, GuiResourceId fontId, int16 maxWidth) { GuiResourceId previousFontId = GetFontId(); int16 previousPenColor = _ports->_curPort->penClr; int16 charCount; int16 maxTextWidth = 0, textWidth; int16 totalHeight = 0, textHeight; if (fontId != -1) SetFont(fontId); else fontId = previousFontId; rect.top = rect.left = 0; if (maxWidth < 0) { // force output as single line if (g_sci->getLanguage() == Common::JA_JPN) SwitchToFont900OnSjis(text, languageSplitter); StringWidth(text, fontId, textWidth, textHeight); rect.bottom = textHeight; rect.right = textWidth; } else { // rect.right=found widest line with RTextWidth and GetLongest // rect.bottom=num. lines * GetPointSize rect.right = (maxWidth ? maxWidth : 192); const char *curTextPos = text; // in work position for GetLongest() const char *curTextLine = text; // starting point of current line while (*curTextPos) { // We need to check for Shift-JIS every line if (g_sci->getLanguage() == Common::JA_JPN) SwitchToFont900OnSjis(curTextPos, languageSplitter); charCount = GetLongest(curTextPos, rect.right, fontId); if (charCount == 0) break; Width(curTextLine, 0, charCount, fontId, textWidth, textHeight, false); maxTextWidth = MAX(textWidth, maxTextWidth); totalHeight += textHeight; curTextLine = curTextPos; } rect.bottom = totalHeight; rect.right = maxWidth ? maxWidth : MIN(rect.right, maxTextWidth); } SetFont(previousFontId); _ports->penColor(previousPenColor); return rect.right; }
int16 GfxText16::Size(Common::Rect &rect, const char *text, GuiResourceId fontId, int16 maxWidth) { GuiResourceId previousFontId = GetFontId(); int16 previousPenColor = _ports->_curPort->penClr; int16 charCount; int16 maxTextWidth = 0, textWidth; int16 totalHeight = 0, textHeight; if (fontId != -1) SetFont(fontId); else fontId = previousFontId; if (g_sci->getLanguage() == Common::JA_JPN) SwitchToFont900OnSjis(text); rect.top = rect.left = 0; if (maxWidth < 0) { // force output as single line StringWidth(text, fontId, textWidth, textHeight); rect.bottom = textHeight; rect.right = textWidth; } else { // rect.right=found widest line with RTextWidth and GetLongest // rect.bottom=num. lines * GetPointSize rect.right = (maxWidth ? maxWidth : 192); const char *curPos = text; while (*curPos) { charCount = GetLongest(curPos, rect.right, fontId); if (charCount == 0) break; Width(curPos, 0, charCount, fontId, textWidth, textHeight, false); maxTextWidth = MAX(textWidth, maxTextWidth); totalHeight += textHeight; curPos += charCount; while (*curPos == ' ') curPos++; // skip over breaking spaces } rect.bottom = totalHeight; rect.right = maxWidth ? maxWidth : MIN(rect.right, maxTextWidth); } SetFont(previousFontId); _ports->penColor(previousPenColor); return rect.right; }
// Draws a text in rect. void GfxText16::Box(const char *text, bool show, const Common::Rect &rect, TextAlignment alignment, GuiResourceId fontId) { int16 textWidth, maxTextWidth, textHeight, charCount; int16 offset = 0; int16 hline = 0; GuiResourceId previousFontId = GetFontId(); int16 previousPenColor = _ports->_curPort->penClr; bool doubleByteMode = false; if (fontId != -1) SetFont(fontId); else fontId = previousFontId; if (g_sci->getLanguage() == Common::JA_JPN) { if (SwitchToFont900OnSjis(text)) doubleByteMode = true; } // Reset reference code rects _codeRefRects.clear(); _codeRefTempRect.left = _codeRefTempRect.top = -1; maxTextWidth = 0; while (*text) { charCount = GetLongest(text, rect.width(), fontId); if (charCount == 0) break; Width(text, 0, charCount, fontId, textWidth, textHeight, true); maxTextWidth = MAX<int16>(maxTextWidth, textWidth); switch (alignment) { case SCI_TEXT16_ALIGNMENT_RIGHT: offset = rect.width() - textWidth; break; case SCI_TEXT16_ALIGNMENT_CENTER: offset = (rect.width() - textWidth) / 2; break; case SCI_TEXT16_ALIGNMENT_LEFT: offset = 0; break; default: warning("Invalid alignment %d used in TextBox()", alignment); } _ports->moveTo(rect.left + offset, rect.top + hline); if (show) { Show(text, 0, charCount, fontId, previousPenColor); } else { Draw(text, 0, charCount, fontId, previousPenColor); } hline += textHeight; text += charCount; while (*text == ' ') text++; // skip over breaking spaces } SetFont(previousFontId); _ports->penColor(previousPenColor); if (doubleByteMode) { // Kanji is written by pc98 rom to screen directly. Because of // GetLongest() behavior (not cutting off the last char, that causes a // new line), results in the script thinking that the text would need // less space. The coordinate adjustment in fontsjis.cpp handles the // incorrect centering because of that and this code actually shows all // of the chars - if we don't do this, the scripts will only show most // of the chars, but the last few pixels won't get shown most of the // time. Common::Rect kanjiRect = rect; _ports->offsetRect(kanjiRect); kanjiRect.left &= 0xFFC; kanjiRect.right = kanjiRect.left + maxTextWidth; kanjiRect.bottom = kanjiRect.top + hline; kanjiRect.left *= 2; kanjiRect.right *= 2; kanjiRect.top *= 2; kanjiRect.bottom *= 2; _screen->copyDisplayRectToScreen(kanjiRect); } }