Index: src/core/SkCanvas.cpp |
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp |
index 1d37e584193e83fa0979117b964cc6195ba15d77..f35ebf3230dc781b63b8a6278d773d723d4ea4d1 100644 |
--- a/src/core/SkCanvas.cpp |
+++ b/src/core/SkCanvas.cpp |
@@ -480,7 +480,7 @@ public: |
rawBounds = &apply_paint_to_bounds_sans_imagefilter(*fPaint, *rawBounds, &storage); |
} |
(void)canvas->internalSaveLayer(rawBounds, &tmp, SkCanvas::kARGB_ClipLayer_SaveFlag, |
- SkCanvas::kFullLayer_SaveLayerStrategy); |
+ SkCanvas::kFullLayer_SaveLayerStrategy, nullptr); |
fTempLayerForImageFilter = true; |
// we remove the imagefilter/xfermode inside doNext() |
} |
@@ -1121,12 +1121,18 @@ bool SkCanvas::clipRectBounds(const SkRect* bounds, SaveFlags flags, |
} |
int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint) { |
+ return this->saveLayerWithPickup(bounds, paint, nullptr); |
+} |
+ |
+int SkCanvas::saveLayerWithPickup(const SkRect* bounds, const SkPaint* paint, |
+ SkImageFilter* pickup) { |
if (gIgnoreSaveLayerBounds) { |
bounds = nullptr; |
} |
- SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, kARGB_ClipLayer_SaveFlag); |
+ SaveFlags flags = kARGB_ClipLayer_SaveFlag; |
+ SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
fSaveCount += 1; |
- this->internalSaveLayer(bounds, paint, kARGB_ClipLayer_SaveFlag, strategy); |
+ this->internalSaveLayer(bounds, paint, flags, strategy, pickup); |
return this->getSaveCount() - 1; |
} |
@@ -1136,7 +1142,7 @@ int SkCanvas::saveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags fl |
} |
SaveLayerStrategy strategy = this->willSaveLayer(bounds, paint, flags); |
fSaveCount += 1; |
- this->internalSaveLayer(bounds, paint, flags, strategy); |
+ this->internalSaveLayer(bounds, paint, flags, strategy, nullptr); |
return this->getSaveCount() - 1; |
} |
@@ -1145,9 +1151,17 @@ int SkCanvas::saveLayerPreserveLCDTextRequests(const SkRect* bounds, const SkPai |
return this->saveLayer(bounds, paint, (SaveFlags)flags); |
} |
+static void draw_filter_into_device(SkBaseDevice* src, SkImageFilter* filter, SkBaseDevice* dst) { |
+ SkCanvas c(dst); |
+ |
+ const SkBitmap& srcBM = src->accessBitmap(false); |
+ SkPaint p; |
+ p.setImageFilter(filter); |
+ c.drawBitmap(srcBM, 0, 0, &p); |
+} |
void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags, |
- SaveLayerStrategy strategy) { |
+ SaveLayerStrategy strategy, SkImageFilter* pickup) { |
#ifndef SK_SUPPORT_LEGACY_CLIPTOLAYERFLAG |
flags |= kClipToLayer_SaveFlag; |
#endif |
@@ -1208,8 +1222,12 @@ void SkCanvas::internalSaveLayer(const SkRect* bounds, const SkPaint* paint, Sav |
} |
device = newDev; |
} |
- |
device->setOrigin(ir.fLeft, ir.fTop); |
+ |
+ if (pickup) { |
+ draw_filter_into_device(fMCRec->fTopLayer->fDevice, pickup, device); |
+ } |
+ |
DeviceCM* layer = |
new DeviceCM(device, paint, this, fConservativeRasterClip, forceSpriteOnRestore); |
device->unref(); |