diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index 8b8d63c79..6b8212c6e 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -77,7 +77,7 @@ namespace NLGUI class CStyleParams { public: - CStyleParams () : TextColor(255,255,255,255) + CStyleParams () : FontFamily(""), TextColor(255,255,255,255) { FontSize=10; FontWeight=400; @@ -92,6 +92,7 @@ namespace NLGUI uint FontSize; uint FontWeight; bool FontOblique; + std::string FontFamily; NLMISC::CRGBA TextColor; bool Underlined; bool StrikeThrough; @@ -508,6 +509,15 @@ namespace NLGUI return _GlobalColor.back(); } + // Current font name + std::vector _FontFamily; + inline const char* getFontFamily() const + { + if (_FontFamily.empty()) + return ""; + return _FontFamily.back().c_str(); + } + // Current font size std::vector _FontSize; inline uint getFontSize() const diff --git a/code/nel/include/nel/gui/view_renderer.h b/code/nel/include/nel/gui/view_renderer.h index a54708b04..3c643bf39 100644 --- a/code/nel/include/nel/gui/view_renderer.h +++ b/code/nel/include/nel/gui/view_renderer.h @@ -586,8 +586,12 @@ namespace NLGUI static NL3D::UDriver *driver; static NL3D::UTextContext *textcontext; + typedef CHashMap< std::string, NL3D::UTextContext* > TFontsList; + static TFontsList fonts; + public: - static NL3D::UTextContext* getTextContext(){ return textcontext; } + static NL3D::UTextContext* getTextContext(const std::string &name=""); + static bool registerFont(const std::string &name, const std::string &font); /// Set of hw cursor images static std::set< std::string > *hwCursors; diff --git a/code/nel/include/nel/gui/view_text.h b/code/nel/include/nel/gui/view_text.h index 95507ffe3..a00932667 100644 --- a/code/nel/include/nel/gui/view_text.h +++ b/code/nel/include/nel/gui/view_text.h @@ -80,6 +80,7 @@ namespace NLGUI /// Set void setText (const ucstring &text); + void setFontName (const std::string &name); void setFontSize (sint nFontSize); void setEmbolden (bool nEmbolden); void setOblique (bool nOblique); @@ -104,6 +105,7 @@ namespace NLGUI ucstring getText() const { return _Text; } sint getFontSize() const; + std::string getFontName() const { return _FontName; } bool getEmbolden() { return _Embolden; } bool getOblique() { return _Oblique; } NLMISC::CRGBA getColor() { return _Color; } @@ -227,6 +229,8 @@ namespace NLGUI uint _Index; /// info on the computed String associated to this text control NL3D::UTextContext::CStringInfo _Info; + /// Font name to get TextContext + std::string _FontName; /// the font size sint _FontSize; bool _Embolden; @@ -320,7 +324,7 @@ namespace NLGUI CFormatInfo Format; public: // build from a string, using the current text context - void build(const ucstring &text, uint numSpaces= 0); + void build(const ucstring &text, NL3D::UTextContext &textContext, uint numSpaces= 0); }; typedef std::vector TWordVect; @@ -331,9 +335,9 @@ namespace NLGUI // ctor CLine(); // Clear the line & remove text contexts - void clear(); + void clear(NL3D::UTextContext &textContext); // Add a new word (and its context) in the line + a number of spaces to append at the end of the line - void addWord(const ucstring &word, uint numSpaces, const CFormatInfo &wordFormat, uint fontWidth); + void addWord(const ucstring &word, uint numSpaces, const CFormatInfo &wordFormat, uint fontWidth, NL3D::UTextContext &textContext); void addWord(const CWord &word, uint fontWidth); uint getNumWords() const { return (uint)_Words.size(); } CWord &getWord(uint index) { return _Words[index]; } diff --git a/code/nel/include/nel/gui/widget_manager.h b/code/nel/include/nel/gui/widget_manager.h index cfb51af8e..2f9220cda 100644 --- a/code/nel/include/nel/gui/widget_manager.h +++ b/code/nel/include/nel/gui/widget_manager.h @@ -442,6 +442,7 @@ namespace NLGUI OptionTimeoutMessages, OptionTimeoutContext, OptionTimeoutContextHtml, + OptionMonospaceFont, NumSystemOptions }; diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 964610149..00f25ed19 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -1218,6 +1218,7 @@ namespace NLGUI registerAnchorName(MY_HTML_A); CStyleParams style; + style.FontFamily = getFontFamily(); style.FontSize = getFontSize(); style.TextColor = LinkColor; style.Underlined = true; @@ -1226,6 +1227,7 @@ namespace NLGUI if (present[HTML_A_STYLE] && value[HTML_A_STYLE]) getStyleParams(value[HTML_A_STYLE], style); + _FontFamily.push_back(style.FontFamily); _FontSize.push_back(style.FontSize); _TextColor.push_back(style.TextColor); _FontUnderlined.push_back(style.Underlined); @@ -1568,7 +1570,7 @@ namespace NLGUI if (present[MY_HTML_INPUT_ALT] && value[MY_HTML_INPUT_ALT]) tooltip = value[MY_HTML_INPUT_ALT]; - // by default not inherited + // by default not inherited, font family defaults to system font CStyleParams style; style.TextColor = TextColor; style.FontSize = TextFontSize; @@ -1579,6 +1581,7 @@ namespace NLGUI getStyleParams(value[MY_HTML_INPUT_STYLE], style); _TextColor.push_back(style.TextColor); + _FontFamily.push_back(style.FontFamily); _FontSize.push_back(style.FontSize); _FontWeight.push_back(style.FontWeight); _FontOblique.push_back(style.FontOblique); @@ -1794,6 +1797,7 @@ namespace NLGUI } } + popIfNotEmpty(_FontFamily); popIfNotEmpty(_FontSize); popIfNotEmpty(_TextColor); popIfNotEmpty(_FontWeight); @@ -1910,7 +1914,29 @@ namespace NLGUI newParagraph(PBeginSpace); break; case HTML_PRE: - _PRE.push_back(true); + { + CStyleParams style; + style.TextColor = getTextColor(); + style.FontFamily = "monospace"; + style.FontSize = getFontSize(); + style.FontWeight = getFontWeight(); + style.FontOblique = getFontOblique(); + style.Underlined = getFontUnderlined(); + style.StrikeThrough = getFontStrikeThrough(); + + if (present[MY_HTML_SPAN_STYLE] && value[MY_HTML_SPAN_STYLE]) + getStyleParams(value[MY_HTML_SPAN_STYLE], style); + + _TextColor.push_back(style.TextColor); + _FontFamily.push_back(style.FontFamily); + _FontSize.push_back(style.FontSize); + _FontWeight.push_back(style.FontWeight); + _FontOblique.push_back(style.FontOblique); + _FontUnderlined.push_back(style.Underlined); + _FontStrikeThrough.push_back(style.StrikeThrough); + + _PRE.push_back(true); + } break; case HTML_TABLE: { @@ -2039,7 +2065,7 @@ namespace NLGUI // Got one form ? if (!(_Forms.empty())) { - // not inherited by default + // not inherited by default, font family defaults to system font CStyleParams style; style.TextColor = TextColor; style.FontWeight = FONT_WEIGHT_NORMAL; @@ -2050,6 +2076,7 @@ namespace NLGUI getStyleParams(value[MY_HTML_TEXTAREA_STYLE], style); _TextColor.push_back(style.TextColor); + _FontFamily.push_back(style.FontFamily); _FontSize.push_back(style.FontSize); _FontWeight.push_back(style.FontWeight); _FontOblique.push_back(style.FontOblique); @@ -2136,6 +2163,7 @@ namespace NLGUI { CStyleParams style; style.TextColor = getTextColor(); + style.FontFamily = getFontFamily(); style.FontSize = getFontSize(); style.FontWeight = getFontWeight(); style.FontOblique = getFontOblique(); @@ -2146,6 +2174,7 @@ namespace NLGUI getStyleParams(value[MY_HTML_SPAN_STYLE], style); _TextColor.push_back(style.TextColor); + _FontFamily.push_back(style.FontFamily); _FontSize.push_back(style.FontSize); _FontWeight.push_back(style.FontWeight); _FontOblique.push_back(style.FontOblique); @@ -2300,6 +2329,7 @@ namespace NLGUI popIfNotEmpty (_FontSize); break; case HTML_A: + popIfNotEmpty (_FontFamily); popIfNotEmpty (_FontSize); popIfNotEmpty (_TextColor); popIfNotEmpty (_FontUnderlined); @@ -2325,6 +2355,13 @@ namespace NLGUI endParagraph(); break; case HTML_PRE: + popIfNotEmpty (_FontFamily); + popIfNotEmpty (_FontSize); + popIfNotEmpty (_FontWeight); + popIfNotEmpty (_FontOblique); + popIfNotEmpty (_TextColor); + popIfNotEmpty (_FontUnderlined); + popIfNotEmpty (_FontStrikeThrough); popIfNotEmpty (_PRE); break; case HTML_DIV: @@ -2371,6 +2408,7 @@ namespace NLGUI _Forms.back().Entries.push_back (entry); } + popIfNotEmpty (_FontFamily); popIfNotEmpty (_FontSize); popIfNotEmpty (_FontWeight); popIfNotEmpty (_FontOblique); @@ -2537,6 +2575,7 @@ namespace NLGUI } break; case HTML_SPAN: + popIfNotEmpty (_FontFamily); popIfNotEmpty (_FontSize); popIfNotEmpty (_FontWeight); popIfNotEmpty (_FontOblique); @@ -4008,6 +4047,7 @@ namespace NLGUI // Compatible with current parameters ? if (!skipLine && (getTextColor() == _CurrentViewLink->getColor()) && + (getFontFamily() == _CurrentViewLink->getFontName()) && (getFontSize() == (uint)_CurrentViewLink->getFontSize()) && (getFontUnderlined() == _CurrentViewLink->getUnderlined()) && (getFontStrikeThrough() == _CurrentViewLink->getStrikeThrough()) && @@ -4072,6 +4112,7 @@ namespace NLGUI } newLink->setText(tmpStr); newLink->setColor(getTextColor()); + newLink->setFontName(getFontFamily()); newLink->setFontSize(getFontSize()); newLink->setEmbolden(embolden); newLink->setOblique(getFontOblique()); @@ -5762,6 +5803,17 @@ namespace NLGUI style.FontOblique = true; } else + if (it->first == "font-family") + { + if (it->second == "inherit") + style.FontFamily = getFontFamily(); + else + if (it->second == "monospace") + style.FontFamily = "monospace"; + else + style.FontFamily = ""; + } + else if (it->first == "font-weight") { // https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight diff --git a/code/nel/src/gui/view_renderer.cpp b/code/nel/src/gui/view_renderer.cpp index 0b4d837f3..4c5d7c501 100644 --- a/code/nel/src/gui/view_renderer.cpp +++ b/code/nel/src/gui/view_renderer.cpp @@ -34,6 +34,7 @@ namespace NLGUI NL3D::UTextContext* CViewRenderer::textcontext = NULL; std::set< std::string >* CViewRenderer::hwCursors = NULL; float CViewRenderer::hwCursorScale = 1.0f; + CViewRenderer::TFontsList CViewRenderer::fonts; CViewRenderer::CViewRenderer() { @@ -214,17 +215,65 @@ namespace NLGUI ite++; } + TFontsList::iterator iteFonts = fonts.begin(); + while (iteFonts != fonts.end()) + { + driver->deleteTextContext(iteFonts->second); + ++iteFonts; + } + _GlobalTextures.clear(); _SImages.clear(); _SImageIterators.clear(); _TextureMap.clear(); _IndexesToTextureIds.clear(); + fonts.clear(); } NL3D::UDriver* CViewRenderer::getDriver(){ return driver; } + // *************************************************************************** + NL3D::UTextContext* CViewRenderer::getTextContext(const std::string &name) + { + if (name.size() > 0 && fonts.count(name) > 0) + return fonts[name]; + + return textcontext; + } + + // *************************************************************************** + bool CViewRenderer::registerFont(const std::string &name, const std::string &font) + { + nlassert(driver != NULL); + + // free existing font + if (fonts.count(name) > 0) + driver->deleteTextContext(fonts[name]); + + std::string fontFile = CPath::lookup(font, false); + if (fontFile.size() == 0) + { + nlwarning("Font file '%s' not found", font.c_str()); + return false; + } + + NL3D::UTextContext *context; + context = driver->createTextContext(fontFile); + if (context == NULL) + { + nlwarning("Cannot create a TextContext with font '%s'.", font.c_str()); + return false; + } + + context->setKeep800x600Ratio(false); + + fonts[name] = context; + + return true; + } + void CViewRenderer::setTextContext(NL3D::UTextContext *textcontext) { CViewRenderer::textcontext = textcontext; diff --git a/code/nel/src/gui/view_text.cpp b/code/nel/src/gui/view_text.cpp index 8c2ca96d3..c88dd8173 100644 --- a/code/nel/src/gui/view_text.cpp +++ b/code/nel/src/gui/view_text.cpp @@ -61,6 +61,7 @@ namespace NLGUI _FontSize = 12 + CWidgetManager::getInstance()->getSystemOption( CWidgetManager::OptionAddCoefFont ).getValSInt32(); + _FontName.clear(); _Embolden = false; _Oblique = false; _Color = CRGBA(255,255,255,255); @@ -134,7 +135,7 @@ namespace NLGUI CViewText::~CViewText() { if (_Index != 0xFFFFFFFF) - CViewRenderer::getTextContext()->erase (_Index); + CViewRenderer::getTextContext(_FontName)->erase (_Index); clearLines(); if (!_Setuped) @@ -148,7 +149,7 @@ namespace NLGUI CViewText &CViewText::operator=(const CViewText &vt) { if (_Index != 0xFFFFFFFF) - CViewRenderer::getTextContext()->erase (_Index); + CViewRenderer::getTextContext(_FontName)->erase (_Index); // Create database entries _Active = vt._Active; @@ -958,7 +959,7 @@ namespace NLGUI return; rVR.getScreenOOSize (oow, ooh); - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); // *** get current color @@ -983,8 +984,6 @@ namespace NLGUI { if (_Lines.size() == 0) return; - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); - TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); TextContext->setShadeOutline (_ShadowOutline); @@ -1260,6 +1259,24 @@ namespace NLGUI _FormatTags.clear(); } + // *************************************************************************** + void CViewText::setFontName(const std::string &name) + { + if (_FontName == name) + return; + + if (_FontName.length() > 0) + { + if (_Index != 0xFFFFFFFF) + CViewRenderer::getTextContext(_FontName)->erase (_Index); + clearLines(); + } + + _FontName = name; + computeFontSize (); + invalidateContent(); + } + // *************************************************************************** void CViewText::setFontSize (sint nFontSize) { @@ -1403,6 +1420,7 @@ namespace NLGUI // *************************************************************************** void CViewText::flushWordInLine(ucstring &ucCurrentWord, bool &linePushed, const CFormatInfo &wordFormat) { + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); // create a new line? if(!linePushed) { @@ -1410,7 +1428,7 @@ namespace NLGUI linePushed= true; } // Append to the last line - _Lines.back()->addWord(ucCurrentWord, 0, wordFormat, _FontWidth); + _Lines.back()->addWord(ucCurrentWord, 0, wordFormat, _FontWidth, *TextContext); // reset the word ucCurrentWord = ucstring(""); } @@ -1446,7 +1464,7 @@ namespace NLGUI rWidthCurrentLine= max(rWidthCurrentLine, (float)wordFormat.TabX*_FontWidth); } - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); // Parse the letter { @@ -1492,6 +1510,7 @@ namespace NLGUI // *************************************************************************** void CViewText::addDontClipWordLine(std::vector &currLine) { + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); // create a new line _Lines.push_back(TLineSPtr(new CLine)); @@ -1506,7 +1525,7 @@ namespace NLGUI if(currLine[i].Format!=lineWordFormat) { // add the current lineWord to the line. - _Lines.back()->addWord(lineWord, 0, lineWordFormat, _FontWidth); + _Lines.back()->addWord(lineWord, 0, lineWordFormat, _FontWidth, *TextContext); // get new lineWordFormat lineWordFormat= currLine[i].Format; // and clear @@ -1521,7 +1540,7 @@ namespace NLGUI } if(!lineWord.empty()) - _Lines.back()->addWord(lineWord, 0, lineWordFormat, _FontWidth); + _Lines.back()->addWord(lineWord, 0, lineWordFormat, _FontWidth, *TextContext); // clear currLine.clear(); @@ -1531,6 +1550,7 @@ namespace NLGUI // *************************************************************************** void CViewText::updateTextContextMultiLineJustified(uint nMaxWidth, bool expandSpaces) { + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); UTextContext::CStringInfo si; // TCharPos currPos = 0; @@ -1624,7 +1644,7 @@ namespace NLGUI // Get the word value. wordValue = _Text.substr(spaceEnd, wordEnd - spaceEnd); // compute width of word - si = CViewRenderer::getTextContext()->getStringInfo(wordValue); + si = TextContext->getStringInfo(wordValue); // compute size of spaces/Tab + word newLineWidth = lineWidth + numSpaces * _SpaceWidth; @@ -1681,7 +1701,7 @@ namespace NLGUI { uint maxNumSpaces = std::max(1U, (uint) (nMaxWidth / _SpaceWidth)); CWord spaceWord; // a word with only spaces in it - spaceWord.build (ucstring (""), maxNumSpaces); + spaceWord.build (ucstring (""), *TextContext, maxNumSpaces); spaceWord.Format= wordFormat; _Lines.push_back(TLineSPtr(new CLine)); _Lines.back()->addWord(spaceWord, _FontWidth); @@ -1703,14 +1723,14 @@ namespace NLGUI for(currChar = 0; currChar < wordValue.length(); ++currChar) { oneChar = wordValue[currChar]; - si = CViewRenderer::getTextContext()->getStringInfo(oneChar); + si = TextContext->getStringInfo(oneChar); if ((uint) (px + si.StringWidth) > nMaxWidth) break; px += si.StringWidth; } currChar = std::max((uint) 1, currChar); // must fit at least one character otherwise there's an infinite loop wordValue = _Text.substr(spaceEnd, currChar); CWord word; - word.build(wordValue, numSpaces); + word.build(wordValue, *TextContext, numSpaces); word.Format= wordFormat; _Lines.push_back(TLineSPtr(new CLine)); float roomForSpaces = (float) nMaxWidth - word.Info.StringWidth; @@ -1745,7 +1765,7 @@ namespace NLGUI if (!wordValue.empty() || numSpaces != 0) { CWord word; - word.build(wordValue, numSpaces); + word.build(wordValue, *TextContext, numSpaces); word.Format= wordFormat; // update line width _Lines.back()->addWord(word, _FontWidth); @@ -1822,7 +1842,7 @@ namespace NLGUI // *************************************************************************** void CViewText::updateTextContext () { - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); @@ -1856,13 +1876,13 @@ namespace NLGUI { while (_Lines.size() > _MultiMaxLine) { - _Lines.back()->clear(); + _Lines.back()->clear(*TextContext); _Lines.pop_back(); } _Lines.pop_back(); CViewText::CLine *endLine = new CViewText::CLine; CViewText::CWord w; - w.build(string("...")); + w.build(string("..."), *TextContext); endLine->addWord(w, _FontWidth); _Lines.push_back(TLineSPtr(endLine)); } @@ -2150,7 +2170,7 @@ namespace NLGUI void CViewText::getCharacterPositionFromIndex(sint index, bool cursorAtPreviousLineEnd, sint &x, sint &y, sint &height) const { NLMISC::clamp(index, 0, (sint) _Text.length()); - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); TextContext->setShadeOutline (_ShadowOutline); @@ -2257,7 +2277,7 @@ namespace NLGUI // *************************************************************************** // Tool fct : From a word and a x coordinate, give the matching character index - static uint getCharacterIndex(const ucstring &textValue, float x) + static uint getCharacterIndex(const ucstring &textValue, float x, NL3D::UTextContext &textContext) { float px = 0.f; UTextContext::CStringInfo si; @@ -2267,7 +2287,7 @@ namespace NLGUI { // get character width singleChar[0] = textValue[i]; - si = CViewRenderer::getTextContext()->getStringInfo(singleChar); + si = textContext.getStringInfo(singleChar); px += si.StringWidth; // the character is at the i - 1 position if (px > x) @@ -2284,7 +2304,7 @@ namespace NLGUI // *************************************************************************** void CViewText::getCharacterIndexFromPosition(sint x, sint y, uint &index, bool &cursorAtPreviousLineEnd) const { - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); // setup the text context TextContext->setHotSpot (UTextContext::BottomLeft); @@ -2365,7 +2385,7 @@ namespace NLGUI else { // the coord is in the word itself - index = charPos + currWord.NumSpaces + getCharacterIndex(currWord.Text, (float) x - (px + spacesWidth)); + index = charPos + currWord.NumSpaces + getCharacterIndex(currWord.Text, (float) x - (px + spacesWidth), *TextContext); cursorAtPreviousLineEnd = false; return; } @@ -2390,7 +2410,7 @@ namespace NLGUI index = 0; return; } - index = getCharacterIndex(_Text, (float) x); + index = getCharacterIndex(_Text, (float) x, *TextContext); return; } } @@ -2428,15 +2448,16 @@ namespace NLGUI quadSize--; } // select what quad to skip - CViewRenderer::getTextContext()->setStringSelection(stringId, quadStart, quadSize); + CViewRenderer::getTextContext(_FontName)->setStringSelection(stringId, quadStart, quadSize); } // *************************************************************************** void CViewText::clearLines() { + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); for(uint k = 0; k < _Lines.size(); ++k) { - _Lines[k]->clear(); + _Lines[k]->clear(*TextContext); } _Lines.clear(); } @@ -2490,10 +2511,10 @@ namespace NLGUI } // *************************************************************************** - void CViewText::CLine::addWord(const ucstring &text, uint numSpaces, const CFormatInfo &wordFormat, uint fontWidth) + void CViewText::CLine::addWord(const ucstring &text, uint numSpaces, const CFormatInfo &wordFormat, uint fontWidth, NL3D::UTextContext &textContext) { CWord word; - word.build(text, numSpaces); + word.build(text, textContext, numSpaces); word.Format= wordFormat; addWord(word, fontWidth); } @@ -2515,12 +2536,12 @@ namespace NLGUI } // *************************************************************************** - void CViewText::CLine::clear() + void CViewText::CLine::clear(NL3D::UTextContext &textContext) { for(uint k = 0; k < _Words.size(); ++k) { if (_Words[k].Index != 0xffffffff) - CViewRenderer::getTextContext()->erase(_Words[k].Index); + textContext.erase(_Words[k].Index); } _Words.clear(); _NumChars = 0; @@ -2537,13 +2558,12 @@ namespace NLGUI } // *************************************************************************** - void CViewText::CWord::build(const ucstring &text, uint numSpaces/*=0*/) + void CViewText::CWord::build(const ucstring &text, NL3D::UTextContext &textContext, uint numSpaces) { Text = text; NumSpaces = numSpaces; - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); - Index = TextContext->textPush(text); - Info = TextContext->getStringInfo(Index); + Index = textContext.textPush(text); + Info = textContext.getStringInfo(Index); } // *************************************************************************** @@ -2564,7 +2584,7 @@ namespace NLGUI static const ucstring lineFeedStr("\n"); float maxWidth = 0; - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); TextContext->setShadeOutline (_ShadowOutline); @@ -2651,7 +2671,7 @@ namespace NLGUI // If we can't clip the words, return the size of the largest word else if ((_TextMode == DontClipWord) || (_TextMode == Justified)) { - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); TextContext->setShadeOutline (_ShadowOutline); @@ -2709,7 +2729,7 @@ namespace NLGUI // *************************************************************************** void CViewText::computeFontSize () { - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); TextContext->setHotSpot (UTextContext::BottomLeft); TextContext->setShaded (_Shadow); TextContext->setShadeOutline (_ShadowOutline); @@ -2727,6 +2747,13 @@ namespace NLGUI // for now we can't know that directly from UTextContext UTextContext::CStringInfo si = TextContext->getStringInfo(chars); + + // font generator changes unknown glyphs to dot '.'. use fallback if it looks odd + if (_FontSize > (si.StringHeight + si.StringLine)) + { + chars.fromUtf8("|"); + si = TextContext->getStringInfo(chars); + } // add a padding of 1 pixel else the top will be truncated _FontHeight = (uint) si.StringHeight+1; _FontLegHeight = (uint) si.StringLine; @@ -3081,7 +3108,7 @@ namespace NLGUI } // convert in ULetterColors - NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(); + NL3D::UTextContext *TextContext = CViewRenderer::getTextContext(_FontName); ULetterColors * letterColors = TextContext->createLetterColors(); for(uint i=0; igetValue("messages_timeout"); _SystemOptions[OptionTimeoutContext]= opt->getValue("context_timeout"); _SystemOptions[OptionTimeoutContextHtml]= opt->getValue("context_html_timeout"); + _SystemOptions[OptionMonospaceFont]= opt->getValue("monospace_font"); } } diff --git a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml index 5d5e9143b..b74fa9e8b 100644 --- a/code/ryzom/client/data/gamedev/interfaces_v3/config.xml +++ b/code/ryzom/client/data/gamedev/interfaces_v3/config.xml @@ -1916,6 +1916,8 @@ This MUST follow the Enum MISSION_DESC::TIconId value="basic.ttf" /> --> + --> + --> + --> + getSystemOption (CWidgetManager::OptionMonospaceFont).getValStr(); + if ((!sFont.empty()) && (Driver != NULL)) + CViewRenderer::registerFont("monospace", sFont); } // ------------------------------------------------------------------------------------------------