Index: src/core/SkColorFilter.cpp |
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp |
index aadb29cb2df1af9af60d0c909c2d2fd7e33d0af1..d49fc52fa1b68aea0a15b116dc08bb3c1c80daf8 100644 |
--- a/src/core/SkColorFilter.cpp |
+++ b/src/core/SkColorFilter.cpp |
@@ -6,12 +6,9 @@ |
*/ |
#include "SkColorFilter.h" |
- |
#include "SkReadBuffer.h" |
-#include "SkWriteBuffer.h" |
-#include "SkShader.h" |
-#include "SkUnPreMultiply.h" |
#include "SkString.h" |
+#include "SkWriteBuffer.h" |
bool SkColorFilter::asColorMode(SkColor* color, SkXfermode::Mode* mode) const { |
return false; |
@@ -43,3 +40,81 @@ SkColor SkColorFilter::filterColor(SkColor c) const { |
GrFragmentProcessor* SkColorFilter::asFragmentProcessor(GrContext*) const { |
return NULL; |
} |
+ |
+/////////////////////////////////////////////////////////////////////////////////////////////////// |
+ |
+class SkComposeColorFilter : public SkColorFilter { |
+public: |
+ SkComposeColorFilter(SkColorFilter* outer, SkColorFilter* inner) |
+ : fOuter(SkRef(outer)) |
+ , fInner(SkRef(inner)) |
+ {} |
+ |
+ uint32_t getFlags() const SK_OVERRIDE { |
+ // Can only claim alphaunchanged and 16bit support if both our proxys do. |
+ return fOuter->getFlags() & fInner->getFlags(); |
+ } |
+ |
+ void filterSpan(const SkPMColor shader[], int count, SkPMColor result[]) const SK_OVERRIDE { |
+ fInner->filterSpan(shader, count, result); |
+ fOuter->filterSpan(result, count, result); |
+ } |
+ |
+ void filterSpan16(const uint16_t shader[], int count, uint16_t result[]) const SK_OVERRIDE { |
+ SkASSERT(this->getFlags() & kHasFilter16_Flag); |
+ fInner->filterSpan16(shader, count, result); |
+ fOuter->filterSpan16(result, count, result); |
+ } |
+ |
+#ifndef SK_IGNORE_TO_STRING |
+ void toString(SkString* str) const SK_OVERRIDE { |
+ SkString outerS, innerS; |
+ fOuter->toString(&outerS); |
+ fInner->toString(&innerS); |
+ str->appendf("SkComposeColorFilter: outer(%s) inner(%s)", outerS.c_str(), innerS.c_str()); |
+ } |
+#endif |
+ |
+#if 0 // TODO: should we support composing the fragments? |
+#if SK_SUPPORT_GPU |
+ GrFragmentProcessor* asFragmentProcessor(GrContext*) const SK_OVERRIDE; |
+#endif |
+#endif |
+ |
+ SK_DECLARE_PUBLIC_FLATTENABLE_DESERIALIZATION_PROCS(SkComposeColorFilter) |
+ |
+protected: |
+ void flatten(SkWriteBuffer& buffer) const SK_OVERRIDE { |
+ buffer.writeFlattenable(fOuter); |
+ buffer.writeFlattenable(fInner); |
+ } |
+ |
+private: |
+ SkAutoTUnref<SkColorFilter> fOuter; |
+ SkAutoTUnref<SkColorFilter> fInner; |
+ |
+ friend class SkColorFilter; |
+ |
+ typedef SkColorFilter INHERITED; |
+}; |
+ |
+SkFlattenable* SkComposeColorFilter::CreateProc(SkReadBuffer& buffer) { |
+ SkAutoTUnref<SkColorFilter> outer(buffer.readColorFilter()); |
+ SkAutoTUnref<SkColorFilter> inner(buffer.readColorFilter()); |
+ return CreateComposeFilter(outer, inner); |
+} |
+ |
+SkColorFilter* SkColorFilter::CreateComposeFilter(SkColorFilter* outer, SkColorFilter* inner) { |
+ if (!outer) { |
+ return SkSafeRef(inner); |
+ } |
+ if (!inner) { |
+ return SkSafeRef(outer); |
+ } |
+ return SkNEW_ARGS(SkComposeColorFilter, (outer, inner)); |
+} |
+ |
+SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkColorFilter) |
+SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkComposeColorFilter) |
+SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
+ |