Browse Source

Merge pull request #7852 from volzhs/cache-font-2.1

Cache DynamicFont resource for Android (2.1)
Rémi Verschelde 8 years ago
parent
commit
d79f44da62
2 changed files with 27 additions and 2 deletions
  1. 26 1
      scene/resources/dynamic_font.cpp
  2. 1 1
      scene/resources/dynamic_font.h

+ 26 - 1
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);

+ 1 - 1
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: