* e.g. compose(filter, compose(compose(filter, filter), filter)) --> 4
*/
virtual int privateComposedFilterCount() const { return 1; }
+
+ /*
+ * Returns true and sets |outer| and |inner| if this is a compose color filter.
+ * Returns false otherwise.
+ */
+ virtual bool asACompose(SkColorFilter** /*outer*/, SkColorFilter** /*inner*/) const {
+ return false;
+ }
+
+ friend class SkColorSpaceXformer;
friend class SkComposeColorFilter;
typedef SkFlattenable INHERITED;
return fComposedFilterCount;
}
+ bool asACompose(SkColorFilter** outer, SkColorFilter** inner) const override {
+ *outer = fOuter.get();
+ *inner = fInner.get();
+ return true;
+ }
+
sk_sp<SkColorFilter> fOuter;
sk_sp<SkColorFilter> fInner;
const int fComposedFilterCount;
return xformed;
}
-// As far as I know, SkModeColorFilter is the only color filter that holds a color.
+// 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;
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));
}