/** ** Returns the pixel width of text. ** ** @param text Text to calculate the width of. ** ** @return The width in pixels of the text. */ int CFont::Width(const std::string &text) const { int width = 0; bool isformat = false; int utf8; size_t pos = 0; DynamicLoad(); while (GetUTF8(text, pos, utf8)) { if (utf8 == '~') { if (pos >= text.size()) { // bad formatted string break; } if (text[pos] == '<' || text[pos] == '>') { isformat = false; ++pos; continue; } if (text[pos] == '!') { ++pos; continue; } if (text[pos] != '~') { // ~~ -> ~ isformat = !isformat; continue; } } if (!isformat) { width += this->CharWidth[utf8 - 32] + 1; } } return width; }
void ReportVersion(FILE *errout, Lexer *lexer, char *filename, Node *doctype) { unsigned int i, c; int state = 0; char *vers = HTMLVersionName(lexer); if (doctype) { tidy_out(errout, "\n%s: Doctype given is \"", filename); for (i = doctype->start; i < doctype->end; ++i) { c = (unsigned char)lexer->lexbuf[i]; /* look for UTF-8 multibyte character */ if (c > 0x7F) i += GetUTF8((unsigned char *)lexer->lexbuf + i, &c); if (c == '"') ++state; else if (state == 1) putc(c, errout); } putc('"', errout); } tidy_out(errout, "\n%s: Document content looks like %s\n", filename, (vers ? vers : "HTML proprietary")); }
/** ** Get the hot key from a string */ int GetHotKey(const std::string &text) { int hotkey = 0; size_t pos = 0; if (text.length() > 1) { hotkey = convertKey(text.c_str()); } else if (text.length() == 1) { GetUTF8(text, pos, hotkey); } return hotkey; }
/** ** Get the hot key from a string */ int GetHotKey(const std::string &text) { int hotkey = 0; int utf8; size_t pos = 0; while (GetUTF8(text, pos, utf8)) { if (utf8 == '~') { if (pos >= text.size()) { break; } if (text[pos] == '<') { ++pos; size_t endpos = pos; while (endpos < text.size()) { if (text[endpos] == '~') { break; } ++endpos; } std::string key = text.substr(pos, endpos - pos); hotkey = convertKey(key.c_str()); break; } if (text[pos] == '!') { ++pos; if (pos >= text.size()) { break; } GetUTF8(text, pos, utf8); hotkey = utf8; break; } } } return hotkey; }
/** ** Returns the pixel width of text. ** ** @param text Text to calculate the width of. ** ** @return The width in pixels of the text. */ int CFont::Width(const int number) const { int width = 0; #if 0 bool isformat = false; #endif int utf8; size_t pos = 0; std::string text = FormatNumber(number); const int len = text.length(); DynamicLoad(); while (GetUTF8(text.c_str(), len, pos, utf8)) { width += this->CharWidth[utf8 - 32] + 1; } return width; }
/** ** Returns the pixel width of text. ** ** @param text Text to calculate the width of. ** ** @return The width in pixels of the text. */ int CFont::Width(const int number) const { int width = 0; #if 0 bool isformat = false; #endif int utf8; size_t pos = 0; char text[ sizeof(int) * 10 + 2]; const int len = FormatNumber(number, text); DynamicLoad(); while (GetUTF8(text, len, pos, utf8)) { #if 0 if (utf8 == '~') { //if (pos >= text.size()) { // bad formatted string if (pos >= size) { // bad formatted string break; } if (text[pos] == '<' || text[pos] == '>') { isformat = false; ++pos; continue; } if (text[pos] == '!') { ++pos; continue; } if (text[pos] != '~') { // ~~ -> ~ isformat = !isformat; continue; } } if (!isformat) { width += this->CharWidth[utf8 - 32] + 1; } #else width += this->CharWidth[utf8 - 32] + 1; #endif } return width; }
/** ** Returns the pixel width of text. ** ** @param text Text to calculate the width of. ** ** @return The width in pixels of the text. */ int CFont::Width(const std::string &text) const { int width = 0; bool isformat = false; int utf8; size_t pos = 0; bool isPlainText = this->IsPlainText(); while (GetUTF8(text, pos, utf8)) { if (utf8 == '~' && !isPlainText) { if (pos >= text.size()) { // bad formatted string break; } if (text[pos] == '<' || text[pos] == '>') { isformat = false; ++pos; continue; } if (text[pos] == '!') { ++pos; continue; } if (text[pos] != '~') { // ~~ -> ~ isformat = !isformat; continue; } } if (!isformat) { int glyph = utf8 - 32; if (glyph < 0 || glyph >= this->Family->GlyphCount) { glyph = 0; } width += this->Family->CharWidth[glyph] + 1; } } return width; }
int CLabel::DoDrawText(int x, int y, const char *const text, const size_t len, const CFontColor *fc) const { int widths = 0; int utf8; bool tab; const int tabSize = 4; // FIXME: will be removed when text system will be rewritten size_t pos = 0; const CFontColor *backup = fc; bool isColor = false; font->DynamicLoad(); //Wyrmgus start // CGraphic *g = font->GetFontColorGraphic(*FontColor); CGraphic *g = font->GetFontColorGraphic(*fc); //Wyrmgus end while (GetUTF8(text, len, pos, utf8)) { tab = false; if (utf8 == '\t') { tab = true; } else if (utf8 == '~') { switch (text[pos]) { case '\0': // wrong formatted string. DebugPrint("oops, format your ~\n"); return widths; case '~': ++pos; break; case '|': ++pos; continue; case '!': if (fc != reverse) { fc = reverse; g = font->GetFontColorGraphic(*fc); } ++pos; continue; case '<': LastTextColor = fc; if (fc != reverse) { isColor = true; fc = reverse; g = font->GetFontColorGraphic(*fc); } ++pos; continue; case '>': if (fc != LastTextColor) { std::swap(fc, LastTextColor); isColor = false; g = font->GetFontColorGraphic(*fc); } ++pos; continue; default: { const char *p = text + pos; while (*p && *p != '~') { ++p; } if (!*p) { DebugPrint("oops, format your ~\n"); return widths; } std::string color; color.insert(0, text + pos, p - (text + pos)); pos = p - text + 1; LastTextColor = fc; const CFontColor *fc_tmp = CFontColor::Get(color); if (fc_tmp) { isColor = true; fc = fc_tmp; g = font->GetFontColorGraphic(*fc); } continue; } } } if (tab) { for (int tabs = 0; tabs < tabSize; ++tabs) { widths += font->DrawChar<CLIP>(*g, ' ', x + widths, y, *fc); } } else { widths += font->DrawChar<CLIP>(*g, utf8, x + widths, y, *fc); } if (isColor == false && fc != backup) { fc = backup; g = font->GetFontColorGraphic(*fc); } } return widths; }
/** ** Draw text with font at x,y clipped/unclipped. ** ** ~ is special prefix. ** ~~ is the ~ character self. ** ~! print next character reverse. ** ~< start reverse. ** ~> switch back to last used color. ** ** @param x X screen position ** @param y Y screen position ** @param font Font number ** @param text Text to be displayed. ** @param clip Flag to clip the text. ** ** @return The length of the printed text. */ static int DoDrawText(int x, int y, CFontFamily *fontFamily, bool isPlainText, const std::string &text, bool clip) { int w; int width; CFontColor *rev; char *color; const char *p; void (*DrawChar)(const CGraphic *, int, int, int, int, int, int); int ipr; int c; CGraphic *g; int utf8; size_t pos; if (clip) { DrawChar = VideoDrawCharClip; } else { DrawChar = VideoDrawChar; } if (!UseOpenGL) { g = fontFamily->G; } else { g = fontFamily->FontColorGraphic(FontColor); } rev = NULL; width = 0; pos = 0; while (GetUTF8(text, pos, utf8)) { if (utf8 == '~' && !isPlainText) { switch (text[pos]) { case '\0': // wrong formatted string. DebugPrint("oops, format your ~\n"); return width; case '~': ++pos; break; case '!': rev = FontColor; FontColor = ReverseTextColor; if (UseOpenGL) { g = fontFamily->FontColorGraphic(FontColor); } ++pos; continue; case '<': LastTextColor = FontColor; FontColor = ReverseTextColor; if (UseOpenGL) { g = fontFamily->FontColorGraphic(FontColor); } ++pos; continue; case '>': rev = LastTextColor; // swap last and current color LastTextColor = FontColor; FontColor = rev; if (UseOpenGL) { g = fontFamily->FontColorGraphic(FontColor); } ++pos; continue; default: p = text.c_str() + pos; while (*p && *p !='~') { ++p; } if (!*p) { DebugPrint("oops, format your ~\n"); return width; } color = new char[p - (text.c_str() + pos) + 1]; memcpy(color, text.c_str() + pos, p - (text.c_str() + pos)); color[p - (text.c_str() + pos)] = '\0'; pos = p - text.c_str() + 1; LastTextColor = FontColor; CFontColor *fc = CFontColor::Get(color); if (fc) { FontColor = fc; if (UseOpenGL) { g = fontFamily->FontColorGraphic(fc); } } delete[] color; continue; } } c = utf8 - 32; Assert(c >= 0); ipr = fontFamily->G->GraphicWidth / fontFamily->G->Width; if (c >= 0 && c < ipr * fontFamily->G->GraphicHeight / fontFamily->G->Height) { w = fontFamily->CharWidth[c]; DrawChar(g, (c % ipr) * fontFamily->G->Width, (c / ipr) * fontFamily->G->Height, w, fontFamily->G->Height, x + width, y); } else { w = fontFamily->CharWidth[0]; DrawChar(g, 0, 0, w, fontFamily->G->Height, x + width, y); } width += w + 1; if (rev) { FontColor = rev; if (UseOpenGL) { g = fontFamily->FontColorGraphic(FontColor); } rev = NULL; } } return width; }
int CLabel::DoDrawText(int x, int y, const char *const text, const size_t len, const CFontColor *fc) const { int widths = 0; std::string color; int utf8; size_t pos = 0; const CFontColor *backup = fc; bool isReverse = false; font->DynamicLoad(); CGraphic *g = font->GetFontColorGraphic(*FontColor); while (GetUTF8(text, len, pos, utf8)) { if (utf8 == '~') { switch (text[pos]) { case '\0': // wrong formatted string. DebugPrint("oops, format your ~\n"); return widths; case '~': ++pos; break; case '!': if (fc != reverse) { fc = reverse; g = font->GetFontColorGraphic(*fc); } ++pos; continue; case '<': LastTextColor = fc; if (fc != reverse) { isReverse = true; fc = reverse; g = font->GetFontColorGraphic(*fc); } ++pos; continue; case '>': if (fc != LastTextColor) { std::swap(fc, LastTextColor); isReverse = false; g = font->GetFontColorGraphic(*fc); } ++pos; continue; default: { const char *p = text + pos; while (*p && *p != '~') { ++p; } if (!*p) { DebugPrint("oops, format your ~\n"); return widths; } color.insert(0, text + pos, p - (text + pos)); color[p - (text + pos)] = '\0'; pos = p - text + 1; LastTextColor = fc; const CFontColor *fc_tmp = CFontColor::Get(color); if (fc_tmp) { fc = fc_tmp; g = font->GetFontColorGraphic(*fc); } continue; } } } widths += font->DrawChar<CLIP>(*g, utf8, x + widths, y, *fc); if (isReverse == false && fc != backup) { fc = backup; g = font->GetFontColorGraphic(*fc); } } return widths; }