aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar mtklein <mtklein@google.com>2016-04-04 14:57:19 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-04 14:57:19 -0700
commit3b37545bc594a96de45eba62dea0ce478750f2a9 (patch)
tree74fcea3a567af0475a7e96720f0286a67b88d7d5 /src
parent99d9231f6a4cb6b85b8637e9d8ae32f8bd7c466f (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.cpp20
-rw-r--r--src/core/SkFlattenableSerialization.cpp5
-rw-r--r--src/core/SkReadBuffer.cpp6
-rw-r--r--src/core/SkReadBuffer.h4
-rw-r--r--src/core/SkScalerContext.cpp14
-rw-r--r--src/core/SkValidatingReadBuffer.cpp8
-rw-r--r--src/core/SkValidatingReadBuffer.h2
-rw-r--r--src/utils/SkBitmapSourceDeserializer.h1
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)
};