From 07f18616cbecdc9670d4775cdac480efc18f4ee3 Mon Sep 17 00:00:00 2001 From: Matthias Melcher Date: Sat, 17 Mar 2018 17:41:16 +0000 Subject: 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 --- src/drivers/Android/Fl_Android_Graphics_Font.cxx | 35 +++++++++++++++++++++--- 1 file changed, 31 insertions(+), 4 deletions(-) (limited to 'src/drivers/Android/Fl_Android_Graphics_Font.cxx') 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; } /** -- cgit v1.2.3