diff options
author | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-10-10 21:36:48 +0000 |
---|---|---|
committer | senorblanco@chromium.org <senorblanco@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81> | 2013-10-10 21:36:48 +0000 |
commit | e258eb34a8ad7a6ea9546e5096da172cf2380cbd (patch) | |
tree | be7410f6e27ac6b4ff90c2c9f11bdb6781d31900 /src/effects/SkRectShaderImageFilter.cpp | |
parent | c95e1e5d8f1f970a1f55e24fdb8593c3f545470f (diff) |
Implement crop rect support for SkRectShaderImageFilter: remove fRect and use the cropRect from SkImageFilter in its place.
R=reed@google.com
Review URL: https://codereview.chromium.org/26009004
git-svn-id: http://skia.googlecode.com/svn/trunk@11720 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/effects/SkRectShaderImageFilter.cpp')
-rw-r--r-- | src/effects/SkRectShaderImageFilter.cpp | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/effects/SkRectShaderImageFilter.cpp b/src/effects/SkRectShaderImageFilter.cpp index 2ee1d4a2ed..b1faebc813 100644 --- a/src/effects/SkRectShaderImageFilter.cpp +++ b/src/effects/SkRectShaderImageFilter.cpp @@ -14,13 +14,18 @@ SkRectShaderImageFilter* SkRectShaderImageFilter::Create(SkShader* s, const SkRect& rect) { SkASSERT(s); - return SkNEW_ARGS(SkRectShaderImageFilter, (s, rect)); +#ifdef SK_CROP_RECT_IS_INT + SkIRect cropRect; + rect.roundOut(&cropRect); +#else + CropRect cropRect(rect); +#endif + return SkNEW_ARGS(SkRectShaderImageFilter, (s, &cropRect)); } -SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const SkRect& rect) - : INHERITED(NULL) - , fShader(s) - , fRect(rect) { +SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const CropRect* cropRect) + : INHERITED(NULL, cropRect) + , fShader(s) { SkASSERT(s); s->ref(); } @@ -28,14 +33,12 @@ SkRectShaderImageFilter::SkRectShaderImageFilter(SkShader* s, const SkRect& rect SkRectShaderImageFilter::SkRectShaderImageFilter(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { fShader = buffer.readFlattenableT<SkShader>(); - buffer.readRect(&fRect); } void SkRectShaderImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); buffer.writeFlattenable(fShader); - buffer.writeRect(fRect); } SkRectShaderImageFilter::~SkRectShaderImageFilter() { @@ -44,24 +47,27 @@ SkRectShaderImageFilter::~SkRectShaderImageFilter() { bool SkRectShaderImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& source, - const SkMatrix&, + const SkMatrix& ctm, SkBitmap* result, - SkIPoint*) { - SkRect rect(fRect); - if (rect.isEmpty()) { - rect = SkRect::MakeWH(SkIntToScalar(source.width()), SkIntToScalar(source.height())); - } - - if (rect.isEmpty()) { + SkIPoint* offset) { + SkIRect bounds; + source.getBounds(&bounds); + if (!this->applyCropRect(&bounds, ctm)) { return false; } - SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(SkScalarCeilToInt(rect.width()), - SkScalarCeilToInt(rect.height()))); + SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(bounds.width(), + bounds.height())); SkCanvas canvas(device.get()); SkPaint paint; paint.setShader(fShader); + SkMatrix matrix; + matrix.setTranslate(-SkIntToScalar(bounds.fLeft), -SkIntToScalar(bounds.fTop)); + fShader->setLocalMatrix(matrix); + SkRect rect = SkRect::MakeWH(SkIntToScalar(bounds.width()), SkIntToScalar(bounds.height())); canvas.drawRect(rect, paint); *result = device.get()->accessBitmap(false); + offset->fX += bounds.fLeft; + offset->fY += bounds.fTop; return true; } |