From 4824cb78863ff8b5ff631631a1fd8b5c8dfba500 Mon Sep 17 00:00:00 2001 From: frosch Date: Sat, 6 Jul 2013 18:56:23 +0000 Subject: (svn r25569) -Codechange: Cache all Font instances in a static container. --- src/gfx_layout.cpp | 46 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'src/gfx_layout.cpp') diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp index f3b1ac1d3..cba5a7ddd 100644 --- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -20,6 +20,11 @@ #include #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 maxw, TextColour colour, FontSize fontsi 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 maxw, TextColour colour, FontSize fontsi 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 maxw, TextColour colour, FontSize fontsi 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 maxw, TextColour colour, FontSize fontsi } 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(); +} -- cgit v1.2.3-54-g00ecf