SkColorFilter::makeColorSpace()

Change-Id: Idea4afac67ef348c2f4e64f4fe6a03704a86652f
Reviewed-on: https://skia-review.googlesource.com/14375
Reviewed-by: Matt Sarett <msarett@google.com>
Commit-Queue: Mike Klein <mtklein@chromium.org>
diff --git a/include/core/SkColorFilter.h b/include/core/SkColorFilter.h
index 3fb27fa..f843df7 100644
--- a/include/core/SkColorFilter.h
+++ b/include/core/SkColorFilter.h
@@ -18,6 +18,7 @@
 class SkArenaAlloc;
 class SkBitmap;
 class SkColorSpace;
+class SkColorSpaceXformer;
 class SkRasterPipeline;
 
 /**
@@ -163,6 +164,13 @@
     virtual bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
                                 bool shaderIsOpaque) const;
 
+    sk_sp<SkColorFilter> makeColorSpace(SkColorSpaceXformer* xformer) const {
+        return this->onMakeColorSpace(xformer);
+    }
+    virtual sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer*) const {
+        return sk_ref_sp(const_cast<SkColorFilter*>(this));
+    }
+
 private:
     /*
      *  Returns 1 if this is a single filter (not a composition of other filters), otherwise it
diff --git a/src/core/SkColorFilter.cpp b/src/core/SkColorFilter.cpp
index 210ca6d..b82808d 100644
--- a/src/core/SkColorFilter.cpp
+++ b/src/core/SkColorFilter.cpp
@@ -5,16 +5,17 @@
  * found in the LICENSE file.
  */
 
-#include "SkColorFilter.h"
 #include "SkArenaAlloc.h"
+#include "SkColorFilter.h"
+#include "SkColorSpaceXformer.h"
+#include "SkNx.h"
+#include "SkPM4f.h"
 #include "SkReadBuffer.h"
 #include "SkRefCnt.h"
 #include "SkString.h"
 #include "SkTDArray.h"
 #include "SkUnPreMultiply.h"
 #include "SkWriteBuffer.h"
-#include "SkPM4f.h"
-#include "SkNx.h"
 
 #if SK_SUPPORT_GPU
 #include "GrFragmentProcessor.h"
@@ -161,6 +162,11 @@
         return true;
     }
 
+    sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer* xformer) const override {
+        return SkColorFilter::MakeComposeFilter(xformer->apply(fOuter.get()),
+                                                xformer->apply(fInner.get()));
+    }
+
     sk_sp<SkColorFilter> fOuter;
     sk_sp<SkColorFilter> fInner;
     const int            fComposedFilterCount;
diff --git a/src/core/SkColorSpaceXformer.cpp b/src/core/SkColorSpaceXformer.cpp
index ce6fff6..a51e2e6 100644
--- a/src/core/SkColorSpaceXformer.cpp
+++ b/src/core/SkColorSpaceXformer.cpp
@@ -44,23 +44,8 @@
     return xformed;
 }
 
-// Currently, SkModeColorFilter is the only color filter that holds a color.  And
-// SkComposeColorFilter is the only color filter that holds another color filter.  If this
-// changes, this function will need updating.
 sk_sp<SkColorFilter> SkColorSpaceXformer::apply(const SkColorFilter* colorFilter) {
-    SkColor color;
-    SkBlendMode mode;
-    if (colorFilter->asColorMode(&color, &mode)) {
-        return SkColorFilter::MakeModeFilter(this->apply(color), mode);
-    }
-
-    SkColorFilter* outer;
-    SkColorFilter* inner;
-    if (colorFilter->asACompose(&outer, &inner)) {
-        return SkColorFilter::MakeComposeFilter(this->apply(outer), this->apply(inner));
-    }
-
-    return sk_ref_sp(const_cast<SkColorFilter*>(colorFilter));
+    return colorFilter->makeColorSpace(this);
 }
 
 sk_sp<SkImageFilter> SkColorSpaceXformer::apply(const SkImageFilter* imageFilter) {
diff --git a/src/core/SkModeColorFilter.cpp b/src/core/SkModeColorFilter.cpp
index d074482..7978f93 100644
--- a/src/core/SkModeColorFilter.cpp
+++ b/src/core/SkModeColorFilter.cpp
@@ -5,21 +5,22 @@
  * found in the LICENSE file.
  */
 
-#include "SkBlitRow.h"
+#include "SkArenaAlloc.h"
 #include "SkBlendModePriv.h"
+#include "SkBlitRow.h"
 #include "SkColorFilter.h"
 #include "SkColorPriv.h"
-#include "SkArenaAlloc.h"
+#include "SkColorSpaceXformer.h"
 #include "SkModeColorFilter.h"
+#include "SkPM4f.h"
 #include "SkPM4fPriv.h"
+#include "SkRandom.h"
 #include "SkRasterPipeline.h"
 #include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
-#include "SkUtils.h"
-#include "SkRandom.h"
 #include "SkString.h"
+#include "SkUtils.h"
 #include "SkValidationUtils.h"
-#include "SkPM4f.h"
+#include "SkWriteBuffer.h"
 
 //////////////////////////////////////////////////////////////////////////////////////////////////
 
@@ -103,6 +104,10 @@
     return true;
 }
 
+sk_sp<SkColorFilter> SkModeColorFilter::onMakeColorSpace(SkColorSpaceXformer* xformer) const {
+    return SkColorFilter::MakeModeFilter(xformer->apply(fColor), fMode);
+}
+
 ///////////////////////////////////////////////////////////////////////////////
 #if SK_SUPPORT_GPU
 #include "GrBlend.h"
diff --git a/src/core/SkModeColorFilter.h b/src/core/SkModeColorFilter.h
index 4d0b172..d51a623 100644
--- a/src/core/SkModeColorFilter.h
+++ b/src/core/SkModeColorFilter.h
@@ -47,6 +47,8 @@
     bool onAppendStages(SkRasterPipeline*, SkColorSpace*, SkArenaAlloc*,
                         bool shaderIsOpaque) const override;
 
+    sk_sp<SkColorFilter> onMakeColorSpace(SkColorSpaceXformer*) const override;
+
 private:
     SkColor             fColor;
     SkBlendMode         fMode;