Index: src/core/SkFlattenableSerialization.cpp |
diff --git a/src/core/SkFlattenableSerialization.cpp b/src/core/SkFlattenableSerialization.cpp |
index b74c82f051648f77dce5da97b26e21ba53b12e4b..c6bce673f4bedc29c8913d09407d0b57d4a2baf4 100644 |
--- a/src/core/SkFlattenableSerialization.cpp |
+++ b/src/core/SkFlattenableSerialization.cpp |
@@ -9,6 +9,7 @@ |
#include "SkData.h" |
#include "SkFlattenable.h" |
+#include "SkImageFilter.h" |
#include "SkOrderedReadBuffer.h" |
#include "SkOrderedWriteBuffer.h" |
@@ -26,3 +27,27 @@ SkFlattenable* SkDeserializeFlattenable(const void* data, size_t size) { |
SkOrderedReadBuffer buffer(data, size); |
return buffer.readFlattenable(); |
} |
+ |
+bool SkValidateImageFilterRec(SkFlattenable* flattenable) { |
+ if (!flattenable |
+ // This object should always have been sent cross-process, |
+ // so it should always have a factory |
+ || !flattenable->getFactory() |
+ // Only SkImageFilter objects are allowed |
+ || !flattenable->isA(SkFlattenable::IMAGE_FILTER)) |
+ return false; |
+ |
+ // Check that all the inputs are also SkImageFilter objects |
+ SkImageFilter* filter = static_cast<SkImageFilter*>(flattenable); |
+ int nbInputs = filter->countInputs(); |
+ for (int i = 0; i < nbInputs; ++i) |
+ if (!SkValidateImageFilterRec(filter->getInput(i))) |
+ return false; |
+ |
+ return true; |
+} |
+ |
+SkImageFilter* SkValidateImageFilter(SkFlattenable* flattenable) { |
+ return SkValidateImageFilterRec(flattenable) ? |
+ static_cast<SkImageFilter*>(flattenable) : 0; |
+} |