summaryrefslogtreecommitdiffstats
path: root/chromium/third_party/skia/src/effects/SkTileImageFilter.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/third_party/skia/src/effects/SkTileImageFilter.cpp')
-rw-r--r--chromium/third_party/skia/src/effects/SkTileImageFilter.cpp50
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);