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);
}
// ------------------------------------------------------------------------------------------------