diff options
-rw-r--r-- | include/effects/SkRectShaderImageFilter.h | 3 | ||||
-rw-r--r-- | src/effects/SkRectShaderImageFilter.cpp | 40 |
2 files changed, 24 insertions, 19 deletions
diff --git a/include/effects/SkRectShaderImageFilter.h b/include/effects/SkRectShaderImageFilter.h index a71ee42742..5ad11c104c 100644 --- a/include/effects/SkRectShaderImageFilter.h +++ b/include/effects/SkRectShaderImageFilter.h @@ -33,9 +33,8 @@ protected: SkBitmap* result, SkIPoint* loc) SK_OVERRIDE; private: - SkRectShaderImageFilter(SkShader* s, const SkRect& rect); + SkRectShaderImageFilter(SkShader* s, const CropRect* rect); SkShader* fShader; - SkRect fRect; typedef SkImageFilter INHERITED; }; 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; } |