Cache DynamicFont resource for Android

This commit is contained in:
volzhs 2017-02-20 21:52:19 +09:00
parent d5c2a6b76b
commit 71a5b0885b
2 changed files with 27 additions and 2 deletions

View file

@ -29,6 +29,7 @@
#ifdef FREETYPE_ENABLED #ifdef FREETYPE_ENABLED
#include "dynamic_font.h" #include "dynamic_font.h"
#include "os/file_access.h" #include "os/file_access.h"
#include "os/os.h"
bool DynamicFontData::CacheID::operator< (CacheID right) const{ bool DynamicFontData::CacheID::operator< (CacheID right) const{
@ -106,6 +107,7 @@ DynamicFontData::~DynamicFontData()
//////////////////// ////////////////////
HashMap< String, Vector<uint8_t> > DynamicFontAtSize::_fontdata;
Error DynamicFontAtSize::_load() { Error DynamicFontAtSize::_load() {
@ -115,7 +117,30 @@ Error DynamicFontAtSize::_load() {
ERR_EXPLAIN(TTR("Error initializing FreeType.")); ERR_EXPLAIN(TTR("Error initializing FreeType."));
ERR_FAIL_COND_V( error !=0, ERR_CANT_CREATE ); 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); FileAccess *f=FileAccess::open(font->font_path,FileAccess::READ);
ERR_FAIL_COND_V(!f,ERR_CANT_OPEN); ERR_FAIL_COND_V(!f,ERR_CANT_OPEN);

View file

@ -140,7 +140,7 @@ friend class DynamicFontData;
DynamicFontData::CacheID id; DynamicFontData::CacheID id;
static HashMap< String, Vector<uint8_t> > _fontdata;
Error _load(); Error _load();
protected: protected: