diff options
| author | Kitty Barnett <develop@catznip.com> | 2019-11-06 12:34:26 +0100 | 
|---|---|---|
| committer | Kitty Barnett <develop@catznip.com> | 2019-11-06 12:34:26 +0100 | 
| commit | 418308bc7ce4e9924d6280f784222ba45172eea4 (patch) | |
| tree | 32480168a0fa174ba506a53f056f97e5e12a3f47 /indra | |
| parent | 9cfdb278de30e4a22d5d38fd08305fd40a905d80 (diff) | |
Characters can have more than one representation in LLFontFreetype
  * By default all viewer text will use B/W glyphs
  * Added temporary use_color attribute to LLTextBase for testing
Diffstat (limited to 'indra')
| -rw-r--r-- | indra/llrender/llfontbitmapcache.h | 3 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.cpp | 90 | ||||
| -rw-r--r-- | indra/llrender/llfontfreetype.h | 14 | ||||
| -rw-r--r-- | indra/llrender/llfontgl.cpp | 45 | ||||
| -rw-r--r-- | indra/llrender/llfontgl.h | 11 | ||||
| -rw-r--r-- | indra/llui/llfolderviewitem.cpp | 6 | ||||
| -rw-r--r-- | indra/llui/lltextbase.cpp | 11 | ||||
| -rw-r--r-- | indra/llui/lltextbase.h | 3 | ||||
| -rw-r--r-- | indra/llui/llview.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llexpandabletextbox.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llfloateruipreview.cpp | 8 | ||||
| -rw-r--r-- | indra/newview/lltextureview.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llviewerwindow.cpp | 2 | ||||
| -rw-r--r-- | indra/newview/llworldmapview.cpp | 3 | 
14 files changed, 126 insertions, 76 deletions
| diff --git a/indra/llrender/llfontbitmapcache.h b/indra/llrender/llfontbitmapcache.h index f68af0d2b6..5d0094fd69 100644 --- a/indra/llrender/llfontbitmapcache.h +++ b/indra/llrender/llfontbitmapcache.h @@ -34,7 +34,8 @@ enum class EFontGlyphType : U32  {  	Grayscale = 0,  	Color, -	Count +	Count, +	Unspecified,  };  // Maintain a collection of bitmaps containing rendered glyphs. diff --git a/indra/llrender/llfontfreetype.cpp b/indra/llrender/llfontfreetype.cpp index 57154feeec..7d66965e57 100644 --- a/indra/llrender/llfontfreetype.cpp +++ b/indra/llrender/llfontfreetype.cpp @@ -91,8 +91,9 @@ LLFontManager::~LLFontManager()  } -LLFontGlyphInfo::LLFontGlyphInfo(U32 index) +LLFontGlyphInfo::LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type)  :	mGlyphIndex(index), +	mGlyphType(glyph_type),  	mWidth(0),			// In pixels  	mHeight(0),			// In pixels  	mXAdvance(0.f),		// In pixels @@ -101,11 +102,25 @@ LLFontGlyphInfo::LLFontGlyphInfo(U32 index)  	mYBitmapOffset(0), 	// Offset to the origin in the bitmap  	mXBearing(0),		// Distance from baseline to left in pixels  	mYBearing(0),		// Distance from baseline to top in pixels -	mBitmapType(EFontGlyphType::Grayscale), -	mBitmapNum(0) // Which bitmap in the bitmap cache contains this glyph +	mBitmapEntry(std::make_pair(EFontGlyphType::Unspecified, -1)) // Which bitmap in the bitmap cache contains this glyph  {  } +LLFontGlyphInfo::LLFontGlyphInfo(const LLFontGlyphInfo& fgi) +	: mGlyphIndex(fgi.mGlyphIndex) +	, mGlyphType(fgi.mGlyphType) +	, mWidth(fgi.mWidth) +	, mHeight(fgi.mHeight) +	, mXAdvance(fgi.mXAdvance) +	, mYAdvance(fgi.mYAdvance) +	, mXBitmapOffset(fgi.mXBitmapOffset) +	, mYBitmapOffset(fgi.mYBitmapOffset) +	, mXBearing(fgi.mXBearing) +	, mYBearing(fgi.mYBearing) +{ +	mBitmapEntry = fgi.mBitmapEntry; +} +  LLFontFreetype::LLFontFreetype()  :	LLTrace::MemTrackable<LLFontFreetype>("LLFontFreetype"),  	mFontBitmapCachep(new LLFontBitmapCache), @@ -361,7 +376,7 @@ F32 LLFontFreetype::getXAdvance(llwchar wch) const  		return 0.0;  	// Return existing info only if it is current -	LLFontGlyphInfo* gi = getGlyphInfo(wch); +	LLFontGlyphInfo* gi = getGlyphInfo(wch, EFontGlyphType::Unspecified);  	if (gi)  	{  		return gi->mXAdvance; @@ -393,10 +408,10 @@ F32 LLFontFreetype::getXKerning(llwchar char_left, llwchar char_right) const  		return 0.0;  	//llassert(!mIsFallback); -	LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left);; +	LLFontGlyphInfo* left_glyph_info = getGlyphInfo(char_left, EFontGlyphType::Unspecified);;  	U32 left_glyph = left_glyph_info ? left_glyph_info->mGlyphIndex : 0;  	// Kern this puppy. -	LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right); +	LLFontGlyphInfo* right_glyph_info = getGlyphInfo(char_right, EFontGlyphType::Unspecified);  	U32 right_glyph = right_glyph_info ? right_glyph_info->mGlyphIndex : 0;  	FT_Vector  delta; @@ -427,12 +442,13 @@ BOOL LLFontFreetype::hasGlyph(llwchar wch) const  	return(mCharGlyphInfoMap.find(wch) != mCharGlyphInfoMap.end());  } -LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const +LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch, EFontGlyphType glyph_type) const  {  	if (mFTFace == NULL)  		return FALSE;  	llassert(!mIsFallback); +	llassert(glyph_type < EFontGlyphType::Count);  	//LL_DEBUGS() << "Adding new glyph for " << wch << " to font" << LL_ENDL;  	FT_UInt glyph_index; @@ -448,34 +464,38 @@ LLFontGlyphInfo* LLFontFreetype::addGlyph(llwchar wch) const  			glyph_index = FT_Get_Char_Index((*iter)->mFTFace, wch);  			if (glyph_index)  			{ -				return addGlyphFromFont(*iter, wch, glyph_index, EFontGlyphType::Color); +				return addGlyphFromFont(*iter, wch, glyph_index, glyph_type);  			}  		}  	} -	char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); -	if (iter == mCharGlyphInfoMap.end()) +	std::pair<char_glyph_info_map_t::iterator, char_glyph_info_map_t::iterator> range_it = mCharGlyphInfoMap.equal_range(wch); +	char_glyph_info_map_t::iterator iter =  +		std::find_if(range_it.first, range_it.second, [&glyph_type](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == glyph_type; }); +	if (iter == range_it.second)  	{ -		return addGlyphFromFont(this, wch, glyph_index, EFontGlyphType::Color); +		return addGlyphFromFont(this, wch, glyph_index, glyph_type);  	}  	return NULL;  } -LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const +LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType requested_glyph_type) const  {  	if (mFTFace == NULL)  		return NULL;  	llassert(!mIsFallback); -	fontp->renderGlyph(bitmap_type, glyph_index); +	fontp->renderGlyph(requested_glyph_type, glyph_index); + +	EFontGlyphType bitmap_glyph_type = EFontGlyphType::Unspecified;  	switch (fontp->mFTFace->glyph->bitmap.pixel_mode)  	{  		case FT_PIXEL_MODE_MONO:  		case FT_PIXEL_MODE_GRAY: -			bitmap_type = EFontGlyphType::Grayscale; +			bitmap_glyph_type = EFontGlyphType::Grayscale;  			break;  		case FT_PIXEL_MODE_BGRA: -			bitmap_type = EFontGlyphType::Color; +			bitmap_glyph_type = EFontGlyphType::Color;  			break;  		default:  			llassert_always(true); @@ -486,14 +506,13 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l  	S32 pos_x, pos_y;  	U32 bitmap_num; -	mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_type, bitmap_num); +	mFontBitmapCachep->nextOpenPos(width, pos_x, pos_y, bitmap_glyph_type, bitmap_num);  	mAddGlyphCount++; -	LLFontGlyphInfo* gi = new LLFontGlyphInfo(glyph_index); +	LLFontGlyphInfo* gi = new LLFontGlyphInfo(glyph_index, requested_glyph_type);  	gi->mXBitmapOffset = pos_x;  	gi->mYBitmapOffset = pos_y; -	gi->mBitmapType = bitmap_type; -	gi->mBitmapNum = bitmap_num; +	gi->mBitmapEntry = std::make_pair(bitmap_glyph_type, bitmap_num);  	gi->mWidth = width;  	gi->mHeight = height;  	gi->mXBearing = fontp->mFTFace->glyph->bitmap_left; @@ -504,6 +523,13 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l  	insertGlyphInfo(wch, gi); +	if (requested_glyph_type != bitmap_glyph_type) +	{ +		LLFontGlyphInfo* gi_temp = new LLFontGlyphInfo(*gi); +		gi_temp->mGlyphType = bitmap_glyph_type; +		insertGlyphInfo(wch, gi_temp); +	} +  	if (fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_MONO  	    || fontp->mFTFace->glyph->bitmap.pixel_mode == FT_PIXEL_MODE_GRAY)  	{ @@ -561,31 +587,39 @@ LLFontGlyphInfo* LLFontFreetype::addGlyphFromFont(const LLFontFreetype *fontp, l  		llassert(false);  	} -	LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_type, bitmap_num); -	LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_type, bitmap_num); +	LLImageGL *image_gl = mFontBitmapCachep->getImageGL(bitmap_glyph_type, bitmap_num); +	LLImageRaw *image_raw = mFontBitmapCachep->getImageRaw(bitmap_glyph_type, bitmap_num);  	image_gl->setSubImage(image_raw, 0, 0, image_gl->getWidth(), image_gl->getHeight());  	return gi;  } -LLFontGlyphInfo* LLFontFreetype::getGlyphInfo(llwchar wch) const +LLFontGlyphInfo* LLFontFreetype::getGlyphInfo(llwchar wch, EFontGlyphType glyph_type) const  { -	char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); -	if (iter != mCharGlyphInfoMap.end()) +	std::pair<char_glyph_info_map_t::iterator, char_glyph_info_map_t::iterator> range_it = mCharGlyphInfoMap.equal_range(wch); + +	char_glyph_info_map_t::iterator iter = (EFontGlyphType::Unspecified != glyph_type) +		? std::find_if(range_it.first, range_it.second, [&glyph_type](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == glyph_type; }) +		: range_it.first; +	if (iter != range_it.second)  	{  		return iter->second;  	}  	else  	{  		// this glyph doesn't yet exist, so render it and return the result -		return addGlyph(wch); +		return addGlyph(wch, (EFontGlyphType::Unspecified != glyph_type) ? glyph_type : EFontGlyphType::Grayscale);  	}  }  void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const  { -	char_glyph_info_map_t::iterator iter = mCharGlyphInfoMap.find(wch); -	if (iter != mCharGlyphInfoMap.end()) +	llassert(gi->mGlyphType < EFontGlyphType::Count); +	std::pair<char_glyph_info_map_t::iterator, char_glyph_info_map_t::iterator> range_it = mCharGlyphInfoMap.equal_range(wch); + +	char_glyph_info_map_t::iterator iter = +		std::find_if(range_it.first, range_it.second, [&gi](const char_glyph_info_map_t::value_type& entry) { return entry.second->mGlyphType == gi->mGlyphType; }); +	if (iter != range_it.second)  	{  		delete iter->second;  		iter->second = gi; @@ -593,7 +627,7 @@ void LLFontFreetype::insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const  	else  	{  		claimMem(gi); -		mCharGlyphInfoMap[wch] = gi; +		mCharGlyphInfoMap.insert(std::make_pair(wch, gi));  	}  } diff --git a/indra/llrender/llfontfreetype.h b/indra/llrender/llfontfreetype.h index 7b7b3faaf0..8c2d2bc491 100644 --- a/indra/llrender/llfontfreetype.h +++ b/indra/llrender/llfontfreetype.h @@ -56,9 +56,11 @@ private:  struct LLFontGlyphInfo  { -	LLFontGlyphInfo(U32 index); +	LLFontGlyphInfo(U32 index, EFontGlyphType glyph_type); +	LLFontGlyphInfo(const LLFontGlyphInfo& fgi);  	U32 mGlyphIndex; +	EFontGlyphType mGlyphType;  	// Metrics  	S32 mWidth;			// In pixels @@ -71,8 +73,7 @@ struct LLFontGlyphInfo  	S32 mYBitmapOffset; // Offset to the origin in the bitmap  	S32 mXBearing;	// Distance from baseline to left in pixels  	S32 mYBearing;	// Distance from baseline to top in pixels -	EFontGlyphType mBitmapType; // Specifies the bitmap type in the bitmap cache -	S32 mBitmapNum; // Which bitmap in the bitmap cache contains this glyph +	std::pair<EFontGlyphType, S32> mBitmapEntry; // Which bitmap in the bitmap cache contains this glyph  };  extern LLFontManager *gFontManagerp; @@ -136,7 +137,7 @@ public:  	F32 getXKerning(llwchar char_left, llwchar char_right) const; // Get the kerning between the two characters  	F32 getXKerning(const LLFontGlyphInfo* left_glyph_info, const LLFontGlyphInfo* right_glyph_info) const; // Get the kerning between the two characters -	LLFontGlyphInfo* getGlyphInfo(llwchar wch) const; +	LLFontGlyphInfo* getGlyphInfo(llwchar wch, EFontGlyphType glyph_type) const;  	void reset(F32 vert_dpi, F32 horz_dpi); @@ -155,7 +156,7 @@ private:  	void setSubImageLuminanceAlpha(U32 x, U32 y, U32 bitmap_num, U32 width, U32 height, U8 *data, S32 stride = 0) const;  	bool setSubImageBGRA(U32 x, U32 y, U32 bitmap_num, U16 width, U16 height, const U8* data, U32 stride) const;  	BOOL hasGlyph(llwchar wch) const;		// Has a glyph for this character -	LLFontGlyphInfo* addGlyph(llwchar wch) const;		// Add a new character to the font if necessary +	LLFontGlyphInfo* addGlyph(llwchar wch, EFontGlyphType glyph_type) const;		// Add a new character to the font if necessary  	LLFontGlyphInfo* addGlyphFromFont(const LLFontFreetype *fontp, llwchar wch, U32 glyph_index, EFontGlyphType bitmap_type) const;	// Add a glyph from this font to the other (returns the glyph_index, 0 if not found)  	void renderGlyph(EFontGlyphType bitmap_type, U32 glyph_index) const;  	void insertGlyphInfo(llwchar wch, LLFontGlyphInfo* gi) const; @@ -179,7 +180,8 @@ private:  	BOOL mIsFallback;  	font_vector_t mFallbackFonts; // A list of fallback fonts to look for glyphs in (for Unicode chars) -	typedef boost::unordered_map<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t; +	// *NOTE: the same glyph can be present with multiple representations (but the pointer is always unique) +	typedef boost::unordered_multimap<llwchar, LLFontGlyphInfo*> char_glyph_info_map_t;  	mutable char_glyph_info_map_t mCharGlyphInfoMap; // Information about glyph location in bitmap  	mutable LLFontBitmapCache* mFontBitmapCachep; diff --git a/indra/llrender/llfontgl.cpp b/indra/llrender/llfontgl.cpp index 6fee34d3eb..78017ecb3d 100644 --- a/indra/llrender/llfontgl.cpp +++ b/indra/llrender/llfontgl.cpp @@ -112,14 +112,14 @@ S32 LLFontGL::getNumFaces(const std::string& filename)  static LLTrace::BlockTimerStatHandle FTM_RENDER_FONTS("Fonts");  S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRect& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, -    ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const +    ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses, BOOL use_color) const  {      LLRectf rect_float(rect.mLeft, rect.mTop, rect.mRight, rect.mBottom); -    return render(wstr, begin_offset, rect_float, color, halign, valign, style, shadow, max_chars, right_x, use_ellipses); +    return render(wstr, begin_offset, rect_float, color, halign, valign, style, shadow, max_chars, right_x, use_ellipses, use_color);  }  S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rect, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,  -					 ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses) const +					 ShadowType shadow, S32 max_chars, F32* right_x, BOOL use_ellipses, BOOL use_color) const  {  	F32 x = rect.mLeft;  	F32 y = 0.f; @@ -140,12 +140,12 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, const LLRectf& rec  		y = rect.mBottom;  		break;  	} -	return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses); +	return render(wstr, begin_offset, x, y, color, halign, valign, style, shadow, max_chars, rect.getWidth(), right_x, use_ellipses, use_color);  }  S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style,  -					 ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses) const +					 ShadowType shadow, S32 max_chars, S32 max_pixels, F32* right_x, BOOL use_ellipses, BOOL use_color) const  {  	LL_RECORD_BLOCK_TIME(FTM_RENDER_FONTS); @@ -290,7 +290,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		next_glyph = NULL;  		if(!fgi)  		{ -			fgi = mFontFreetype->getGlyphInfo(wch); +			fgi = mFontFreetype->getGlyphInfo(wch, (!use_color) ? EFontGlyphType::Grayscale : EFontGlyphType::Color);  		}  		if (!fgi)  		{ @@ -298,7 +298,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  			break;  		}  		// Per-glyph bitmap texture. -		std::pair<EFontGlyphType, S32> next_bitmap_entry = std::make_pair(fgi->mBitmapType, fgi->mBitmapNum); +		std::pair<EFontGlyphType, S32> next_bitmap_entry = fgi->mBitmapEntry;  		if (next_bitmap_entry != bitmap_entry)  		{  			// Actually draw the queued glyphs before switching their texture; @@ -314,7 +314,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  			}  			bitmap_entry = next_bitmap_entry; -			LLImageGL* font_image = font_bitmap_cache->getImageGL(fgi->mBitmapType, bitmap_entry.second); +			LLImageGL* font_image = font_bitmap_cache->getImageGL(bitmap_entry.first, bitmap_entry.second);  			gGL.getTexUnit(0)->bind(font_image);  		} @@ -347,7 +347,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  			glyph_count = 0;  		} -		drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, (fgi->mBitmapType == EFontGlyphType::Grayscale) ? text_color : LLColor4U::white, style_to_add, shadow, drop_shadow_strength); +		drawGlyph(glyph_count, vertices, uvs, colors, screen_rect, uv_rect, (bitmap_entry.first == EFontGlyphType::Grayscale) ? text_color : LLColor4U::white, style_to_add, shadow, drop_shadow_strength);  		chars_drawn++;  		cur_x += fgi->mXAdvance; @@ -357,7 +357,7 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  		if (next_char && (next_char < LAST_CHARACTER))  		{  			// Kern this puppy. -			next_glyph = mFontFreetype->getGlyphInfo(next_char); +			next_glyph = mFontFreetype->getGlyphInfo(next_char, (!use_color) ? EFontGlyphType::Grayscale : EFontGlyphType::Color);  			cur_x += mFontFreetype->getXKerning(fgi, next_glyph);  		} @@ -411,7 +411,8 @@ S32 LLFontGL::render(const LLWString &wstr, S32 begin_offset, F32 x, F32 y, cons  				shadow,  				S32_MAX, max_pixels,  				right_x, -				FALSE);  +				FALSE, +				use_color);   		gGL.popUIMatrix();  	} @@ -425,19 +426,19 @@ S32 LLFontGL::render(const LLWString &text, S32 begin_offset, F32 x, F32 y, cons  	return render(text, begin_offset, x, y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE);  } -S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign,  VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels,  F32* right_x, BOOL use_ellipses) const +S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign,  VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels,  F32* right_x, BOOL use_ellipses, BOOL use_color) const  { -	return render(utf8str_to_wstring(text), begin_offset, x, y, color, halign, valign, style, shadow, max_chars, max_pixels, right_x, use_ellipses); +	return render(utf8str_to_wstring(text), begin_offset, x, y, color, halign, valign, style, shadow, max_chars, max_pixels, right_x, use_ellipses, use_color);  }  S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const  { -	return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +	return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, LEFT, BASELINE, NORMAL, NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE, FALSE);  }  S32 LLFontGL::renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style, ShadowType shadow) const  { -	return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow, S32_MAX, S32_MAX, NULL, FALSE); +	return renderUTF8(text, begin_offset, (F32)x, (F32)y, color, halign, valign, style, shadow, S32_MAX, S32_MAX, NULL, FALSE, FALSE);  }  // font metrics - override for LLFontFreetype that returns units of virtual pixels @@ -514,7 +515,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars  		next_glyph = NULL;  		if(!fgi)  		{ -			fgi = mFontFreetype->getGlyphInfo(wch); +			fgi = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified);  		}  		F32 advance = mFontFreetype->getXAdvance(fgi); @@ -534,7 +535,7 @@ F32 LLFontGL::getWidthF32(const llwchar* wchars, S32 begin_offset, S32 max_chars  			&& (next_char < LAST_CHARACTER))  		{  			// Kern this puppy. -			next_glyph = mFontFreetype->getGlyphInfo(next_char); +			next_glyph = mFontFreetype->getGlyphInfo(next_char, EFontGlyphType::Unspecified);  			cur_x += mFontFreetype->getXKerning(fgi, next_glyph);  		}  		// Round after kerning. @@ -616,7 +617,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch  		next_glyph = NULL;  		if(!fgi)  		{ -			fgi = mFontFreetype->getGlyphInfo(wch); +			fgi = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified);  			if (NULL == fgi)  			{ @@ -641,7 +642,7 @@ S32 LLFontGL::maxDrawableChars(const llwchar* wchars, F32 max_pixels, S32 max_ch  		if (((i+1) < max_chars) && wchars[i+1])  		{  			// Kern this puppy. -			next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1]); +			next_glyph = mFontFreetype->getGlyphInfo(wchars[i+1], EFontGlyphType::Unspecified);  			cur_x += mFontFreetype->getXKerning(fgi, next_glyph);  		} @@ -688,7 +689,7 @@ S32	LLFontGL::firstDrawableChar(const llwchar* wchars, F32 max_pixels, S32 text_  	{  		llwchar wch = wchars[i]; -		const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch); +		const LLFontGlyphInfo* fgi= mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified);  		// last character uses character width, since the whole character needs to be visible  		// other characters just use advance @@ -763,7 +764,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t  		next_glyph = NULL;  		if(!glyph)  		{ -			glyph = mFontFreetype->getGlyphInfo(wch); +			glyph = mFontFreetype->getGlyphInfo(wch, EFontGlyphType::Unspecified);  		}  		F32 char_width = mFontFreetype->getXAdvance(glyph); @@ -793,7 +794,7 @@ S32 LLFontGL::charFromPixelOffset(const llwchar* wchars, S32 begin_offset, F32 t  			&& (wchars[(pos + 1)]))  		{  			// Kern this puppy. -			next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1]); +			next_glyph = mFontFreetype->getGlyphInfo(wchars[pos + 1], EFontGlyphType::Unspecified);  			cur_x += mFontFreetype->getXKerning(glyph, next_glyph);  		} diff --git a/indra/llrender/llfontgl.h b/indra/llrender/llfontgl.h index 5028ccc770..68bf5db668 100644 --- a/indra/llrender/llfontgl.h +++ b/indra/llrender/llfontgl.h @@ -98,7 +98,8 @@ public:  				U8 style = NORMAL, ShadowType shadow = NO_SHADOW,   				S32 max_chars = S32_MAX,  				F32* right_x=NULL,  -				BOOL use_ellipses = FALSE) const; +				BOOL use_ellipses = FALSE, +				BOOL use_color = FALSE) const;  	S32 render(const LLWString &text, S32 begin_offset,   				const LLRectf& rect,  @@ -107,7 +108,8 @@ public:  				U8 style = NORMAL, ShadowType shadow = NO_SHADOW,   				S32 max_chars = S32_MAX,  				F32* right_x=NULL,  -				BOOL use_ellipses = FALSE) const; +				BOOL use_ellipses = FALSE, +				BOOL use_color = FALSE) const;  	S32 render(const LLWString &text, S32 begin_offset,   				F32 x, F32 y,  @@ -116,12 +118,13 @@ public:  				U8 style = NORMAL, ShadowType shadow = NO_SHADOW,   				S32 max_chars = S32_MAX, S32 max_pixels = S32_MAX,   				F32* right_x=NULL,  -				BOOL use_ellipses = FALSE) const; +				BOOL use_ellipses = FALSE, +				BOOL use_color = FALSE) const;  	S32 render(const LLWString &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color) const;  	// renderUTF8 does a conversion, so is slower! -	S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign,  VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels,  F32* right_x, BOOL use_ellipses) const; +	S32 renderUTF8(const std::string &text, S32 begin_offset, F32 x, F32 y, const LLColor4 &color, HAlign halign,  VAlign valign, U8 style, ShadowType shadow, S32 max_chars, S32 max_pixels,  F32* right_x, BOOL use_ellipses, BOOL use_color) const;  	S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color) const;  	S32 renderUTF8(const std::string &text, S32 begin_offset, S32 x, S32 y, const LLColor4 &color, HAlign halign, VAlign valign, U8 style = NORMAL, ShadowType shadow = NO_SHADOW) const; diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 0510e472c5..0c1c3c40ec 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -826,7 +826,7 @@ void LLFolderViewItem::drawLabel(const LLFontGL * font, const F32 x, const F32 y      //      font->renderUTF8(mLabel, 0, x, y, color,          LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -        S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, TRUE); +        S32_MAX, getRect().getWidth() - (S32) x - mLabelPaddingRight, &right_x, /*use_ellipses*/TRUE, /*use_color*/FALSE);  }  void LLFolderViewItem::draw() @@ -905,7 +905,7 @@ void LLFolderViewItem::draw()  	{  		font->renderUTF8( mLabelSuffix, 0, right_x, y, isFadeItem() ? color : (LLColor4)sSuffixColor,  						  LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -						  S32_MAX, S32_MAX, &right_x, FALSE ); +						  S32_MAX, S32_MAX, &right_x, /*use_ellipses*/FALSE, /*use_color*/FALSE );  	}  	//--------------------------------------------------------------------------------// @@ -917,7 +917,7 @@ void LLFolderViewItem::draw()          F32 yy = (F32)getRect().getHeight() - font->getLineHeight() - (F32)mTextPad - (F32)TOP_PAD;          font->renderUTF8( combined_string, mViewModelItem->getFilterStringOffset(), match_string_left, yy,              sFilterTextColor, LLFontGL::LEFT, LLFontGL::BOTTOM, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -            filter_string_length, S32_MAX, &right_x, FALSE ); +            filter_string_length, S32_MAX, &right_x, /*use_ellipses*/FALSE, /*use_color*/FALSE );      }      //Gilbert Linden 9-20-2012: Although this should be legal, removing it because it causes the mLabelSuffix rendering to diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index a23741b6dd..64b3a0ddcc 100644 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -163,6 +163,7 @@ LLTextBase::Params::Params()  	wrap("wrap"),  	trusted_content("trusted_content", true),  	use_ellipses("use_ellipses", false), +	use_color("use_color", false),  	parse_urls("parse_urls", false),  	force_urls_external("force_urls_external", false),  	parse_highlights("parse_highlights", false) @@ -217,6 +218,7 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p)  	mPlainText ( p.plain_text ),  	mWordWrap(p.wrap),  	mUseEllipses( p.use_ellipses ), +	mUseColor(p.use_color),  	mParseHTML(p.parse_urls),  	mForceUrlsExternal(p.force_urls_external),  	mParseHighlights(p.parse_highlights), @@ -3198,7 +3200,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele  				 mStyle->getShadowType(),   				 length,  				 &right_x,  -				 mEditor.getUseEllipses()); +				 mEditor.getUseEllipses(), +				 mEditor.getUseColor());  	}  	rect.mLeft = right_x; @@ -3217,7 +3220,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele  				 LLFontGL::NO_SHADOW,   				 length,  				 &right_x,  -				 mEditor.getUseEllipses()); +				 mEditor.getUseEllipses(), +				 mEditor.getUseColor());  	}  	rect.mLeft = right_x;  	if( selection_end < seg_end ) @@ -3234,7 +3238,8 @@ F32 LLNormalTextSegment::drawClippedSegment(S32 seg_start, S32 seg_end, S32 sele  				 mStyle->getShadowType(),   				 length,  				 &right_x,  -				 mEditor.getUseEllipses()); +				 mEditor.getUseEllipses(), +				 mEditor.getUseColor());  	}      return right_x;  } diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 9831c35858..6f1e178e36 100644 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -314,6 +314,7 @@ public:  								plain_text,  								wrap,  								use_ellipses, +								use_color,  								parse_urls,  								force_urls_external,  								parse_highlights, @@ -389,6 +390,7 @@ public:  	// used by LLTextSegment layout code  	bool					getWordWrap() { return mWordWrap; }  	bool					getUseEllipses() { return mUseEllipses; } +	bool					getUseColor() { return mUseColor; }  	bool					truncate(); // returns true of truncation occurred  	bool					isContentTrusted() {return mTrustedContent;} @@ -681,6 +683,7 @@ protected:  	bool						mParseHighlights;	// highlight user-defined keywords  	bool                		mWordWrap;  	bool						mUseEllipses; +	bool						mUseColor;  	bool						mTrackEnd;			// if true, keeps scroll position at end of document during resize  	bool						mReadOnly;  	bool						mBGVisible;			// render background? diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 89ad8138d8..40537e6c4a 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -1282,7 +1282,7 @@ void LLView::drawDebugRect()  										debug_rect.getWidth(), debug_rect.getHeight());  			LLFontGL::getFontSansSerifSmall()->renderUTF8(debug_text, 0, (F32)x, (F32)y, border_color,  												LLFontGL::HCENTER, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -												S32_MAX, S32_MAX, NULL, FALSE); +												S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  		}  	}  	LLUI::popMatrix(); diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp index d657f04457..a03b84daa5 100644 --- a/indra/newview/llexpandabletextbox.cpp +++ b/indra/newview/llexpandabletextbox.cpp @@ -88,7 +88,7 @@ public:  									mStyle->getShadowType(),   									end - start, draw_rect.getWidth(),   									&right_x,  -									mEditor.getUseEllipses()); +									mEditor.getUseEllipses(), mEditor.getUseColor());  		return right_x;  	}  	/*virtual*/ bool	canEdit() const { return false; } diff --git a/indra/newview/llfloateruipreview.cpp b/indra/newview/llfloateruipreview.cpp index db5a192287..211371571d 100644 --- a/indra/newview/llfloateruipreview.cpp +++ b/indra/newview/llfloateruipreview.cpp @@ -1601,7 +1601,7 @@ void LLOverlapPanel::draw()  		LLUI::translate(5,getRect().getHeight()-20);	// translate to top-5,left-5  		LLView::sDrawPreviewHighlights = FALSE;  		LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text, 0, 0, 0, text_color, -				LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +				LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  	}  	else  	{ @@ -1619,7 +1619,7 @@ void LLOverlapPanel::draw()  			std::string current_selection = std::string(current_selection_text + LLView::sPreviewClickedElement->getName() + " (no elements overlap)");  			S32 text_width = LLFontGL::getFontSansSerifSmall()->getWidth(current_selection) + 10;  			LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection, 0, 0, 0, text_color, -					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  			// widen panel enough to fit this text  			LLRect rect = getRect();  			setRect(LLRect(rect.mLeft,rect.mTop,rect.getWidth() < text_width ? rect.mLeft + text_width : rect.mRight,rect.mTop)); @@ -1685,7 +1685,7 @@ void LLOverlapPanel::draw()  		// draw currently-selected element at top of overlappers  		LLUI::translate(0,-mSpacing);  		LLFontGL::getFontSansSerifSmall()->renderUTF8(current_selection_text + LLView::sPreviewClickedElement->getName(), 0, 0, 0, text_color, -				LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +				LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  		LLUI::translate(0,-mSpacing-LLView::sPreviewClickedElement->getRect().getHeight());	// skip spacing distance + height  		LLView::sPreviewClickedElement->draw(); @@ -1700,7 +1700,7 @@ void LLOverlapPanel::draw()  			// draw name  			LLUI::translate(0,-mSpacing);  			LLFontGL::getFontSansSerifSmall()->renderUTF8(overlapper_text + viewp->getName(), 0, 0, 0, text_color, -					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +					LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  			// draw element  			LLUI::translate(0,-mSpacing-viewp->getRect().getHeight());	// skip spacing distance + height diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index 0d2edc0268..9ec6b99416 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -612,7 +612,7 @@ void LLGLTexMemBar::draw()  	LLFontGL::getFontMonospace()->renderUTF8(text, 0, 0, v_offset + line_height*3,  											 text_color, LLFontGL::LEFT, LLFontGL::TOP,  											 LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, -											 &x_right, FALSE); +											 &x_right, /*use_ellipses*/FALSE, /*use_color*/FALSE);  	F32Kilobits bandwidth(LLAppViewer::getTextureFetch()->getTextureBandwidth());  	F32Kilobits max_bandwidth(gSavedSettings.getF32("ThrottleBandwidthKBPS")); diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index c3cf07e9c7..e4d445b95c 100644 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -867,7 +867,7 @@ public:  			const Line& line = *iter;  			LLFontGL::getFontMonospace()->renderUTF8(line.text, 0, (F32)line.x, (F32)line.y, mTextColor,  											 LLFontGL::LEFT, LLFontGL::TOP, -											 LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE); +											 LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, /*use_ellipses*/FALSE, /*use_color*/FALSE);  		}  		mLineList.clear();  	} diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index 86249badaa..ff1f95526e 100644 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -469,7 +469,8 @@ void LLWorldMapView::draw()  					S32_MAX, //max_chars  					sMapScale, //max_pixels  					NULL, -					TRUE); //use ellipses +					/*use_ellipses*/TRUE, +					/*use_color*/FALSE);  			}  		}  	} | 
