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) { |