summaryrefslogtreecommitdiff
path: root/src/drivers/Android/Fl_Android_Graphics_Font.cxx
diff options
context:
space:
mode:
authorMatthias Melcher <fltk@matthiasm.com>2018-03-17 17:41:16 +0000
committerMatthias Melcher <fltk@matthiasm.com>2018-03-17 17:41:16 +0000
commit07f18616cbecdc9670d4775cdac480efc18f4ee3 (patch)
treefd3ffb7718717880644a16d8e71246b519f9d014 /src/drivers/Android/Fl_Android_Graphics_Font.cxx
parent0016617ad480241f372c1e5325303816e9be26c0 (diff)
Android: added chaching
Next: add other font related calls, add clipping, add font paths for package resources git-svn-id: file:///fltk/svn/fltk/branches/branch-1.4@12766 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/Android/Fl_Android_Graphics_Font.cxx')
-rw-r--r--src/drivers/Android/Fl_Android_Graphics_Font.cxx35
1 files changed, 31 insertions, 4 deletions
diff --git a/src/drivers/Android/Fl_Android_Graphics_Font.cxx b/src/drivers/Android/Fl_Android_Graphics_Font.cxx
index 681d910bf..acbdf8406 100644
--- a/src/drivers/Android/Fl_Android_Graphics_Font.cxx
+++ b/src/drivers/Android/Fl_Android_Graphics_Font.cxx
@@ -163,6 +163,11 @@ Fl_Android_Bytemap *Fl_Android_Font_Source::get_bytemap(uint32_t c, int size)
&byteMap->pXOffset, &byteMap->pYOffset);
byteMap->pStride = byteMap->pWidth;
+ int advance, lsb;
+ stbtt_GetCodepointHMetrics(&pFont, c, &advance, &lsb);
+ float scale = stbtt_ScaleForPixelHeight(&pFont, size);
+ byteMap->pAdvance = (int)((scale * advance)+0.5f);
+
return byteMap;
}
@@ -213,6 +218,17 @@ Fl_Android_Font_Descriptor::Fl_Android_Font_Descriptor(const char *fname, Fl_And
// unsigned int listbase; // base of display list, 0 = none
}
+/**
+ * Release resources, including all cached unicode character shapes.
+ */
+Fl_Android_Font_Descriptor::~Fl_Android_Font_Descriptor()
+{
+ // Life is easy in C++11.
+ for (auto &i: pBytemapTable) {
+ delete i.second;
+ }
+}
+
/*
* Get the width of the character in pixels.
* @param c unicode character
@@ -220,18 +236,30 @@ Fl_Android_Font_Descriptor::Fl_Android_Font_Descriptor(const char *fname, Fl_And
*/
float Fl_Android_Font_Descriptor::get_advance(uint32_t c)
{
+ // TODO: should we cache the advance value inside the bytemap?
return pFontSource->get_advance(c, size);
}
/**
* Get the pixels for a given Unicode character.
+ *
+ * Calculating a bitmap is relatively expensive. This class will cache every
+ * bitmap ever generated. Currently, this is pretty much brute force because
+ * none of the bitmaps are ever released.
+ *
* @param c unicode character
* @return a bytemap
*/
Fl_Android_Bytemap *Fl_Android_Font_Descriptor::get_bytemap(uint32_t c)
{
- // TODO: cache bytemaps here for fast access
- return pFontSource->get_bytemap(c, size);
+ Fl_Android_Bytemap *bm = 0;
+ try {
+ bm = pBytemapTable.at(c);
+ } catch(...) {
+ bm = pFontSource->get_bytemap(c, size);
+ pBytemapTable[c] = bm;
+ }
+ return bm;
}
@@ -325,8 +353,7 @@ int Fl_Android_Graphics_Driver::render_letter(int xx, int yy, uint32_t c)
d++;
}
}
- delete bm;
- return oxx + (int)(fd->get_advance(c)+0.5f);
+ return oxx + bm->pAdvance;
}
/**