diff options
Diffstat (limited to 'chromium/third_party/skia/src/effects/SkTileImageFilter.cpp')
-rw-r--r-- | chromium/third_party/skia/src/effects/SkTileImageFilter.cpp | 50 |
1 files changed, 37 insertions, 13 deletions
diff --git a/chromium/third_party/skia/src/effects/SkTileImageFilter.cpp b/chromium/third_party/skia/src/effects/SkTileImageFilter.cpp index 73e5304adb3..73c0a581e98 100644 --- a/chromium/third_party/skia/src/effects/SkTileImageFilter.cpp +++ b/chromium/third_party/skia/src/effects/SkTileImageFilter.cpp @@ -9,37 +9,44 @@ #include "SkBitmap.h" #include "SkCanvas.h" #include "SkDevice.h" -#include "SkFlattenableBuffers.h" +#include "SkReadBuffer.h" +#include "SkWriteBuffer.h" #include "SkMatrix.h" #include "SkPaint.h" #include "SkShader.h" #include "SkValidationUtils.h" -bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const SkMatrix& ctm, - SkBitmap* dst, SkIPoint* offset) { +bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, + const Context& ctx, + SkBitmap* dst, SkIPoint* offset) const { SkBitmap source = src; SkImageFilter* input = getInput(0); - SkIPoint localOffset = SkIPoint::Make(0, 0); - if (input && !input->filterImage(proxy, src, ctm, &source, &localOffset)) { + SkIPoint srcOffset = SkIPoint::Make(0, 0); + if (input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) { return false; } SkRect dstRect; - ctm.mapRect(&dstRect, fDstRect); - int w = SkScalarCeilToInt(dstRect.width()); - int h = SkScalarCeilToInt(dstRect.height()); + ctx.ctm().mapRect(&dstRect, fDstRect); + SkIRect dstIRect; + dstRect.roundOut(&dstIRect); + int w = dstIRect.width(); + int h = dstIRect.height(); if (!fSrcRect.width() || !fSrcRect.height() || !w || !h) { return false; } SkRect srcRect; - ctm.mapRect(&srcRect, fSrcRect); + ctx.ctm().mapRect(&srcRect, fSrcRect); SkIRect srcIRect; srcRect.roundOut(&srcIRect); + srcIRect.offset(-srcOffset); SkBitmap subset; SkIRect bounds; source.getBounds(&bounds); + if (!srcIRect.intersect(bounds)) { + offset->fX = offset->fY = 0; return true; } else if (!source.extractSubset(&subset, srcIRect)) { return false; @@ -53,23 +60,40 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src, const S SkPaint paint; paint.setXfermodeMode(SkXfermode::kSrc_Mode); + SkMatrix shaderMatrix; + shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX), + SkIntToScalar(srcOffset.fY)); SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(subset, - SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode)); + SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, + &shaderMatrix)); paint.setShader(shader); - dstRect.offset(SkIntToScalar(localOffset.fX), SkIntToScalar(localOffset.fY)); + canvas.translate(-dstRect.fLeft, -dstRect.fTop); canvas.drawRect(dstRect, paint); *dst = device->accessBitmap(false); + offset->fX = dstIRect.fLeft; + offset->fY = dstIRect.fTop; + return true; +} + +bool SkTileImageFilter::onFilterBounds(const SkIRect& src, const SkMatrix& ctm, + SkIRect* dst) const { + SkRect srcRect; + ctm.mapRect(&srcRect, fSrcRect); + SkIRect srcIRect; + srcRect.roundOut(&srcIRect); + srcIRect.join(src); + *dst = srcIRect; return true; } -SkTileImageFilter::SkTileImageFilter(SkFlattenableReadBuffer& buffer) +SkTileImageFilter::SkTileImageFilter(SkReadBuffer& buffer) : INHERITED(1, buffer) { buffer.readRect(&fSrcRect); buffer.readRect(&fDstRect); buffer.validate(buffer.isValid() && SkIsValidRect(fSrcRect) && SkIsValidRect(fDstRect)); } -void SkTileImageFilter::flatten(SkFlattenableWriteBuffer& buffer) const { +void SkTileImageFilter::flatten(SkWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); buffer.writeRect(fSrcRect); buffer.writeRect(fDstRect); |