summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/fontcache.cpp23
-rw-r--r--src/fontcache.h3
-rw-r--r--src/gfx_layout.cpp8
-rw-r--r--src/gfx_layout.h1
4 files changed, 24 insertions, 11 deletions
diff --git a/src/fontcache.cpp b/src/fontcache.cpp
index a8dd71c75..5b66c3b7a 100644
--- a/src/fontcache.cpp
+++ b/src/fontcache.cpp
@@ -77,7 +77,7 @@ public:
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 @@ class FreeTypeFontCache : public FontCache {
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 @@ public:
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 @@ FreeTypeFontCache::~FreeTypeFontCache()
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 @@ GlyphID FreeTypeFontCache::MapCharToGlyph(WChar 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);
- 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 @@ const void *FreeTypeFontCache::GetFontTable(uint32 tag)
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;
}
diff --git a/src/fontcache.h b/src/fontcache.h
index 6e4d18b3b..1f52ddcdc 100644
--- a/src/fontcache.h
+++ b/src/fontcache.h
@@ -114,9 +114,10 @@ public:
/**
* 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.
diff --git a/src/gfx_layout.cpp b/src/gfx_layout.cpp
index 9dc921267..69b3077f2 100644
--- a/src/gfx_layout.cpp
+++ b/src/gfx_layout.cpp
@@ -76,7 +76,13 @@ float Font::getScaleFactorY() 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
diff --git a/src/gfx_layout.h b/src/gfx_layout.h
index dbeccd429..0fadd5126 100644
--- a/src/gfx_layout.h
+++ b/src/gfx_layout.h
@@ -45,6 +45,7 @@ public:
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;