Chromium Code Reviews| Index: src/core/SkCanvas.cpp |
| diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
| index c10d390f56f61396fa2ddbb55d35ab70637f577c..4600615d08faae47c861bddc287f9b959801201f 100644 |
| --- a/src/core/SkCanvas.cpp |
| +++ b/src/core/SkCanvas.cpp |
| @@ -236,6 +236,8 @@ public: |
| fClipStack = canvas->fClipStack.get(); |
| fCurrLayer = canvas->fMCRec->fTopLayer; |
| fSkipEmptyClips = skipEmptyClips; |
| + |
| + fDrawFilter = fCanvas->getDrawFilter(); |
|
reed1
2015/03/03 21:26:22
nit: cavas-> instead of fCanvas, just to match the
|
| } |
| bool next() { |
| @@ -286,14 +288,15 @@ private: |
| class AutoDrawLooper { |
| public: |
| AutoDrawLooper(SkCanvas* canvas, const SkSurfaceProps& props, const SkPaint& paint, |
| - bool skipLayerForImageFilter = false, |
| - const SkRect* bounds = NULL) : fOrigPaint(paint) { |
| - fCanvas = canvas; |
| - fFilter = canvas->getDrawFilter(); |
| - fPaint = &fOrigPaint; |
| - fSaveCount = canvas->getSaveCount(); |
| - fDoClearImageFilter = false; |
| - fDone = false; |
| + bool skipLayerForImageFilter, bool skipDrawFilter, |
| + const SkRect* bounds = NULL) |
| + : fCanvas(canvas) |
| + , fOrigPaint(paint) |
| + , fFilter(skipDrawFilter ? NULL : canvas->getDrawFilter()) |
| + , fPaint(&fOrigPaint) |
| + , fSaveCount(canvas->getSaveCount()) |
| + , fDoClearImageFilter(false) |
| + , fDone(false) { |
| if (!skipLayerForImageFilter && fOrigPaint.getImageFilter()) { |
| SkPaint tmp; |
| @@ -411,13 +414,19 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) { |
| #define LOOPER_BEGIN_DRAWDEVICE(paint, type) \ |
| this->predrawNotify(); \ |
| - AutoDrawLooper looper(this, fProps, paint, true); \ |
| + AutoDrawLooper looper(this, fProps, paint, true, false); \ |
| while (looper.next(type)) { \ |
| SkDrawIter iter(this); |
| #define LOOPER_BEGIN(paint, type, bounds) \ |
| this->predrawNotify(); \ |
| - AutoDrawLooper looper(this, fProps, paint, false, bounds); \ |
| + AutoDrawLooper looper(this, fProps, paint, false, false, bounds); \ |
| + while (looper.next(type)) { \ |
| + SkDrawIter iter(this); |
| + |
| +#define LOOPER_BEGIN_UNFILTERED(paint, type, bounds) \ |
| + this->predrawNotify(); \ |
| + AutoDrawLooper looper(this, fProps, paint, false, true, bounds); \ |
| while (looper.next(type)) { \ |
| SkDrawIter iter(this); |
| @@ -2161,7 +2170,9 @@ void SkCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, |
| } |
| } |
| - LOOPER_BEGIN(paint, SkDrawFilter::kText_Type, NULL) |
| + // Skip draw filters because the actual paint depends on run font info. Draw filters |
| + // are applied at the device level, where we have access to the complete paint. |
| + LOOPER_BEGIN_UNFILTERED(paint, SkDrawFilter::kText_Type, NULL) |
| while (iter.next()) { |
| SkDeviceFilteredPaint dfp(iter.fDevice, looper.paint()); |