Add caching of the snapshot image form a surface
Notify the surface when the canvas draws into it, so it can invalidate the
cached image, and (if needed) perform a copy-on-write on the surface if it
was being shared with the image.
Review URL: https://codereview.appspot.com/6441115
git-svn-id: http://skia.googlecode.com/svn/trunk@5306 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index b7c06c3..f5c6bc2 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -16,6 +16,7 @@
#include "SkPicture.h"
#include "SkRasterClip.h"
#include "SkScalarCompare.h"
+#include "SkSurface_Base.h"
#include "SkTemplates.h"
#include "SkTextFormatParams.h"
#include "SkTLazy.h"
@@ -53,6 +54,12 @@
typedef SkTLazy<SkPaint> SkLazyPaint;
+void SkCanvas::predrawNotify() {
+ if (fSurfaceBase) {
+ fSurfaceBase->aboutToDraw(this);
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
/* This is the record we keep for each SkDevice that the user installs.
@@ -425,6 +432,7 @@
#define LOOPER_BEGIN_DRAWDEVICE(paint, type) \
/* AutoValidator validator(fMCRec->fTopLayer->fDevice); */ \
+ this->predrawNotify(); \
AutoDrawLooper looper(this, paint, true); \
while (looper.next(type)) { \
SkAutoBounderCommit ac(fBounder); \
@@ -432,6 +440,7 @@
#define LOOPER_BEGIN(paint, type) \
/* AutoValidator validator(fMCRec->fTopLayer->fDevice); */ \
+ this->predrawNotify(); \
AutoDrawLooper looper(this, paint); \
while (looper.next(type)) { \
SkAutoBounderCommit ac(fBounder); \
@@ -459,6 +468,8 @@
fExternalMatrix.reset();
fExternalInverse.reset();
fUseExternalMatrix = false;
+
+ fSurfaceBase = NULL;
return this->setDevice(device);
}
@@ -2072,3 +2083,5 @@
///////////////////////////////////////////////////////////////////////////////
SkCanvas::ClipVisitor::~ClipVisitor() { }
+
+