Mercurial > hg > openttd
changeset 20558:020a60a5ee8a draft
(svn r25493) -Codechange: support for the safer variant of ICU's getFontTable
author | rubidium <rubidium@openttd.org> |
---|---|
date | Thu, 27 Jun 2013 21:21:47 +0000 |
parents | f7ab47357d6d |
children | 3c81c4874dc6 |
files | src/fontcache.cpp src/fontcache.h src/gfx_layout.cpp src/gfx_layout.h |
diffstat | 4 files changed, 24 insertions(+), 11 deletions(-) [+] |
line wrap: on
line diff
--- a/src/fontcache.cpp +++ b/src/fontcache.cpp @@ -77,7 +77,7 @@ virtual uint GetGlyphWidth(GlyphID key); virtual bool GetDrawGlyphShadow(); virtual GlyphID MapCharToGlyph(WChar key) { return SPRITE_GLYPH | key; } - virtual const void *GetFontTable(uint32 tag) { return NULL; } + virtual const void *GetFontTable(uint32 tag, size_t &length) { length = 0; return NULL; } }; /** @@ -191,7 +191,8 @@ private: FT_Face face; ///< The font face associated with this font. - SmallMap<uint32, const void*> font_tables; ///< Cached font tables. + typedef SmallMap<uint32, SmallPair<size_t, const void*>> FontTable; ///< Table with font table cache + FontTable font_tables; ///< Cached font tables. /** Container for information about a glyph. */ struct GlyphEntry { @@ -229,7 +230,7 @@ virtual uint GetGlyphWidth(GlyphID key); virtual bool GetDrawGlyphShadow(); virtual GlyphID MapCharToGlyph(WChar key); - virtual const void *GetFontTable(uint32 tag); + virtual const void *GetFontTable(uint32 tag, size_t &length); }; FT_Library _library = NULL; @@ -363,8 +364,8 @@ FT_Done_Face(this->face); this->ClearFontCache(); - for (SmallPair<uint32, const void *> *iter = this->font_tables.Begin(); iter != this->font_tables.End(); iter++) { - free(iter->second); + for (FontTable::iterator iter = this->font_tables.Begin(); iter != this->font_tables.End(); iter++) { + free(iter->second.second); } } @@ -552,10 +553,13 @@ return FT_Get_Char_Index(this->face, key); } -const void *FreeTypeFontCache::GetFontTable(uint32 tag) +const void *FreeTypeFontCache::GetFontTable(uint32 tag, size_t &length) { - const SmallPair<uint32, const void *> *iter = this->font_tables.Find(tag); - if (iter != this->font_tables.End()) return iter->second; + const FontTable::iterator iter = this->font_tables.Find(tag); + if (iter != this->font_tables.End()) { + length = iter->second.first; + return iter->second.second; + } FT_ULong len = 0; FT_Byte *result = NULL; @@ -566,8 +570,9 @@ result = MallocT<FT_Byte>(len); FT_Load_Sfnt_Table(this->face, tag, 0, result, &len); } + length = len; - this->font_tables.Insert(tag, result); + this->font_tables.Insert(tag, SmallPair<size_t, const void *>(length, result)); return result; }
--- a/src/fontcache.h +++ b/src/fontcache.h @@ -114,9 +114,10 @@ /** * Read a font table from the font. * @param tag The of the table to load. + * @param length The length of the read data. * @return The loaded table data. */ - virtual const void *GetFontTable(uint32 tag) = 0; + virtual const void *GetFontTable(uint32 tag, size_t &length) = 0; /** * Get the font cache of a given font size.
--- a/src/gfx_layout.cpp +++ b/src/gfx_layout.cpp @@ -76,7 +76,13 @@ const void *Font::getFontTable(LETag tableTag) const { - return this->fc->GetFontTable(tableTag); + size_t length; + return this->getFontTable(tableTag, length); +} + +const void *Font::getFontTable(LETag tableTag, size_t &length) const +{ + return this->fc->GetFontTable(tableTag, length); } LEGlyphID Font::mapCharToGlyph(LEUnicode32 ch) const
--- a/src/gfx_layout.h +++ b/src/gfx_layout.h @@ -45,6 +45,7 @@ float getScaleFactorX() const; float getScaleFactorY() const; const void *getFontTable(LETag tableTag) const; + const void *getFontTable(LETag tableTag, size_t &length) const; LEGlyphID mapCharToGlyph(LEUnicode32 ch) const; void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const; le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const;