Chromium Code Reviews| Index: src/core/SkCanvas.cpp |
| diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
| index c10d390f56f61396fa2ddbb55d35ab70637f577c..bc9bdea65fafd21292c1153f9fd40c70bde96c6e 100644 |
| --- a/src/core/SkCanvas.cpp |
| +++ b/src/core/SkCanvas.cpp |
| @@ -8,6 +8,7 @@ |
| #include "SkCanvas.h" |
| #include "SkCanvasPriv.h" |
| #include "SkBitmapDevice.h" |
| +#include "SkColorFilter.h" |
| #include "SkDeviceImageFilterProxy.h" |
| #include "SkDraw.h" |
| #include "SkDrawable.h" |
| @@ -283,6 +284,10 @@ private: |
| ///////////////////////////////////////////////////////////////////////////// |
| +static SkPaint* set_if_needed(SkLazyPaint* lazy, const SkPaint& orig) { |
| + return lazy->isValid() ? lazy->get() : lazy->set(orig); |
| +} |
| + |
| class AutoDrawLooper { |
| public: |
| AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint& paint, |
| @@ -295,9 +300,23 @@ public: |
| fDoClearImageFilter = false; |
| fDone = false; |
| - if (!skipLayerForImageFilter && fOrigPaint.getImageFilter()) { |
| + // Transform imagefilter into colorfilter? |
| + if (fOrigPaint.getImageFilter()) { |
| + SkColorFilter* embeddedCF = NULL; |
| + SkColorFilter* paintCF = fOrigPaint.getColorFilter(); |
| + // When we fix http://code.google.com/p/skia/issues/detail?id=3479 we can support |
| + // composing paintCF w/ embeddedCF. |
| + if (NULL == paintCF && fOrigPaint.getImageFilter()->asColorFilter(&embeddedCF)) { |
|
Stephen White
2015/03/02 18:50:22
Need to check for !getInput(0) here?
reed2
2015/03/08 21:39:45
asAColorFilter takes care of that check.
|
| + SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); |
| + paint->setColorFilter(embeddedCF)->unref(); |
| + paint->setImageFilter(NULL); |
| + fPaint = paint; |
| + } |
| + } |
| + |
| + if (!skipLayerForImageFilter && fPaint->getImageFilter()) { |
| SkPaint tmp; |
| - tmp.setImageFilter(fOrigPaint.getImageFilter()); |
| + tmp.setImageFilter(fPaint->getImageFilter()); |
| (void)canvas->internalSaveLayer(bounds, &tmp, SkCanvas::kARGB_ClipLayer_SaveFlag, |
| true, SkCanvas::kFullLayer_SaveLayerStrategy); |
| // we'll clear the imageFilter for the actual draws in next(), so |
| @@ -319,7 +338,7 @@ public: |
| uint32_t oldFlags = paint.getFlags(); |
| fNewPaintFlags = filter_paint_flags(props, oldFlags); |
| if (fIsSimple && (fNewPaintFlags != oldFlags)) { |
| - SkPaint* paint = fLazyPaint.set(fOrigPaint); |
| + SkPaint* paint = set_if_needed(&fLazyPaintInit, fOrigPaint); |
| paint->setFlags(fNewPaintFlags); |
| fPaint = paint; |
| // if we're not simple, doNext() will take care of calling setFlags() |
| @@ -350,7 +369,7 @@ public: |
| } |
| private: |
| - SkLazyPaint fLazyPaint; |
| + SkLazyPaint fLazyPaintInit, fLazyPaintPerNext; |
| SkCanvas* fCanvas; |
| const SkPaint& fOrigPaint; |
| SkDrawFilter* fFilter; |
| @@ -371,7 +390,7 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
| SkASSERT(!fIsSimple); |
| SkASSERT(fLooperContext || fFilter || fDoClearImageFilter); |
| - SkPaint* paint = fLazyPaint.set(fOrigPaint); |
| + SkPaint* paint = fLazyPaintPerNext.set(fLazyPaintInit.isValid() ? *fLazyPaintInit.get() : fOrigPaint); |
| paint->setFlags(fNewPaintFlags); |
| if (fDoClearImageFilter) { |