diff options
author | 2016-04-04 14:57:19 -0700 | |
---|---|---|
committer | 2016-04-04 14:57:19 -0700 | |
commit | 3b37545bc594a96de45eba62dea0ce478750f2a9 (patch) | |
tree | 74fcea3a567af0475a7e96720f0286a67b88d7d5 /src | |
parent | 99d9231f6a4cb6b85b8637e9d8ae32f8bd7c466f (diff) |
Revert of Delete SkFlattenable::Type (patchset #2 id:20001 of https://codereview.chromium.org/1834303003/ )
Reason for revert:
Used by Chrome.
c:\b\build\slave\workdir\build\src\cc\playback\compositing_display_item.cc(53): error C2039: 'GetFlattenableType': is not a member of 'SkColorFilter'
c:\b\build\slave\workdir\build\src\third_party\skia\include\core\skshader.h(19): note: see declaration of 'SkColorFilter'
c:\b\build\slave\workdir\build\src\cc\playback\compositing_display_item.cc(53): error C3861: 'GetFlattenableType': identifier not found
Original issue's description:
> Delete SkFlattenable::Type
>
> BUG=skia:
> GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1834303003
>
> Committed: https://skia.googlesource.com/skia/+/99d9231f6a4cb6b85b8637e9d8ae32f8bd7c466f
TBR=reed@google.com,msarett@google.com
# Skipping CQ checks because original CL landed less than 1 days ago.
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true
BUG=skia:
Review URL: https://codereview.chromium.org/1853383002
Diffstat (limited to 'src')
-rw-r--r-- | src/core/SkFlattenable.cpp | 20 | ||||
-rw-r--r-- | src/core/SkFlattenableSerialization.cpp | 5 | ||||
-rw-r--r-- | src/core/SkReadBuffer.cpp | 6 | ||||
-rw-r--r-- | src/core/SkReadBuffer.h | 4 | ||||
-rw-r--r-- | src/core/SkScalerContext.cpp | 14 | ||||
-rw-r--r-- | src/core/SkValidatingReadBuffer.cpp | 8 | ||||
-rw-r--r-- | src/core/SkValidatingReadBuffer.h | 2 | ||||
-rw-r--r-- | src/utils/SkBitmapSourceDeserializer.h | 1 |
8 files changed, 47 insertions, 13 deletions
diff --git a/src/core/SkFlattenable.cpp b/src/core/SkFlattenable.cpp index 506a7b14e7..c759a1ab38 100644 --- a/src/core/SkFlattenable.cpp +++ b/src/core/SkFlattenable.cpp @@ -53,18 +53,20 @@ void SkRefCntSet::decPtr(void* ptr) { struct Entry { const char* fName; SkFlattenable::Factory fFactory; + SkFlattenable::Type fType; }; static int gCount = 0; static Entry gEntries[MAX_ENTRY_COUNT]; -void SkFlattenable::Register(const char name[], Factory factory) { +void SkFlattenable::Register(const char name[], Factory factory, SkFlattenable::Type type) { SkASSERT(name); SkASSERT(factory); SkASSERT(gCount < MAX_ENTRY_COUNT); gEntries[gCount].fName = name; gEntries[gCount].fFactory = factory; + gEntries[gCount].fType = type; gCount += 1; } @@ -92,6 +94,22 @@ SkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) { return nullptr; } +bool SkFlattenable::NameToType(const char name[], SkFlattenable::Type* type) { + SkASSERT(type); + InitializeFlattenablesIfNeeded(); +#ifdef SK_DEBUG + report_no_entries(__FUNCTION__); +#endif + const Entry* entries = gEntries; + for (int i = gCount - 1; i >= 0; --i) { + if (strcmp(entries[i].fName, name) == 0) { + *type = entries[i].fType; + return true; + } + } + return false; +} + const char* SkFlattenable::FactoryToName(Factory fact) { InitializeFlattenablesIfNeeded(); #ifdef SK_DEBUG diff --git a/src/core/SkFlattenableSerialization.cpp b/src/core/SkFlattenableSerialization.cpp index 748e20a9c2..e9ce09ff1f 100644 --- a/src/core/SkFlattenableSerialization.cpp +++ b/src/core/SkFlattenableSerialization.cpp @@ -20,7 +20,8 @@ SkData* SkValidatingSerializeFlattenable(SkFlattenable* flattenable) { return data.release(); } -SkFlattenable* SkValidatingDeserializeFlattenable(const void* data, size_t size) { +SkFlattenable* SkValidatingDeserializeFlattenable(const void* data, size_t size, + SkFlattenable::Type type) { SkValidatingReadBuffer buffer(data, size); - return buffer.readFlattenable(); + return buffer.readFlattenable(type); } diff --git a/src/core/SkReadBuffer.cpp b/src/core/SkReadBuffer.cpp index d57b223700..f220b5a9e6 100644 --- a/src/core/SkReadBuffer.cpp +++ b/src/core/SkReadBuffer.cpp @@ -329,7 +329,11 @@ SkTypeface* SkReadBuffer::readTypeface() { } } -SkFlattenable* SkReadBuffer::readFlattenable() { +SkFlattenable* SkReadBuffer::readFlattenable(SkFlattenable::Type ft) { + // + // TODO: confirm that ft matches the factory we decide to use + // + SkFlattenable::Factory factory = nullptr; if (fFactoryCount > 0) { diff --git a/src/core/SkReadBuffer.h b/src/core/SkReadBuffer.h index cd570e18f3..7b12194fc0 100644 --- a/src/core/SkReadBuffer.h +++ b/src/core/SkReadBuffer.h @@ -126,9 +126,9 @@ public: virtual void readPath(SkPath* path); void readPaint(SkPaint* paint) { paint->unflatten(*this); } - virtual SkFlattenable* readFlattenable(); + virtual SkFlattenable* readFlattenable(SkFlattenable::Type); template <typename T> sk_sp<T> readFlattenable() { - return sk_sp<T>((T*)this->readFlattenable()); + return sk_sp<T>((T*)this->readFlattenable(T::GetFlattenableType())); } sk_sp<SkColorFilter> readColorFilter() { return this->readFlattenable<SkColorFilter>(); } sk_sp<SkDrawLooper> readDrawLooper() { return this->readFlattenable<SkDrawLooper>(); } diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 3db9e30876..cf4098bbdd 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -62,14 +62,15 @@ void SkGlyph::zeroMetrics() { #define DUMP_RECx #endif -static SkFlattenable* load_flattenable(const SkDescriptor* desc, uint32_t tag) { +static SkFlattenable* load_flattenable(const SkDescriptor* desc, uint32_t tag, + SkFlattenable::Type ft) { SkFlattenable* obj = nullptr; uint32_t len; const void* data = desc->findEntry(tag, &len); if (data) { SkReadBuffer buffer(data, len); - obj = buffer.readFlattenable(); + obj = buffer.readFlattenable(ft); SkASSERT(buffer.offset() == buffer.size()); } return obj; @@ -79,9 +80,12 @@ SkScalerContext::SkScalerContext(SkTypeface* typeface, const SkDescriptor* desc) : fRec(*static_cast<const Rec*>(desc->findEntry(kRec_SkDescriptorTag, nullptr))) , fTypeface(SkRef(typeface)) - , fPathEffect(static_cast<SkPathEffect*>(load_flattenable(desc, kPathEffect_SkDescriptorTag))) - , fMaskFilter(static_cast<SkMaskFilter*>(load_flattenable(desc, kMaskFilter_SkDescriptorTag))) - , fRasterizer(static_cast<SkRasterizer*>(load_flattenable(desc, kRasterizer_SkDescriptorTag))) + , fPathEffect(static_cast<SkPathEffect*>(load_flattenable(desc, kPathEffect_SkDescriptorTag, + SkFlattenable::kSkPathEffect_Type))) + , fMaskFilter(static_cast<SkMaskFilter*>(load_flattenable(desc, kMaskFilter_SkDescriptorTag, + SkFlattenable::kSkMaskFilter_Type))) + , fRasterizer(static_cast<SkRasterizer*>(load_flattenable(desc, kRasterizer_SkDescriptorTag, + SkFlattenable::kSkRasterizer_Type))) // Initialize based on our settings. Subclasses can also force this. , fGenerateImageFromPath(fRec.fFrameWidth > 0 || fPathEffect != nullptr || fRasterizer != nullptr) diff --git a/src/core/SkValidatingReadBuffer.cpp b/src/core/SkValidatingReadBuffer.cpp index 0ce8bf9c59..ad4b6c409e 100644 --- a/src/core/SkValidatingReadBuffer.cpp +++ b/src/core/SkValidatingReadBuffer.cpp @@ -222,14 +222,20 @@ bool SkValidatingReadBuffer::validateAvailable(size_t size) { return this->validate((size <= SK_MaxU32) && fReader.isAvailable(static_cast<uint32_t>(size))); } -SkFlattenable* SkValidatingReadBuffer::readFlattenable() { +SkFlattenable* SkValidatingReadBuffer::readFlattenable(SkFlattenable::Type type) { SkString name; this->readString(&name); if (fError) { return nullptr; } + // Is this the type we wanted ? const char* cname = name.c_str(); + SkFlattenable::Type baseType; + if (!SkFlattenable::NameToType(cname, &baseType) || (baseType != type)) { + return nullptr; + } + SkFlattenable::Factory factory = SkFlattenable::NameToFactory(cname); if (nullptr == factory) { return nullptr; // writer failed to give us the flattenable diff --git a/src/core/SkValidatingReadBuffer.h b/src/core/SkValidatingReadBuffer.h index 4b8cdf88c0..bcdcba5de4 100644 --- a/src/core/SkValidatingReadBuffer.h +++ b/src/core/SkValidatingReadBuffer.h @@ -39,7 +39,7 @@ public: void* readEncodedString(size_t* length, SkPaint::TextEncoding encoding) override; // common data structures - SkFlattenable* readFlattenable() override; + SkFlattenable* readFlattenable(SkFlattenable::Type type) override; void skipFlattenable() override; void readPoint(SkPoint* point) override; void readMatrix(SkMatrix* matrix) override; diff --git a/src/utils/SkBitmapSourceDeserializer.h b/src/utils/SkBitmapSourceDeserializer.h index 60f185e17a..e017599918 100644 --- a/src/utils/SkBitmapSourceDeserializer.h +++ b/src/utils/SkBitmapSourceDeserializer.h @@ -14,6 +14,7 @@ // Should be removed when SKP versions which may contain SkBitmapSource records are phased out. class SkBitmapSourceDeserializer : public SkFlattenable { public: + SK_DEFINE_FLATTENABLE_TYPE(SkImageFilter) SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkBitmapSource) }; |