Chromium Code Reviews| Index: src/effects/SkXfermodeImageFilter.cpp |
| diff --git a/src/effects/SkXfermodeImageFilter.cpp b/src/effects/SkXfermodeImageFilter.cpp |
| index 898bad11006b51e70f351f89822b592110aa9dac..cde03116703149b37204e30d3f6c7f5c226fb005 100644 |
| --- a/src/effects/SkXfermodeImageFilter.cpp |
| +++ b/src/effects/SkXfermodeImageFilter.cpp |
| @@ -7,6 +7,7 @@ |
| #include "SkXfermodeImageFilter.h" |
| #include "SkCanvas.h" |
| +#include "SkDevice.h" |
| #include "SkColorPriv.h" |
| #include "SkFlattenableBuffers.h" |
| #include "SkXfermode.h" |
| @@ -21,8 +22,9 @@ |
| SkXfermodeImageFilter::SkXfermodeImageFilter(SkXfermode* mode, |
| SkImageFilter* background, |
| - SkImageFilter* foreground) |
| - : INHERITED(background, foreground), fMode(mode) { |
| + SkImageFilter* foreground, |
| + const SkIRect* cropRect) |
| + : INHERITED(background, foreground, cropRect), fMode(mode) { |
| SkSafeRef(fMode); |
| } |
| @@ -58,19 +60,45 @@ bool SkXfermodeImageFilter::onFilterImage(Proxy* proxy, |
| !foregroundInput->filterImage(proxy, src, ctm, &foreground, &foregroundOffset)) { |
| return false; |
| } |
| - dst->setConfig(background.config(), background.width(), background.height()); |
| - dst->allocPixels(); |
| - SkCanvas canvas(*dst); |
| - SkPaint paint; |
| - paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| - canvas.drawBitmap(background, 0, 0, &paint); |
| - paint.setXfermode(fMode); |
| - canvas.drawBitmap(foreground, |
| - SkIntToScalar(foregroundOffset.fX - backgroundOffset.fX), |
| - SkIntToScalar(foregroundOffset.fY - backgroundOffset.fY), |
| - &paint); |
| - offset->fX += backgroundOffset.fX; |
| - offset->fY += backgroundOffset.fY; |
| + |
| + if (cropRect().isLargest()) { |
|
Stephen White
2013/09/24 23:14:13
I think the code you've added below should work fo
sugoi1
2013/09/25 15:41:08
Done.
|
| + dst->setConfig(background.config(), background.width(), background.height()); |
| + dst->allocPixels(); |
| + SkCanvas canvas(*dst); |
| + SkPaint paint; |
| + paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| + canvas.drawBitmap(background, 0, 0, &paint); |
| + paint.setXfermode(fMode); |
| + canvas.drawBitmap(foreground, |
| + SkIntToScalar(foregroundOffset.fX - backgroundOffset.fX), |
| + SkIntToScalar(foregroundOffset.fY - backgroundOffset.fY), |
| + &paint); |
| + offset->fX += backgroundOffset.fX; |
| + offset->fY += backgroundOffset.fY; |
| + } else { |
| + SkIRect bounds; |
| + background.getBounds(&bounds); |
| + 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())); |
| + SkCanvas canvas(device); |
| + SkPaint paint; |
| + paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| + canvas.drawBitmap(background, SkIntToScalar(backgroundOffset.fX), |
| + SkIntToScalar(backgroundOffset.fY), &paint); |
| + paint.setXfermode(fMode); |
| + canvas.drawBitmap(foreground, SkIntToScalar(foregroundOffset.fX), |
| + SkIntToScalar(foregroundOffset.fY), &paint); |
| + *dst = device->accessBitmap(false); |
| + offset->fX += bounds.left(); |
| + offset->fY += bounds.top(); |
| + } |
| return true; |
| } |