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

Unified Diff: src/effects/SkBitmapSource.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/SkBitmapSource.cpp
diff --git a/src/effects/SkBitmapSource.cpp b/src/effects/SkBitmapSource.cpp
index fc86f194b059909651518d6c29da3413c316e36b..384a55eba81a35ac67f8b652164af1b07374a2b7 100644
--- a/src/effects/SkBitmapSource.cpp
+++ b/src/effects/SkBitmapSource.cpp
@@ -6,11 +6,12 @@
*/
#include "SkBitmapSource.h"
-#include "SkDevice.h"
#include "SkCanvas.h"
+#include "SkImagePriv.h"
#include "SkReadBuffer.h"
-#include "SkWriteBuffer.h"
+#include "SkSurface.h"
#include "SkValidationUtils.h"
+#include "SkWriteBuffer.h"
SkBitmapSource::SkBitmapSource(const SkBitmap& bitmap)
: INHERITED(0, 0)
@@ -43,25 +44,29 @@ void SkBitmapSource::flatten(SkWriteBuffer& buffer) const {
buffer.writeBitmap(fBitmap);
}
-bool SkBitmapSource::onFilterImage(Proxy* proxy, const SkBitmap&, const Context& ctx,
- SkBitmap* result, SkIPoint* offset) const {
+bool SkBitmapSource::onFilterImage(Proxy* proxy, SkImage&, const Context& ctx,
+ SkAutoTUnref<SkImage>& result, SkIPoint* offset) const {
SkRect bounds, dstRect;
fBitmap.getBounds(&bounds);
ctx.ctm().mapRect(&dstRect, fDstRect);
if (fSrcRect == bounds && dstRect == bounds) {
// No regions cropped out or resized; return entire bitmap.
- *result = fBitmap;
+ SkImage* image = SkNewImageFromBitmap(fBitmap, true, NULL);
+ if (NULL == image) {
+ return false;
+ }
+ result.reset(image);
offset->fX = offset->fY = 0;
return true;
}
const SkIRect dstIRect = dstRect.roundOut();
- SkAutoTUnref<SkBaseDevice> device(proxy->createDevice(dstIRect.width(), dstIRect.height()));
- if (NULL == device.get()) {
+ SkAutoTUnref<SkSurface> surface(proxy->createSurface(dstIRect.width(), dstIRect.height()));
+ if (NULL == surface) {
return false;
}
- SkCanvas canvas(device.get());
+ SkCanvas* canvas = surface->getCanvas();
SkPaint paint;
// Subtract off the integer component of the translation (will be applied in loc, below).
@@ -72,9 +77,14 @@ bool SkBitmapSource::onFilterImage(Proxy* proxy, const SkBitmap&, const Context&
paint.setFilterLevel(
fSrcRect.width() == dstRect.width() && fSrcRect.height() == dstRect.height() ?
SkPaint::kNone_FilterLevel : SkPaint::kHigh_FilterLevel);
- canvas.drawBitmapRectToRect(fBitmap, &fSrcRect, dstRect, &paint);
+ canvas->drawBitmapRectToRect(fBitmap, &fSrcRect, dstRect, &paint);
+
+ SkImage* image = surface->newImageSnapshot(SkSurface::kYes_Budgeted);
+ if (NULL == image) {
+ return false;
+ }
+ result.reset(image);
- *result = device.get()->accessBitmap(false);
offset->fX = dstIRect.fLeft;
offset->fY = dstIRect.fTop;
return true;

Powered by Google App Engine
This is Rietveld 408576698