| 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();
|
|
|