diff options
author | 2017-12-11 13:23:33 -0500 | |
---|---|---|
committer | 2017-12-11 18:50:00 +0000 | |
commit | 58a3fcd4b3a2f7210586f4ec74dde8ac2b231e0f (patch) | |
tree | 3e1d077d627e19e0ddb8c455a2a9950be5625d0e | |
parent | cbe99c050e63551f475242b1f69824ee02bb34aa (diff) |
add virtual to confirm flattenable type
meant to replace https://skia-review.googlesource.com/c/skia/+/83381
Bug:793639
Change-Id: I972dc80725bf5ce5be24769aafa23269735e089c
Reviewed-on: https://skia-review.googlesource.com/83444
Reviewed-by: Florin Malita <fmalita@chromium.org>
Reviewed-by: Mike Klein <mtklein@chromium.org>
Commit-Queue: Mike Klein <mtklein@chromium.org>
-rw-r--r-- | include/core/SkFlattenable.h | 9 | ||||
-rw-r--r-- | src/core/SkReadBuffer.cpp | 8 | ||||
-rw-r--r-- | tests/FlattenableCustomFactory.cpp | 1 |
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; } |