Merge pull request #8130 from volzhs/cache-font-master
Cache DynamicFont resource for Android
This commit is contained in:
commit
397380e9e5
@ -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 {
|
||||||
|
|
||||||
@ -98,6 +99,7 @@ DynamicFontData::~DynamicFontData() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
////////////////////
|
////////////////////
|
||||||
|
HashMap<String, Vector<uint8_t> > DynamicFontAtSize::_fontdata;
|
||||||
|
|
||||||
Error DynamicFontAtSize::_load() {
|
Error DynamicFontAtSize::_load() {
|
||||||
|
|
||||||
@ -106,7 +108,29 @@ 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);
|
||||||
|
@ -141,6 +141,7 @@ class DynamicFontAtSize : public Reference {
|
|||||||
Ref<DynamicFontData> font;
|
Ref<DynamicFontData> font;
|
||||||
DynamicFontData::CacheID id;
|
DynamicFontData::CacheID id;
|
||||||
|
|
||||||
|
static HashMap<String, Vector<uint8_t> > _fontdata;
|
||||||
Error _load();
|
Error _load();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
Loading…
Reference in New Issue
Block a user