Index: src/effects/SkXfermodeImageFilter.cpp |
diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp |
index 3ab52950be3f40227ba975b800bbdb3cdedb27e0..4674ff44abaab59d1bd8193182bc02816c9bc6cf 100644 |
--- a/src/effects/SkXfermodeImageFilter.cpp |
+++ b/src/effects/SkXfermodeImageFilter.cpp |
@@ -61,21 +61,22 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy, |
return false; |
} |
- SkIRect bounds; |
+ SkIRect bounds, foregroundBounds; |
background.getBounds(&bounds); |
+ bounds.offset(backgroundOffset); |
+ foreground.getBounds(&foregroundBounds); |
+ foregroundBounds.offset(foregroundOffset); |
+ bounds.join(foregroundBounds); |
if (!applyCropRect(&bounds, ctm)) { |
return false; |
} |
- backgroundOffset.fX -= bounds.left(); |
- backgroundOffset.fY -= bounds.top(); |
- foregroundOffset.fX -= bounds.left(); |
- foregroundOffset.fY -= bounds.top(); |
SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); |
if (NULL == device.get()) { |
return false; |
} |
SkCanvas canvas(device); |
+ canvas.translate(SkIntToScalar(-bounds.left()), SkIntToScalar(-bounds.top())); |
SkPaint paint; |
paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), |
@@ -83,6 +84,9 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy, |
paint.setXfermode(fMode); |
canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), |
SkIntToScalar(foregroundOffset.fY), &paint); |
+ canvas.clipRect(SkRect::Make(foregroundBounds), SkRegion::kDifference_Op); |
+ paint.setColor(SK_ColorTRANSPARENT); |
+ canvas.drawPaint(paint); |
*dst = device->accessBitmap(false); |
offset->fX += bounds.left(); |
offset->fY += bounds.top(); |