aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/core/SkFlattenable.h9
-rw-r--r--src/core/SkReadBuffer.cpp8
-rw-r--r--tests/FlattenableCustomFactory.cpp1
3 files changed, 12 insertions, 6 deletions
diff --git a/include/core/SkFlattenable.h b/include/core/SkFlattenable.h
index b0bfbe23e7..5faf7c2317 100644
--- a/include/core/SkFlattenable.h
+++ b/include/core/SkFlattenable.h
@@ -59,8 +59,11 @@ struct SkDeserialProcs;
This macro should only be used in base class objects in core
*/
#define SK_DEFINE_FLATTENABLE_TYPE(flattenable) \
- static Type GetFlattenableType() { \
- return k##flattenable##_Type; \
+ static Type GetFlattenableType() { \
+ return k##flattenable##_Type; \
+ } \
+ Type getFlattenableType() const override { \
+ return k##flattenable##_Type; \
}
/** \class SkFlattenable
@@ -120,6 +123,8 @@ public:
*/
virtual void flatten(SkWriteBuffer&) const {}
+ virtual Type getFlattenableType() const = 0;
+
//
// public ways to serialize / deserialize
//
diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp
index 4a2c61be02..8ffe58c2b1 100644
--- a/src/core/SkReadBuffer.cpp
+++ b/src/core/SkReadBuffer.cpp
@@ -386,10 +386,6 @@ sk_sp<SkTypeface> SkReadBuffer::readTypeface() {
}
SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) {
- //
- // TODO: confirm that ft matches the factory we decide to use
- //
-
SkFlattenable::Factory factory = nullptr;
if (fInflator) {
@@ -452,6 +448,10 @@ SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) {
this->validate(false);
return nullptr;
}
+ if (obj && obj->getFlattenableType() != ft) {
+ this->validate(false);
+ return nullptr;
+ }
} else {
// we must skip the remaining data
fReader.skip(sizeRecorded);
diff --git a/tests/FlattenableCustomFactory.cpp b/tests/FlattenableCustomFactory.cpp
index e83311b398..3523ae73d1 100644
--- a/tests/FlattenableCustomFactory.cpp
+++ b/tests/FlattenableCustomFactory.cpp
@@ -27,6 +27,7 @@ public:
}
Factory getFactory() const override { return nullptr; }
+ Type getFlattenableType() const override { return SkFlattenable::kSkUnused_Type; }
uint32_t a() const { return fA; }
uint32_t b() const { return fB; }