Index: src/effects/SkColorFilterImageFilter.cpp |
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp |
index fdf6de7b76daf755f2fea5d49c87a753374e3cb7..1f7f7505f32c95b1454f9cac96cc85ad0a130bcf 100755 |
--- a/src/effects/SkColorFilterImageFilter.cpp |
+++ b/src/effects/SkColorFilterImageFilter.cpp |
@@ -21,13 +21,13 @@ SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf, |
return NULL; |
} |
- SkColorFilter* inputColorFilter; |
- if (input && input->asColorFilter(&inputColorFilter)) { |
- SkAutoUnref autoUnref(inputColorFilter); |
- SkAutoTUnref<SkColorFilter> newCF(cf->newComposed(inputColorFilter)); |
- if (newCF) { |
- return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0)); |
- } |
+ SkColorFilter* inputCF; |
+ if (!cropRect && input && input->asColorFilter(&inputCF)) { |
Stephen White
2015/03/04 19:38:37
I'm not sure this !cropRect check is correct. I th
reed1
2015/03/04 20:00:58
Agreed.
|
+ // This is an optimization, as it collapses the hierarchy by just combining the |
+ // colorfilters into a single imagefilter. |
+ SkAutoUnref autoUnref(inputCF); |
+ SkAutoTUnref<SkColorFilter> newCF(SkColorFilter::CreateComposeFilter(cf, inputCF)); |
+ return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0)); |
} |
return SkNEW_ARGS(SkColorFilterImageFilter, (cf, input, cropRect, uniqueID)); |
@@ -86,10 +86,13 @@ bool SkColorFilterImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& sourc |
} |
bool SkColorFilterImageFilter::asColorFilter(SkColorFilter** filter) const { |
- if (!cropRectIsSet()) { |
+ if (!this->cropRectIsSet()) { |
+ SkASSERT(1 == this->countInputs()); |
+ // Since our factory has already performed the collapse optimization, we can assert that |
+ // if we have an input, it is *not* also a colorfilter. |
+ SkASSERT(!this->getInput(0) || !this->getInput(0)->asColorFilter(NULL)); |
if (filter) { |
- *filter = fColorFilter; |
- fColorFilter->ref(); |
+ *filter = SkRef(fColorFilter); |
} |
return true; |
} |