void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::iterator format, std::vector<FontMetaChar>::iterator end, float size, Math::Point pos, float width, int eol, Color color) { m_engine->SetState(ENG_RSTATE_TEXT); float start = pos.x; unsigned int fmtIndex = 0; std::vector<UTF8Char> chars; StringToUTFCharList(text, chars, format, end); for (auto it = chars.begin(); it != chars.end(); ++it) { FontType font = FONT_COLOBOT; if (format + fmtIndex != end) font = static_cast<FontType>(*(format + fmtIndex) & FONT_MASK_FONT); UTF8Char ch = *it; float offset = pos.x - start; float cw = GetCharWidth(ch, font, size, offset); if (offset + cw > width) // exceeds the maximum width? { ch = TranslateSpecialChar(CHAR_SKIP_RIGHT); cw = GetCharWidth(ch, font, size, offset); pos.x = start + width - cw; color = Color(1.0f, 0.0f, 0.0f); DrawCharAndAdjustPos(ch, font, size, pos, color); break; } FontHighlight hl = static_cast<FontHighlight>(format[fmtIndex] & FONT_MASK_HIGHLIGHT); if (hl != FONT_HIGHLIGHT_NONE) { Math::Point charSize; charSize.x = GetCharWidth(ch, font, size, offset); charSize.y = GetHeight(font, size); DrawHighlight(hl, pos, charSize); } DrawCharAndAdjustPos(ch, font, size, pos, color); // increment fmtIndex for each byte in multibyte character if ( ch.c1 != 0 ) fmtIndex++; if ( ch.c2 != 0 ) fmtIndex++; if ( ch.c3 != 0 ) fmtIndex++; } if (eol != 0) { FontType font = FONT_COLOBOT; UTF8Char ch = TranslateSpecialChar(eol); color = Color(1.0f, 0.0f, 0.0f); DrawCharAndAdjustPos(ch, font, size, pos, color); } }
void CText::DrawString(const std::string &text, FontType font, float size, Math::Point pos, float width, int eol, Color color) { assert(font != FONT_BUTTON); m_engine->SetState(ENG_RSTATE_TEXT); std::vector<UTF8Char> chars; StringToUTFCharList(text, chars); for (auto it = chars.begin(); it != chars.end(); ++it) { DrawCharAndAdjustPos(*it, font, size, pos, color); } }
void CText::DrawString(const std::string &text, std::vector<FontMetaChar>::iterator format, std::vector<FontMetaChar>::iterator end, float size, Math::Point pos, float width, int eol, Color color) { m_engine->SetState(ENG_RSTATE_TEXT); float start = pos.x; unsigned int fmtIndex = 0; std::vector<UTF8Char> chars; StringToUTFCharList(text, chars); for (auto it = chars.begin(); it != chars.end(); ++it) { FontType font = FONT_COLOBOT; if (format + fmtIndex != end) font = static_cast<FontType>(*(format + fmtIndex) & FONT_MASK_FONT); // TODO: if (font == FONT_BUTTON) if (font == FONT_BUTTON) continue; UTF8Char ch = *it; float offset = pos.x - start; float cw = GetCharWidth(ch, font, size, offset); if (offset + cw > width) // exceeds the maximum width? { // TODO: special end-of-line char break; } FontHighlight hl = static_cast<FontHighlight>(format[fmtIndex] & FONT_MASK_HIGHLIGHT); if (hl != FONT_HIGHLIGHT_NONE) { Math::Point charSize; charSize.x = GetCharWidth(ch, font, size, offset); charSize.y = GetHeight(font, size); DrawHighlight(hl, pos, charSize); } DrawCharAndAdjustPos(ch, font, size, pos, color); fmtIndex++; } // TODO: eol }