aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/utils
diff options
context:
space:
mode:
authorGravatar junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-12 13:33:01 +0000
committerGravatar junov@chromium.org <junov@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2013-04-12 13:33:01 +0000
commit67d74228448cab0f1eca77fff444ddbe8c2eaef3 (patch)
treed62ba42d7111fd3879b0f7465295384aaffe2da4 /src/utils
parentd2b1d900dc7d4e96a16de59e2a6ecd46df60e3d0 (diff)
Adding SkSurface support to SkDeferredCanvas
Review URL: https://codereview.chromium.org/14178002 git-svn-id: http://skia.googlecode.com/svn/trunk@8648 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/utils')
-rw-r--r--src/utils/SkDeferredCanvas.cpp74
1 files changed, 58 insertions, 16 deletions
diff --git a/src/utils/SkDeferredCanvas.cpp b/src/utils/SkDeferredCanvas.cpp
index 5119729447..21f717cf53 100644
--- a/src/utils/SkDeferredCanvas.cpp
+++ b/src/utils/SkDeferredCanvas.cpp
@@ -17,6 +17,7 @@
#include "SkPaintPriv.h"
#include "SkRRect.h"
#include "SkShader.h"
+#include "SkSurface.h"
enum {
// Deferred canvas will auto-flush when recording reaches this limit
@@ -138,14 +139,15 @@ void DeferredPipeController::playback(bool silent) {
//-----------------------------------------------------------------------------
class DeferredDevice : public SkDevice {
public:
- DeferredDevice(SkDevice* immediateDevice,
- SkDeferredCanvas::NotificationClient* notificationClient = NULL);
+ explicit DeferredDevice(SkDevice* immediateDevice);
+ explicit DeferredDevice(SkSurface* surface);
~DeferredDevice();
void setNotificationClient(SkDeferredCanvas::NotificationClient* notificationClient);
SkCanvas* recordingCanvas();
SkCanvas* immediateCanvas() const {return fImmediateCanvas;}
SkDevice* immediateDevice() const {return fImmediateDevice;}
+ SkImage* newImageShapshot();
bool isFreshFrame();
bool hasPendingCommands();
size_t storageAllocatedForRecording() const;
@@ -237,12 +239,14 @@ private:
virtual void flush();
void beginRecording();
+ void init();
DeferredPipeController fPipeController;
SkGPipeWriter fPipeWriter;
SkDevice* fImmediateDevice;
SkCanvas* fImmediateCanvas;
SkCanvas* fRecordingCanvas;
+ SkSurface* fSurface;
SkDeferredCanvas::NotificationClient* fNotificationClient;
bool fFreshFrame;
size_t fMaxRecordingStorageBytes;
@@ -250,21 +254,40 @@ private:
size_t fBitmapSizeThreshold;
};
-DeferredDevice::DeferredDevice(
- SkDevice* immediateDevice, SkDeferredCanvas::NotificationClient* notificationClient) :
- SkDevice(SkBitmap::kNo_Config,
- immediateDevice->width(), immediateDevice->height(),
- immediateDevice->isOpaque(),
- immediateDevice->getDeviceProperties())
- , fRecordingCanvas(NULL)
- , fFreshFrame(true)
- , fPreviousStorageAllocated(0)
- , fBitmapSizeThreshold(kDeferredCanvasBitmapSizeThreshold){
+DeferredDevice::DeferredDevice(SkDevice* immediateDevice)
+ : SkDevice(SkBitmap::kNo_Config,
+ immediateDevice->width(), immediateDevice->height(),
+ immediateDevice->isOpaque(),
+ immediateDevice->getDeviceProperties()) {
+ fSurface = NULL;
+ fImmediateDevice = immediateDevice; // ref counted via fImmediateCanvas
+ fImmediateCanvas = SkNEW_ARGS(SkCanvas, (fImmediateDevice));
+ this->init();
+}
+DeferredDevice::DeferredDevice(SkSurface* surface)
+ : SkDevice(SkBitmap::kNo_Config,
+ surface->getCanvas()->getDevice()->width(),
+ surface->getCanvas()->getDevice()->height(),
+ surface->getCanvas()->getDevice()->isOpaque(),
+ surface->getCanvas()->getDevice()->getDeviceProperties()) {
fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
- fNotificationClient = notificationClient;
- fImmediateDevice = immediateDevice; // ref counted via fImmediateCanvas
- fImmediateCanvas = SkNEW_ARGS(SkCanvas, (fImmediateDevice));
+ fNotificationClient = NULL;
+ fImmediateCanvas = surface->getCanvas();
+ SkSafeRef(fImmediateCanvas);
+ fSurface = surface;
+ SkSafeRef(fSurface);
+ fImmediateDevice = fImmediateCanvas->getDevice(); // ref counted via fImmediateCanvas
+ this->init();
+}
+
+void DeferredDevice::init() {
+ fRecordingCanvas = NULL;
+ fFreshFrame = true;
+ fPreviousStorageAllocated = 0;
+ fBitmapSizeThreshold = kDeferredCanvasBitmapSizeThreshold;
+ fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
+ fNotificationClient = NULL;
fPipeController.setPlaybackCanvas(fImmediateCanvas);
this->beginRecording();
}
@@ -272,6 +295,7 @@ DeferredDevice::DeferredDevice(
DeferredDevice::~DeferredDevice() {
this->flushPendingCommands(kSilent_PlaybackMode);
SkSafeUnref(fImmediateCanvas);
+ SkSafeUnref(fSurface);
}
void DeferredDevice::setMaxRecordingStorage(size_t maxStorage) {
@@ -376,6 +400,11 @@ SkCanvas* DeferredDevice::recordingCanvas() {
return fRecordingCanvas;
}
+SkImage* DeferredDevice::newImageShapshot() {
+ this->flush();
+ return fSurface ? fSurface->newImageShapshot() : NULL;
+}
+
uint32_t DeferredDevice::getDeviceCapabilities() {
return fImmediateDevice->getDeviceCapabilities();
}
@@ -437,7 +466,9 @@ SkDevice* DeferredDevice::onCreateCompatibleDevice(
SkAutoTUnref<SkDevice> compatibleDevice
(fImmediateDevice->createCompatibleDevice(config, width, height,
isOpaque));
- return SkNEW_ARGS(DeferredDevice, (compatibleDevice, fNotificationClient));
+ DeferredDevice* device = SkNEW_ARGS(DeferredDevice, (compatibleDevice));
+ device->setNotificationClient(fNotificationClient);
+ return device;
}
bool DeferredDevice::onReadPixels(
@@ -488,6 +519,11 @@ SkDeferredCanvas::SkDeferredCanvas(SkDevice* device) {
this->setDevice(device);
}
+SkDeferredCanvas::SkDeferredCanvas(SkSurface* surface) {
+ this->init();
+ this->INHERITED::setDevice(SkNEW_ARGS(DeferredDevice, (surface)))->unref();
+}
+
void SkDeferredCanvas::init() {
fDeferredDrawing = true; // On by default
}
@@ -584,6 +620,12 @@ SkDeferredCanvas::NotificationClient* SkDeferredCanvas::setNotificationClient(
return notificationClient;
}
+SkImage* SkDeferredCanvas::newImageShapshot() {
+ DeferredDevice* deferredDevice = this->getDeferredDevice();
+ SkASSERT(deferredDevice);
+ return deferredDevice ? deferredDevice->newImageShapshot() : NULL;
+}
+
bool SkDeferredCanvas::isFullFrame(const SkRect* rect,
const SkPaint* paint) const {
SkCanvas* canvas = this->drawingCanvas();