Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(165)

Unified Diff: src/effects/SkTileImageFilter.cpp

Issue 920513003: Make filters use SkImage instead of SkBitmap Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/effects/SkTestImageFilters.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/effects/SkTileImageFilter.cpp
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
index c5cf51871da4aab697086e21db0611afc3dcae1b..c99d1674636cda2e79776814c25eecf89bff1fbf 100644
--- a/src/effects/SkTileImageFilter.cpp
+++ b/src/effects/SkTileImageFilter.cpp
@@ -9,6 +9,7 @@
#include "SkBitmap.h"
#include "SkCanvas.h"
#include "SkDevice.h"
+#include "SkImage.h"
#include "SkReadBuffer.h"
#include "SkWriteBuffer.h"
#include "SkMatrix.h"
@@ -24,13 +25,13 @@ SkTileImageFilter* SkTileImageFilter::Create(const SkRect& srcRect, const SkRect
return SkNEW_ARGS(SkTileImageFilter, (srcRect, dstRect, input));
}
-bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
+bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkImage* src,
const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
- SkBitmap source = src;
+ SkAutoTUnref<const SkImage>& dst, SkIPoint* offset) const {
+ SkAutoTUnref<const SkImage> source(SkRef(src));
SkImageFilter* input = getInput(0);
SkIPoint srcOffset = SkIPoint::Make(0, 0);
- if (input && !input->filterImage(proxy, src, ctx, &source, &srcOffset)) {
+ if (input && !input->filterImage(proxy, src, ctx, source, &srcOffset)) {
return false;
}
@@ -48,14 +49,14 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
SkIRect srcIRect;
srcRect.roundOut(&srcIRect);
srcIRect.offset(-srcOffset);
- SkBitmap subset;
- SkIRect bounds;
- source.getBounds(&bounds);
+ SkIRect bounds = SkIRect::MakeWH(source->width(), source->height());
if (!srcIRect.intersect(bounds)) {
offset->fX = offset->fY = 0;
return true;
- } else if (!source.extractSubset(&subset, srcIRect)) {
+ }
+ SkAutoTUnref<SkImage> subset(source->newImage(srcIRect.width(), srcIRect.height(), &srcIRect));
+ if (!subset) {
return false;
}
@@ -63,20 +64,28 @@ bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
if (NULL == device.get()) {
return false;
}
- SkCanvas canvas(device);
- SkPaint paint;
- paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ {
+ SkCanvas canvas(device);
+ SkPaint paint;
+ paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+
+ SkMatrix shaderMatrix;
+ shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX),
+ SkIntToScalar(srcOffset.fY));
+ SkAutoTUnref<SkShader> shader(subset->newShader(SkShader::kRepeat_TileMode,
+ SkShader::kRepeat_TileMode, &shaderMatrix));
+
+ paint.setShader(shader);
+ subset.reset(NULL);
+ canvas.translate(-dstRect.fLeft, -dstRect.fTop);
+ canvas.drawRect(dstRect, paint);
+ }
- SkMatrix shaderMatrix;
- shaderMatrix.setTranslate(SkIntToScalar(srcOffset.fX),
- SkIntToScalar(srcOffset.fY));
- SkAutoTUnref<SkShader> shader(SkShader::CreateBitmapShader(subset,
- SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode,
- &shaderMatrix));
- paint.setShader(shader);
- canvas.translate(-dstRect.fLeft, -dstRect.fTop);
- canvas.drawRect(dstRect, paint);
- *dst = device->accessBitmap(false);
+ SkImage* image = device->newImageSnapshot();
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
offset->fX = dstIRect.fLeft;
offset->fY = dstIRect.fTop;
return true;
« no previous file with comments | « src/effects/SkTestImageFilters.cpp ('k') | src/effects/SkXfermodeImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698