aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/effects/SkColorFilterImageFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/effects/SkColorFilterImageFilter.cpp')
-rwxr-xr-xsrc/effects/SkColorFilterImageFilter.cpp19
1 files changed, 12 insertions, 7 deletions
diff --git a/src/effects/SkColorFilterImageFilter.cpp b/src/effects/SkColorFilterImageFilter.cpp
index fdf6de7b76..908f814b94 100755
--- a/src/effects/SkColorFilterImageFilter.cpp
+++ b/src/effects/SkColorFilterImageFilter.cpp
@@ -21,10 +21,12 @@ SkColorFilterImageFilter* SkColorFilterImageFilter::Create(SkColorFilter* cf,
return NULL;
}
- SkColorFilter* inputColorFilter;
- if (input && input->asColorFilter(&inputColorFilter)) {
- SkAutoUnref autoUnref(inputColorFilter);
- SkAutoTUnref<SkColorFilter> newCF(cf->newComposed(inputColorFilter));
+ SkColorFilter* inputCF;
+ if (input && input->asColorFilter(&inputCF)) {
+ // This is an optimization, as it collapses the hierarchy by just combining the two
+ // colorfilters into a single one, which the new imagefilter will wrap.
+ SkAutoUnref autoUnref(inputCF);
+ SkAutoTUnref<SkColorFilter> newCF(SkColorFilter::CreateComposeFilter(cf, inputCF));
if (newCF) {
return SkNEW_ARGS(SkColorFilterImageFilter, (newCF, input->getInput(0), cropRect, 0));
}
@@ -86,10 +88,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;
}