Changeset - r20543:89cc7ba70ae8
[Not reviewed]
master
0 3 0
frosch - 11 years ago 2013-07-06 18:56:23
frosch@openttd.org
(svn r25569) -Codechange: Cache all Font instances in a static container.
3 files changed with 41 insertions and 16 deletions:
0 comments (0 inline, 0 general)
src/fontcache.cpp
Show inline comments
 
@@ -17,6 +17,7 @@
 
#include "core/smallmap_type.hpp"
 
#include "strings_func.h"
 
#include "zoom_type.h"
 
#include "gfx_layout.h"
 

	
 
#include "table/sprites.h"
 
#include "table/control_codes.h"
 
@@ -39,6 +40,7 @@ FontCache::FontCache(FontSize fs) : pare
 
{
 
	assert(parent == NULL || this->fs == parent->fs);
 
	FontCache::caches[this->fs] = this;
 
	Layouter::ResetFontCache(this->fs);
 
}
 

	
 
/** Clean everything up. */
 
@@ -46,6 +48,7 @@ FontCache::~FontCache()
 
{
 
	assert(this->fs == parent->fs);
 
	FontCache::caches[this->fs] = this->parent;
 
	Layouter::ResetFontCache(this->fs);
 
}
 

	
 

	
src/gfx_layout.cpp
Show inline comments
 
@@ -20,6 +20,11 @@
 
#include <unicode/ustring.h>
 
#endif /* WITH_ICU */
 

	
 

	
 
/** Cache of Font instances. */
 
Layouter::FontColourMap Layouter::fonts[FS_END];
 

	
 

	
 
/**
 
 * Construct a new font.
 
 * @param size   The font size to use for this font.
 
@@ -414,7 +419,7 @@ Layouter::Layouter(const char *str, int 
 
	WChar c = 0;
 

	
 
	do {
 
		Font *f = new Font(state.fontsize, state.cur_colour);
 
		Font *f = GetFont(state.fontsize, state.cur_colour);
 
		CharType *buff_begin = buff;
 
		FontMap fontMapping;
 

	
 
@@ -442,11 +447,8 @@ Layouter::Layouter(const char *str, int 
 

	
 
			if (!fontMapping.Contains(buff - buff_begin)) {
 
				fontMapping.Insert(buff - buff_begin, f);
 
				*this->fonts.Append() = f;
 
			} else {
 
				delete f;
 
			}
 
			f = new Font(state.fontsize, state.cur_colour);
 
			f = GetFont(state.fontsize, state.cur_colour);
 
		}
 

	
 
		/* Better safe than sorry. */
 
@@ -454,7 +456,6 @@ Layouter::Layouter(const char *str, int 
 

	
 
		if (!fontMapping.Contains(buff - buff_begin)) {
 
			fontMapping.Insert(buff - buff_begin, f);
 
			*this->fonts.Append() = f;
 
		}
 
		ParagraphLayout *p = GetParagraphLayout(buff_begin, buff, fontMapping);
 

	
 
@@ -469,14 +470,6 @@ Layouter::Layouter(const char *str, int 
 
	} while (c != '\0' && buff < buffer_last);
 
}
 

	
 
/** Free everything we allocated. */
 
Layouter::~Layouter()
 
{
 
	for (Font **iter = this->fonts.Begin(); iter != this->fonts.End(); iter++) {
 
		delete *iter;
 
	}
 
}
 

	
 
/**
 
 * Get the boundaries of this paragraph.
 
 * @return The boundaries.
 
@@ -490,3 +483,28 @@ Dimension Layouter::GetBounds()
 
	}
 
	return d;
 
}
 

	
 
/**
 
 * Get a static font instance.
 
 */
 
Font *Layouter::GetFont(FontSize size, TextColour colour)
 
{
 
	FontColourMap::iterator it = fonts[size].Find(colour);
 
	if (it != fonts[size].End()) return it->second;
 

	
 
	Font *f = new Font(size, colour);
 
	*fonts[size].Append() = FontColourMap::Pair(colour, f);
 
	return f;
 
}
 

	
 
/**
 
 * Reset cached font information.
 
 * @param size Font size to reset.
 
 */
 
void Layouter::ResetFontCache(FontSize size)
 
{
 
	for (FontColourMap::iterator it = fonts[size].Begin(); it != fonts[size].End(); ++it) {
 
		delete it->second;
 
	}
 
	fonts[size].Clear();
 
}
src/gfx_layout.h
Show inline comments
 
@@ -167,12 +167,16 @@ class Layouter : public AutoDeleteSmallV
 
	ParagraphLayout *GetParagraphLayout(CharType *buff, CharType *buff_end, FontMap &fontMapping);
 

	
 
	CharType buffer[DRAW_STRING_BUFFER]; ///< Buffer for the text that is going to be drawn.
 
	SmallVector<Font *, 4> fonts;        ///< The fonts needed for drawing.
 

	
 
	typedef SmallMap<TextColour, Font *> FontColourMap;
 
	static FontColourMap fonts[FS_END];
 
	static Font *GetFont(FontSize size, TextColour colour);
 

	
 
public:
 
	Layouter(const char *str, int maxw = INT32_MAX, TextColour colour = TC_FROMSTRING, FontSize fontsize = FS_NORMAL);
 
	~Layouter();
 
	Dimension GetBounds();
 

	
 
	static void ResetFontCache(FontSize size);
 
};
 

	
 
#endif /* GFX_LAYOUT_H */
0 comments (0 inline, 0 general)