diff options
author | 2015-03-05 10:22:20 -0800 | |
---|---|---|
committer | 2015-03-05 10:22:20 -0800 | |
commit | dac843bf046c2cd79fd955cb177aee241d7a4b0c (patch) | |
tree | 9a0d9a9160ae4c53ba14bdee9fadb5fb725340ed /src/effects/SkColorFilterImageFilter.cpp | |
parent | bca3c9fb2d5c043985b878633e9630cf12e04bd6 (diff) |
Use ComposeColorFilter in factory to collapse consecutive filters (when possible).
Change asColorFilter to reflect its reliance on the new factory behavior.
patch from issue 967143002 at patchset 80001 (http://crrev.com/967143002#ps80001)
BUG=skia:
Review URL: https://codereview.chromium.org/967833003
Diffstat (limited to 'src/effects/SkColorFilterImageFilter.cpp')
-rwxr-xr-x | src/effects/SkColorFilterImageFilter.cpp | 19 |
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; } |