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

Unified Diff: src/core/SkCanvas.cpp

Issue 933043006: Implement SkBaseDevice snapshot support Base URL: https://skia.googlesource.com/skia.git@skimage-filters-04-snapshot-devices
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/core/SkBitmapDevice.cpp ('k') | src/core/SkPictureRecord.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkCanvas.cpp
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index a16a1a2c5e4a91573e91a9eca26c6a60ad2506c8..3734de1e2feb575e1dc6b451cbf8b7bb23077eae 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -80,12 +80,6 @@ bool SkCanvas::Internal_Private_GetTreatSpriteAsBitmap() {
typedef SkTLazy<SkPaint> SkLazyPaint;
-void SkCanvas::predrawNotify() {
- if (fSurfaceBase) {
- fSurfaceBase->aboutToDraw(SkSurface::kRetain_ContentChangeMode);
- }
-}
-
///////////////////////////////////////////////////////////////////////////////
static uint32_t filter_paint_flags(const SkSurfaceProps& props, uint32_t flags) {
@@ -410,13 +404,11 @@ bool AutoDrawLooper::doNext(SkDrawFilter::Type drawType) {
////////// macros to place around the internal draw calls //////////////////
#define LOOPER_BEGIN_DRAWDEVICE(paint, type) \
- this->predrawNotify(); \
AutoDrawLooper looper(this, fProps, paint, true); \
while (looper.next(type)) { \
SkDrawIter iter(this);
#define LOOPER_BEGIN(paint, type, bounds) \
- this->predrawNotify(); \
AutoDrawLooper looper(this, fProps, paint, false, bounds); \
while (looper.next(type)) { \
SkDrawIter iter(this);
@@ -441,8 +433,6 @@ SkBaseDevice* SkCanvas::init(SkBaseDevice* device, InitFlags flags) {
fMCRec->fLayer = SkNEW_ARGS(DeviceCM, (NULL, NULL, NULL, fConservativeRasterClip));
fMCRec->fTopLayer = fMCRec->fLayer;
- fSurfaceBase = NULL;
-
fClipStack.reset(SkNEW(SkClipStack));
if (device) {
@@ -718,9 +708,6 @@ bool SkCanvas::writePixels(const SkImageInfo& origInfo, const void* pixels, size
// here x,y are either 0 or negative
pixels = ((const char*)pixels - y * rowBytes - x * info.bytesPerPixel());
- // Tell our owning surface to bump its generation ID
- this->predrawNotify();
-
// The device can assert that the requested area is always contained in its bounds
return device->writePixels(info, pixels, rowBytes, target.x(), target.y());
}
@@ -1116,6 +1103,8 @@ void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y,
paint = &tmp;
}
+ SkAutoTUnref<SkImage> srcImage;
+
LOOPER_BEGIN_DRAWDEVICE(*paint, SkDrawFilter::kBitmap_Type)
while (iter.next()) {
SkBaseDevice* dstDev = iter.fDevice;
@@ -1126,17 +1115,36 @@ void SkCanvas::internalDrawDevice(SkBaseDevice* srcDev, int x, int y,
SkDeviceImageFilterProxy proxy(dstDev, fProps);
SkBitmap dst;
SkIPoint offset = SkIPoint::Make(0, 0);
- const SkBitmap& src = srcDev->accessBitmap(false);
+ if (NULL == srcImage) {
+ srcImage.reset(srcDev->newImageSnapshot());
+ if (NULL == srcImage) {
+ return;
+ }
+ }
SkMatrix matrix = *iter.fMatrix;
matrix.postTranslate(SkIntToScalar(-pos.x()), SkIntToScalar(-pos.y()));
SkIRect clipBounds = SkIRect::MakeWH(srcDev->width(), srcDev->height());
SkAutoTUnref<SkImageFilter::Cache> cache(dstDev->getImageFilterCache());
SkImageFilter::Context ctx(matrix, clipBounds, cache.get());
- if (filter->filterImage(&proxy, src, ctx, &dst, &offset)) {
- SkPaint tmpUnfiltered(*paint);
- tmpUnfiltered.setImageFilter(NULL);
- dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + offset.y(),
- tmpUnfiltered);
+ SkBitmap srcBitmap; // TODO: remove once filters accept SkImage
+#if SK_SUPPORT_GPU
+ // TODO: Gpu devices need bitmap that came from gpu, not through
+ // getROPixels. Remove once filters accept SkImage.
+ if (NULL != srcImage->getTexture()) {
+ SkImageFilter::WrapTexture(srcImage->getTexture(), srcImage->width(),
+ srcImage->height(), &srcBitmap);
+ } else
+#endif
+ {
+ as_IB(srcImage)->getROPixels(&srcBitmap);
+ }
+ if (!srcBitmap.empty()) {
+ if (filter->filterImage(&proxy, srcBitmap, ctx, &dst, &offset)) {
+ SkPaint tmpUnfiltered(*paint);
+ tmpUnfiltered.setImageFilter(NULL);
+ dstDev->drawSprite(iter, dst, pos.x() + offset.x(), pos.y() + offset.y(),
+ tmpUnfiltered);
+ }
}
} else {
dstDev->drawDevice(iter, srcDev, pos.x(), pos.y(), *paint);
@@ -1718,8 +1726,8 @@ void SkCanvas::drawImageAsSprite(const SkImage& image, int left, int top, const
//////////////////////////////////////////////////////////////////////////////
void SkCanvas::onDiscard() {
- if (fSurfaceBase) {
- fSurfaceBase->aboutToDraw(SkSurface::kDiscard_ContentChangeMode);
+ if (NULL != this->getDevice()) {
+ this->getDevice()->discard();
}
}
« no previous file with comments | « src/core/SkBitmapDevice.cpp ('k') | src/core/SkPictureRecord.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698