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

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, 10 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
Index: src/effects/SkTileImageFilter.cpp
diff --git a/src/effects/SkTileImageFilter.cpp b/src/effects/SkTileImageFilter.cpp
index 669c234d95c7934b456cc6ba208faf8e0286fd40..db13a5967edd901d2ea3f9c917a2594f91fe7cdc 100644
--- a/src/effects/SkTileImageFilter.cpp
+++ b/src/effects/SkTileImageFilter.cpp
@@ -8,7 +8,8 @@
#include "SkTileImageFilter.h"
#include "SkBitmap.h"
#include "SkCanvas.h"
-#include "SkDevice.h"
+#include "SkSurface.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, uniqueID));
}
-bool SkTileImageFilter::onFilterImage(Proxy* proxy, const SkBitmap& src,
+bool SkTileImageFilter::onFilterImage(Proxy* proxy, SkImage& src,
const Context& ctx,
- SkBitmap* dst, SkIPoint* offset) const {
- SkBitmap source = src;
+ SkAutoTUnref<SkImage>& dst, SkIPoint* offset) const {
+ SkAutoTUnref<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,35 +49,43 @@ 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;
}
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(w, h));
- if (NULL == device.get()) {
+ SkAutoTUnref<SkSurface> surface(proxy->createSurface(w, h));
+ if (NULL == surface) {
return false;
}
- SkCanvas canvas(device);
- SkPaint paint;
- paint.setXfermodeMode(SkXfermode::kSrc_Mode);
+ {
+ SkCanvas* canvas = surface->getCanvas();
+ 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 = surface->newImageSnapshot(SkSurface::kYes_Budgeted);
+ if (NULL == image) {
+ return false;
+ }
+ dst.reset(image);
offset->fX = dstIRect.fLeft;
offset->fY = dstIRect.fTop;
return true;

Powered by Google App Engine
This is Rietveld 408576698