diff --git a/src/gui/fontzlib.cpp b/src/gui/fontzlib.cpp index c5f5fcf05..e2b9bcc48 100644 --- a/src/gui/fontzlib.cpp +++ b/src/gui/fontzlib.cpp @@ -38,9 +38,21 @@ struct InflateBlock { }; ImFont* FurnaceGUI::addFontZlib(const void* data, size_t len, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges) { + // find font in cache + logV("addFontZlib..."); + for (FurnaceGUIUncompFont& i: fontCache) { + if (i.origPtr==data && i.origLen==len) { + logV("found in cache"); + ImFontConfig fontConfig=(font_cfg==NULL)?ImFontConfig():(*font_cfg); + fontConfig.FontDataOwnedByAtlas=false; + + return ImGui::GetIO().Fonts->AddFontFromMemoryTTF(i.data,i.len,size_pixels,&fontConfig,glyph_ranges); + } + } + z_stream zl; memset(&zl,0,sizeof(z_stream)); - logV("addFontZlib..."); + logV("not found in cache - decompressing..."); zl.avail_in=len; zl.next_in=(Bytef*)data; @@ -116,10 +128,11 @@ ImFont* FurnaceGUI::addFontZlib(const void* data, size_t len, float size_pixels, delete i; } blocks.clear(); - len=finalSize; + + fontCache.push_back(FurnaceGUIUncompFont(data,len,finalData,finalSize)); ImFontConfig fontConfig=(font_cfg==NULL)?ImFontConfig():(*font_cfg); - fontConfig.FontDataOwnedByAtlas=true; + fontConfig.FontDataOwnedByAtlas=false; return ImGui::GetIO().Fonts->AddFontFromMemoryTTF(finalData,finalSize,size_pixels,&fontConfig,glyph_ranges); } diff --git a/src/gui/gui.h b/src/gui/gui.h index 9473fa5bd..a037090cb 100644 --- a/src/gui/gui.h +++ b/src/gui/gui.h @@ -1546,6 +1546,18 @@ struct FurnaceGUIPerfMetric { elapsed(0) {} }; +struct FurnaceGUIUncompFont { + const void* origPtr; + size_t origLen; + void* data; + size_t len; + FurnaceGUIUncompFont(const void* ptr, size_t len, void* d, size_t l): + origPtr(ptr), + origLen(len), + data(d), + len(l) {} +}; + struct FurnaceGUIBackupEntry { String name; uint64_t size; @@ -1778,6 +1790,7 @@ class FurnaceGUI { MIDIMap midiMap; int learning; + std::vector fontCache; ImFont* mainFont; ImFont* iconFont; ImFont* furIconFont;