Chromium Code Reviews| Index: src/effects/SkOffsetImageFilter.cpp |
| diff --git a/src/effects/SkOffsetImageFilter.cpp b/src/effects/SkOffsetImageFilter.cpp |
| index ad5e49d776256b8e0c54deb17ca73ed9681dd056..3b98160841bbef6840f2b837592811eb92ad343a 100644 |
| --- a/src/effects/SkOffsetImageFilter.cpp |
| +++ b/src/effects/SkOffsetImageFilter.cpp |
| @@ -7,24 +7,51 @@ |
| #include "SkOffsetImageFilter.h" |
| #include "SkBitmap.h" |
| -#include "SkMatrix.h" |
| +#include "SkCanvas.h" |
| +#include "SkDevice.h" |
| #include "SkFlattenableBuffers.h" |
| +#include "SkMatrix.h" |
| +#include "SkPaint.h" |
| bool SkOffsetImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source, |
| const SkMatrix& matrix, |
| SkBitmap* result, |
| SkIPoint* loc) { |
| + SkImageFilter* input = getInput(0); |
| SkBitmap src = source; |
| - if (getInput(0) && !getInput(0)->filterImage(proxy, source, matrix, &src, loc)) { |
| - return false; |
| - } |
| + if (cropRect().isLargest()) { |
| + if (input && !input->filterImage(proxy, source, matrix, &src, loc)) { |
| + return false; |
| + } |
| - SkVector vec; |
| - matrix.mapVectors(&vec, &fOffset, 1); |
| + SkVector vec; |
| + matrix.mapVectors(&vec, &fOffset, 1); |
| - loc->fX += SkScalarRoundToInt(vec.fX); |
| - loc->fY += SkScalarRoundToInt(vec.fY); |
| - *result = src; |
| + loc->fX += SkScalarRoundToInt(vec.fX); |
| + loc->fY += SkScalarRoundToInt(vec.fY); |
| + *result = src; |
| + } else { |
| + SkIPoint srcOffset = SkIPoint::Make(0, 0); |
|
sugoi1
2013/09/23 18:37:30
@senorblanco : Was there a reason here why we aren
Stephen White
2013/09/24 01:13:19
Since this path draws its input into a buffer, it'
sugoi1
2013/09/24 11:39:50
Thanks for the explanation, I wanted to make sure
|
| + if (input && !input->filterImage(proxy, source, matrix, &src, &srcOffset)) { |
| + return false; |
| + } |
| + |
| + SkIRect bounds; |
| + src.getBounds(&bounds); |
| + |
| + if (!applyCropRect(&bounds, matrix)) { |
| + return false; |
| + } |
| + |
| + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), bounds.height())); |
| + SkCanvas canvas(device); |
| + SkPaint paint; |
| + paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| + canvas.drawBitmap(src, fOffset.fX - bounds.left(), fOffset.fY - bounds.top(), &paint); |
| + *result = device->accessBitmap(false); |
| + loc->fX += bounds.left(); |
| + loc->fY += bounds.top(); |
| + } |
| return true; |
| } |
| @@ -43,8 +70,8 @@ void SkOffsetImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { |
| buffer.writePoint(fOffset); |
| } |
| -SkOffsetImageFilter::SkOffsetImageFilter(SkScalar dx, SkScalar dy, |
| - SkImageFilter* input) : INHERITED(input) { |
| +SkOffsetImageFilter::SkOffsetImageFilter(SkScalar dx, SkScalar dy, SkImageFilter* input, |
| + const SkIRect* cropRect) : INHERITED(input, cropRect) { |
| fOffset.set(dx, dy); |
| } |