diff options
| author | Rémi Verschelde | 2017-02-27 23:35:35 +0100 |
|---|---|---|
| committer | GitHub | 2017-02-27 23:35:35 +0100 |
| commit | d79f44da628f35ed7ca7ee6d4e5bb8555028c611 (patch) | |
| tree | 0f3500f2ef8eba85f2f60a80931a63e00f769966 | |
| parent | ee9f31a5cc8c344ebf8b4cd48154f47a1f498779 (diff) | |
| parent | 71a5b0885bc3401c030e509e7abe7408db58cc46 (diff) | |
| download | godot-d79f44da628f35ed7ca7ee6d4e5bb8555028c611.tar.gz godot-d79f44da628f35ed7ca7ee6d4e5bb8555028c611.tar.zst godot-d79f44da628f35ed7ca7ee6d4e5bb8555028c611.zip | |
Merge pull request #7852 from volzhs/cache-font-2.1
Cache DynamicFont resource for Android (2.1)
| -rw-r--r-- | scene/resources/dynamic_font.cpp | 27 | ||||
| -rw-r--r-- | scene/resources/dynamic_font.h | 2 |
2 files changed, 27 insertions, 2 deletions
diff --git a/scene/resources/dynamic_font.cpp b/scene/resources/dynamic_font.cpp index 3361c1e41..749046189 100644 --- a/scene/resources/dynamic_font.cpp +++ b/scene/resources/dynamic_font.cpp @@ -29,6 +29,7 @@ #ifdef FREETYPE_ENABLED #include "dynamic_font.h" #include "os/file_access.h" +#include "os/os.h" bool DynamicFontData::CacheID::operator< (CacheID right) const{ @@ -106,6 +107,7 @@ DynamicFontData::~DynamicFontData() //////////////////// +HashMap< String, Vector<uint8_t> > DynamicFontAtSize::_fontdata; Error DynamicFontAtSize::_load() { @@ -115,7 +117,30 @@ Error DynamicFontAtSize::_load() { ERR_EXPLAIN(TTR("Error initializing FreeType.")); ERR_FAIL_COND_V( error !=0, ERR_CANT_CREATE ); - if (font->font_path!=String()) { + // FT_OPEN_STREAM is extremely slow only on Android. + if (OS::get_singleton()->get_name()=="Android" && font->font_mem==NULL && font->font_path!=String()) { + // cache font only once for each font->font_path + if (_fontdata.has(font->font_path)) { + + font->set_font_ptr(_fontdata[font->font_path].ptr(), _fontdata[font->font_path].size()); + + } else { + + FileAccess *f=FileAccess::open(font->font_path,FileAccess::READ); + ERR_FAIL_COND_V(!f,ERR_CANT_OPEN); + + size_t len=f->get_len(); + _fontdata[font->font_path]=Vector<uint8_t>(); + Vector<uint8_t>& fontdata=_fontdata[font->font_path]; + fontdata.resize(len); + f->get_buffer(fontdata.ptr(), len); + font->set_font_ptr(fontdata.ptr(), len); + f->close(); + + } + } + + if (font->font_mem==NULL && font->font_path!=String()) { FileAccess *f=FileAccess::open(font->font_path,FileAccess::READ); ERR_FAIL_COND_V(!f,ERR_CANT_OPEN); diff --git a/scene/resources/dynamic_font.h b/scene/resources/dynamic_font.h index 131c3d3e8..9d31a092f 100644 --- a/scene/resources/dynamic_font.h +++ b/scene/resources/dynamic_font.h @@ -140,7 +140,7 @@ friend class DynamicFontData; DynamicFontData::CacheID id; - + static HashMap< String, Vector<uint8_t> > _fontdata; Error _load(); protected: |
