1
0
Fork 0

(svn r25493) -Codechange: support for the safer variant of ICU's getFontTable

release/1.4
rubidium 2013-06-27 21:21:47 +00:00
parent 6f359bc1f0
commit 0c14a586bd
4 changed files with 24 additions and 11 deletions

View File

@ -77,7 +77,7 @@ public:
virtual uint GetGlyphWidth(GlyphID key); virtual uint GetGlyphWidth(GlyphID key);
virtual bool GetDrawGlyphShadow(); virtual bool GetDrawGlyphShadow();
virtual GlyphID MapCharToGlyph(WChar key) { return SPRITE_GLYPH | key; } 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 @@ class FreeTypeFontCache : public FontCache {
private: private:
FT_Face face; ///< The font face associated with this font. 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. */ /** Container for information about a glyph. */
struct GlyphEntry { struct GlyphEntry {
@ -229,7 +230,7 @@ public:
virtual uint GetGlyphWidth(GlyphID key); virtual uint GetGlyphWidth(GlyphID key);
virtual bool GetDrawGlyphShadow(); virtual bool GetDrawGlyphShadow();
virtual GlyphID MapCharToGlyph(WChar key); virtual GlyphID MapCharToGlyph(WChar key);
virtual const void *GetFontTable(uint32 tag); virtual const void *GetFontTable(uint32 tag, size_t &length);
}; };
FT_Library _library = NULL; FT_Library _library = NULL;
@ -363,8 +364,8 @@ FreeTypeFontCache::~FreeTypeFontCache()
FT_Done_Face(this->face); FT_Done_Face(this->face);
this->ClearFontCache(); this->ClearFontCache();
for (SmallPair<uint32, const void *> *iter = this->font_tables.Begin(); iter != this->font_tables.End(); iter++) { for (FontTable::iterator iter = this->font_tables.Begin(); iter != this->font_tables.End(); iter++) {
free(iter->second); free(iter->second.second);
} }
} }
@ -552,10 +553,13 @@ GlyphID FreeTypeFontCache::MapCharToGlyph(WChar key)
return FT_Get_Char_Index(this->face, key); 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); const FontTable::iterator iter = this->font_tables.Find(tag);
if (iter != this->font_tables.End()) return iter->second; if (iter != this->font_tables.End()) {
length = iter->second.first;
return iter->second.second;
}
FT_ULong len = 0; FT_ULong len = 0;
FT_Byte *result = NULL; FT_Byte *result = NULL;
@ -566,8 +570,9 @@ const void *FreeTypeFontCache::GetFontTable(uint32 tag)
result = MallocT<FT_Byte>(len); result = MallocT<FT_Byte>(len);
FT_Load_Sfnt_Table(this->face, tag, 0, result, &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; return result;
} }

View File

@ -114,9 +114,10 @@ public:
/** /**
* Read a font table from the font. * Read a font table from the font.
* @param tag The of the table to load. * @param tag The of the table to load.
* @param length The length of the read data.
* @return The loaded table 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. * Get the font cache of a given font size.

View File

@ -76,7 +76,13 @@ float Font::getScaleFactorY() const
const void *Font::getFontTable(LETag tableTag) const 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 LEGlyphID Font::mapCharToGlyph(LEUnicode32 ch) const

View File

@ -45,6 +45,7 @@ public:
float getScaleFactorX() const; float getScaleFactorX() const;
float getScaleFactorY() const; float getScaleFactorY() const;
const void *getFontTable(LETag tableTag) const; const void *getFontTable(LETag tableTag) const;
const void *getFontTable(LETag tableTag, size_t &length) const;
LEGlyphID mapCharToGlyph(LEUnicode32 ch) const; LEGlyphID mapCharToGlyph(LEUnicode32 ch) const;
void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const; void getGlyphAdvance(LEGlyphID glyph, LEPoint &advance) const;
le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const; le_bool getGlyphPoint(LEGlyphID glyph, le_int32 pointNumber, LEPoint &point) const;