diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 21:00:58 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-12-12 21:00:58 +0000 |
commit | 6f0382ecf74fd0b4921f52404b4d1a7a10229216 (patch) | |
tree | 5e9813d7adc6faf0e6cdea5ebe562894fd986cca | |
parent | f2d0cd78dd0eabb327709c5c03b0b782e7732700 (diff) | |
download | src-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.cpp | 14 |
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(); |