aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRémi Verschelde2017-02-27 23:35:35 +0100
committerGitHub2017-02-27 23:35:35 +0100
commitd79f44da628f35ed7ca7ee6d4e5bb8555028c611 (patch)
tree0f3500f2ef8eba85f2f60a80931a63e00f769966
parentee9f31a5cc8c344ebf8b4cd48154f47a1f498779 (diff)
parent71a5b0885bc3401c030e509e7abe7408db58cc46 (diff)
downloadgodot-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.cpp27
-rw-r--r--scene/resources/dynamic_font.h2
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: