Index: src/ports/SkFontHost_linux.cpp |
diff --git a/src/ports/SkFontHost_linux.cpp b/src/ports/SkFontHost_linux.cpp |
index 6003c095c164ee23125a34ca5ed0eedc00005d65..853416c2f49a8e9e0c5b7c56c8acfec9ddeb7b82 100644 |
--- a/src/ports/SkFontHost_linux.cpp |
+++ b/src/ports/SkFontHost_linux.cpp |
@@ -12,6 +12,7 @@ |
#include "SkDescriptor.h" |
#include "SkOSFile.h" |
#include "SkPaint.h" |
+#include "SkRTConf.h" |
#include "SkString.h" |
#include "SkStream.h" |
#include "SkThread.h" |
@@ -101,6 +102,13 @@ private: |
typedef SkTypeface_Custom INHERITED; |
}; |
+// This configuration option is useful if we need to open and hold handles to |
+// all found system font data (e.g., for skfiddle, where the application can't |
+// access the filesystem to read fonts on demand) |
+ |
+SK_CONF_DECLARE(bool, c_CustomTypefaceRetain, "fonts.customFont.retainAllData", false, |
+ "Retain the open stream for each found font on the system."); |
+ |
/** The file SkTypeface implementation for the custom font manager. */ |
class SkTypeface_File : public SkTypeface_Custom { |
public: |
@@ -108,6 +116,7 @@ public: |
const SkString familyName, const char path[], int index) |
: INHERITED(style, isFixedPitch, sysFont, familyName, index) |
, fPath(path) |
+ , fStream(c_CustomTypefaceRetain ? SkStream::NewFromFile(fPath.c_str()) : NULL) |
{ } |
virtual const char* getUniqueString() const SK_OVERRIDE { |
@@ -121,11 +130,16 @@ public: |
protected: |
virtual SkStream* onOpenStream(int* ttcIndex) const SK_OVERRIDE { |
*ttcIndex = this->getIndex(); |
- return SkStream::NewFromFile(fPath.c_str()); |
+ if (fStream.get()) { |
+ return fStream->duplicate(); |
+ } else { |
+ return SkStream::NewFromFile(fPath.c_str()); |
+ } |
} |
private: |
SkString fPath; |
+ const SkAutoTUnref<SkStreamAsset> fStream; |
typedef SkTypeface_Custom INHERITED; |
}; |