summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorsenorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-12 21:00:58 +0000
committersenorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-12-12 21:00:58 +0000
commit6f0382ecf74fd0b4921f52404b4d1a7a10229216 (patch)
tree5e9813d7adc6faf0e6cdea5ebe562894fd986cca
parentf2d0cd78dd0eabb327709c5c03b0b782e7732700 (diff)
downloadsrc-6f0382ecf74fd0b4921f52404b4d1a7a10229216.tar.gz
Bounds fixes for SkXfermodeImageFilter:
1) Change the default bounds to the union of the foreground and background bounds. 2) Use a canvas translate instead of manually offsetting the foreground and background bounds by the union. 3) Apply the transfer mode to all pixels, including those outside the foreground rect by using a difference clip. Covered by the offset test cases in the xfermodeimagefilter GM (will need rebaselines). R=reed@google.com Review URL: https://codereview.chromium.org/112683004 git-svn-id: http://skia.googlecode.com/svn/trunk/src@12652 2bbb7eff-a529-9590-31e7-b0007b416f81
-rw-r--r--effects/SkXfermodeImageFilter.cpp14
1 files changed, 9 insertions, 5 deletions
diff --git a/effects/SkXfermodeImageFilter.cpp b/effects/SkXfermodeImageFilter.cpp
index 3ab52950..4674ff44 100644
--- a/effects/SkXfermodeImageFilter.cpp
+++ b/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();