Index: src/core/SkReadBuffer.h |
diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h |
index faf853aef5430124c7f916636804c88fa6eb4df1..b18505453e7edfbc898664f97085e99084f65a79 100644 |
--- a/src/core/SkReadBuffer.h |
+++ b/src/core/SkReadBuffer.h |
@@ -22,6 +22,7 @@ |
#include "SkReader32.h" |
#include "SkRefCnt.h" |
#include "SkShader.h" |
+#include "SkTHash.h" |
#include "SkWriteBuffer.h" |
#include "SkXfermode.h" |
@@ -111,6 +112,9 @@ public: |
virtual uint32_t readUInt(); |
virtual int32_t read32(); |
+ // peek |
+ virtual uint8_t peekByte(); |
+ |
// strings -- the caller is responsible for freeing the string contents |
virtual void readString(SkString* string); |
virtual void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding); |
@@ -194,6 +198,20 @@ public: |
} |
/** |
+ * For an input flattenable (specified by name), set a custom factory proc |
+ * to use when unflattening. Will make a copy of |name|. |
+ * |
+ * If the global registry already has a default factory for the flattenable, |
+ * this will override that factory. If a custom factory has already been |
+ * set for the flattenable, this will override that factory. |
+ * |
+ * Custom factories can be removed by calling setCustomFactory("...", nullptr). |
+ */ |
+ void setCustomFactory(const SkString& name, SkFlattenable::Factory factory) { |
+ fCustomFactory.set(name, factory); |
+ } |
+ |
+ /** |
* Provide a function to decode an SkBitmap from encoded data. Only used if the writer |
* encoded the SkBitmap. If the proper decoder cannot be used, a red bitmap with the |
* appropriate size will be used. |
@@ -208,8 +226,27 @@ public: |
virtual bool validateAvailable(size_t size) { return true; } |
protected: |
+ /** |
+ * Allows subclass to check if we are using factories for expansion |
+ * of flattenables. |
+ */ |
+ int factoryCount() { return fFactoryCount; } |
+ |
+ |
+ /** |
+ * Checks if a custom factory has been set for a given flattenable. |
+ * Returns the custom factory if it exists, or nullptr otherwise. |
+ */ |
+ SkFlattenable::Factory getCustomFactory(const SkString& name) { |
+ SkFlattenable::Factory* factoryPtr = fCustomFactory.find(name); |
+ return factoryPtr ? *factoryPtr : nullptr; |
+ } |
+ |
SkReader32 fReader; |
+ // Only used if we do not have an fFactoryArray. |
+ SkTHashMap<uint32_t, SkString> fFlattenableDict; |
+ |
private: |
bool readArray(void* value, size_t size, size_t elementSize); |
@@ -225,6 +262,9 @@ private: |
SkFlattenable::Factory* fFactoryArray; |
int fFactoryCount; |
+ // Only used if we do not have an fFactoryArray. |
+ SkTHashMap<SkString, SkFlattenable::Factory> fCustomFactory; |
+ |
SkPicture::InstallPixelRefProc fBitmapDecoder; |
#ifdef DEBUG_NON_DETERMINISTIC_ASSERT |