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

Side by Side Diff: src/utils/SkDeferredCanvas.cpp

Issue 14178002: Adding SkSurface support to SkDeferredCanvas (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 7 years, 8 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « include/utils/SkDeferredCanvas.h ('k') | tests/DeferredCanvasTest.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 1
2 /* 2 /*
3 * Copyright 2013 Google Inc. 3 * Copyright 2013 Google Inc.
4 * 4 *
5 * Use of this source code is governed by a BSD-style license that can be 5 * Use of this source code is governed by a BSD-style license that can be
6 * found in the LICENSE file. 6 * found in the LICENSE file.
7 */ 7 */
8 8
9 #include "SkDeferredCanvas.h" 9 #include "SkDeferredCanvas.h"
10 10
11 #include "SkChunkAlloc.h" 11 #include "SkChunkAlloc.h"
12 #include "SkColorFilter.h" 12 #include "SkColorFilter.h"
13 #include "SkDevice.h" 13 #include "SkDevice.h"
14 #include "SkDrawFilter.h" 14 #include "SkDrawFilter.h"
15 #include "SkGPipe.h" 15 #include "SkGPipe.h"
16 #include "SkPaint.h" 16 #include "SkPaint.h"
17 #include "SkPaintPriv.h" 17 #include "SkPaintPriv.h"
18 #include "SkRRect.h" 18 #include "SkRRect.h"
19 #include "SkShader.h" 19 #include "SkShader.h"
20 #include "SkSurface.h"
20 21
21 enum { 22 enum {
22 // Deferred canvas will auto-flush when recording reaches this limit 23 // Deferred canvas will auto-flush when recording reaches this limit
23 kDefaultMaxRecordingStorageBytes = 64*1024*1024, 24 kDefaultMaxRecordingStorageBytes = 64*1024*1024,
24 kDeferredCanvasBitmapSizeThreshold = ~0U, // Disables this feature 25 kDeferredCanvasBitmapSizeThreshold = ~0U, // Disables this feature
25 }; 26 };
26 27
27 enum PlaybackMode { 28 enum PlaybackMode {
28 kNormal_PlaybackMode, 29 kNormal_PlaybackMode,
29 kSilent_PlaybackMode, 30 kSilent_PlaybackMode,
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 132
132 // Release all allocated blocks 133 // Release all allocated blocks
133 fAllocator.reset(); 134 fAllocator.reset();
134 } 135 }
135 136
136 //----------------------------------------------------------------------------- 137 //-----------------------------------------------------------------------------
137 // DeferredDevice 138 // DeferredDevice
138 //----------------------------------------------------------------------------- 139 //-----------------------------------------------------------------------------
139 class DeferredDevice : public SkDevice { 140 class DeferredDevice : public SkDevice {
140 public: 141 public:
141 DeferredDevice(SkDevice* immediateDevice, 142 explicit DeferredDevice(SkDevice* immediateDevice);
142 SkDeferredCanvas::NotificationClient* notificationClient = NULL); 143 explicit DeferredDevice(SkSurface* surface);
143 ~DeferredDevice(); 144 ~DeferredDevice();
144 145
145 void setNotificationClient(SkDeferredCanvas::NotificationClient* notificatio nClient); 146 void setNotificationClient(SkDeferredCanvas::NotificationClient* notificatio nClient);
146 SkCanvas* recordingCanvas(); 147 SkCanvas* recordingCanvas();
147 SkCanvas* immediateCanvas() const {return fImmediateCanvas;} 148 SkCanvas* immediateCanvas() const {return fImmediateCanvas;}
148 SkDevice* immediateDevice() const {return fImmediateDevice;} 149 SkDevice* immediateDevice() const {return fImmediateDevice;}
150 SkImage* newImageShapshot();
149 bool isFreshFrame(); 151 bool isFreshFrame();
150 bool hasPendingCommands(); 152 bool hasPendingCommands();
151 size_t storageAllocatedForRecording() const; 153 size_t storageAllocatedForRecording() const;
152 size_t freeMemoryIfPossible(size_t bytesToFree); 154 size_t freeMemoryIfPossible(size_t bytesToFree);
153 size_t getBitmapSizeThreshold() const; 155 size_t getBitmapSizeThreshold() const;
154 void setBitmapSizeThreshold(size_t sizeThreshold); 156 void setBitmapSizeThreshold(size_t sizeThreshold);
155 void flushPendingCommands(PlaybackMode); 157 void flushPendingCommands(PlaybackMode);
156 void skipPendingCommands(); 158 void skipPendingCommands();
157 void setMaxRecordingStorage(size_t); 159 void setMaxRecordingStorage(size_t);
158 void recordedDrawCommand(); 160 void recordedDrawCommand();
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
230 SkXfermode* xmode, const uint16_t indices[], 232 SkXfermode* xmode, const uint16_t indices[],
231 int indexCount, const SkPaint& paint) 233 int indexCount, const SkPaint& paint)
232 {SkASSERT(0);} 234 {SkASSERT(0);}
233 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y, 235 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y,
234 const SkPaint&) 236 const SkPaint&)
235 {SkASSERT(0);} 237 {SkASSERT(0);}
236 private: 238 private:
237 virtual void flush(); 239 virtual void flush();
238 240
239 void beginRecording(); 241 void beginRecording();
242 void init();
240 243
241 DeferredPipeController fPipeController; 244 DeferredPipeController fPipeController;
242 SkGPipeWriter fPipeWriter; 245 SkGPipeWriter fPipeWriter;
243 SkDevice* fImmediateDevice; 246 SkDevice* fImmediateDevice;
244 SkCanvas* fImmediateCanvas; 247 SkCanvas* fImmediateCanvas;
245 SkCanvas* fRecordingCanvas; 248 SkCanvas* fRecordingCanvas;
249 SkSurface* fSurface;
246 SkDeferredCanvas::NotificationClient* fNotificationClient; 250 SkDeferredCanvas::NotificationClient* fNotificationClient;
247 bool fFreshFrame; 251 bool fFreshFrame;
248 size_t fMaxRecordingStorageBytes; 252 size_t fMaxRecordingStorageBytes;
249 size_t fPreviousStorageAllocated; 253 size_t fPreviousStorageAllocated;
250 size_t fBitmapSizeThreshold; 254 size_t fBitmapSizeThreshold;
251 }; 255 };
252 256
253 DeferredDevice::DeferredDevice( 257 DeferredDevice::DeferredDevice(SkDevice* immediateDevice)
254 SkDevice* immediateDevice, SkDeferredCanvas::NotificationClient* notificatio nClient) : 258 : SkDevice(SkBitmap::kNo_Config,
255 SkDevice(SkBitmap::kNo_Config, 259 immediateDevice->width(), immediateDevice->height(),
256 immediateDevice->width(), immediateDevice->height(), 260 immediateDevice->isOpaque(),
257 immediateDevice->isOpaque(), 261 immediateDevice->getDeviceProperties()) {
258 immediateDevice->getDeviceProperties()) 262 fSurface = NULL;
259 , fRecordingCanvas(NULL) 263 fImmediateDevice = immediateDevice; // ref counted via fImmediateCanvas
260 , fFreshFrame(true) 264 fImmediateCanvas = SkNEW_ARGS(SkCanvas, (fImmediateDevice));
261 , fPreviousStorageAllocated(0) 265 this->init();
262 , fBitmapSizeThreshold(kDeferredCanvasBitmapSizeThreshold){ 266 }
263 267
268 DeferredDevice::DeferredDevice(SkSurface* surface)
269 : SkDevice(SkBitmap::kNo_Config,
270 surface->getCanvas()->getDevice()->width(),
271 surface->getCanvas()->getDevice()->height(),
272 surface->getCanvas()->getDevice()->isOpaque(),
273 surface->getCanvas()->getDevice()->getDeviceProperties()) {
264 fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes; 274 fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
265 fNotificationClient = notificationClient; 275 fNotificationClient = NULL;
266 fImmediateDevice = immediateDevice; // ref counted via fImmediateCanvas 276 fImmediateCanvas = surface->getCanvas();
267 fImmediateCanvas = SkNEW_ARGS(SkCanvas, (fImmediateDevice)); 277 SkSafeRef(fImmediateCanvas);
278 fSurface = surface;
279 SkSafeRef(fSurface);
280 fImmediateDevice = fImmediateCanvas->getDevice(); // ref counted via fImmed iateCanvas
281 this->init();
282 }
283
284 void DeferredDevice::init() {
285 fRecordingCanvas = NULL;
286 fFreshFrame = true;
287 fPreviousStorageAllocated = 0;
288 fBitmapSizeThreshold = kDeferredCanvasBitmapSizeThreshold;
289 fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
290 fNotificationClient = NULL;
268 fPipeController.setPlaybackCanvas(fImmediateCanvas); 291 fPipeController.setPlaybackCanvas(fImmediateCanvas);
269 this->beginRecording(); 292 this->beginRecording();
270 } 293 }
271 294
272 DeferredDevice::~DeferredDevice() { 295 DeferredDevice::~DeferredDevice() {
273 this->flushPendingCommands(kSilent_PlaybackMode); 296 this->flushPendingCommands(kSilent_PlaybackMode);
274 SkSafeUnref(fImmediateCanvas); 297 SkSafeUnref(fImmediateCanvas);
298 SkSafeUnref(fSurface);
275 } 299 }
276 300
277 void DeferredDevice::setMaxRecordingStorage(size_t maxStorage) { 301 void DeferredDevice::setMaxRecordingStorage(size_t maxStorage) {
278 fMaxRecordingStorageBytes = maxStorage; 302 fMaxRecordingStorageBytes = maxStorage;
279 this->recordingCanvas(); // Accessing the recording canvas applies the new l imit. 303 this->recordingCanvas(); // Accessing the recording canvas applies the new l imit.
280 } 304 }
281 305
282 void DeferredDevice::beginRecording() { 306 void DeferredDevice::beginRecording() {
283 SkASSERT(NULL == fRecordingCanvas); 307 SkASSERT(NULL == fRecordingCanvas);
284 fRecordingCanvas = fPipeWriter.startRecording(&fPipeController, 0, 308 fRecordingCanvas = fPipeWriter.startRecording(&fPipeController, 0,
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 storageAllocated != fPreviousStorageAllocated) { 393 storageAllocated != fPreviousStorageAllocated) {
370 fPreviousStorageAllocated = storageAllocated; 394 fPreviousStorageAllocated = storageAllocated;
371 fNotificationClient->storageAllocatedForRecordingChanged(storageAllocate d); 395 fNotificationClient->storageAllocatedForRecordingChanged(storageAllocate d);
372 } 396 }
373 } 397 }
374 398
375 SkCanvas* DeferredDevice::recordingCanvas() { 399 SkCanvas* DeferredDevice::recordingCanvas() {
376 return fRecordingCanvas; 400 return fRecordingCanvas;
377 } 401 }
378 402
403 SkImage* DeferredDevice::newImageShapshot() {
404 this->flush();
405 return fSurface ? fSurface->newImageShapshot() : NULL;
406 }
407
379 uint32_t DeferredDevice::getDeviceCapabilities() { 408 uint32_t DeferredDevice::getDeviceCapabilities() {
380 return fImmediateDevice->getDeviceCapabilities(); 409 return fImmediateDevice->getDeviceCapabilities();
381 } 410 }
382 411
383 int DeferredDevice::width() const { 412 int DeferredDevice::width() const {
384 return fImmediateDevice->width(); 413 return fImmediateDevice->width();
385 } 414 }
386 415
387 int DeferredDevice::height() const { 416 int DeferredDevice::height() const {
388 return fImmediateDevice->height(); 417 return fImmediateDevice->height();
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
430 SkDevice* DeferredDevice::onCreateCompatibleDevice( 459 SkDevice* DeferredDevice::onCreateCompatibleDevice(
431 SkBitmap::Config config, int width, int height, bool isOpaque, 460 SkBitmap::Config config, int width, int height, bool isOpaque,
432 Usage usage) { 461 Usage usage) {
433 462
434 // Save layer usage not supported, and not required by SkDeferredCanvas. 463 // Save layer usage not supported, and not required by SkDeferredCanvas.
435 SkASSERT(usage != kSaveLayer_Usage); 464 SkASSERT(usage != kSaveLayer_Usage);
436 // Create a compatible non-deferred device. 465 // Create a compatible non-deferred device.
437 SkAutoTUnref<SkDevice> compatibleDevice 466 SkAutoTUnref<SkDevice> compatibleDevice
438 (fImmediateDevice->createCompatibleDevice(config, width, height, 467 (fImmediateDevice->createCompatibleDevice(config, width, height,
439 isOpaque)); 468 isOpaque));
440 return SkNEW_ARGS(DeferredDevice, (compatibleDevice, fNotificationClient)); 469 DeferredDevice* device = SkNEW_ARGS(DeferredDevice, (compatibleDevice));
470 device->setNotificationClient(fNotificationClient);
471 return device;
441 } 472 }
442 473
443 bool DeferredDevice::onReadPixels( 474 bool DeferredDevice::onReadPixels(
444 const SkBitmap& bitmap, int x, int y, SkCanvas::Config8888 config8888) { 475 const SkBitmap& bitmap, int x, int y, SkCanvas::Config8888 config8888) {
445 this->flushPendingCommands(kNormal_PlaybackMode); 476 this->flushPendingCommands(kNormal_PlaybackMode);
446 return fImmediateCanvas->readPixels(const_cast<SkBitmap*>(&bitmap), 477 return fImmediateCanvas->readPixels(const_cast<SkBitmap*>(&bitmap),
447 x, y, config8888); 478 x, y, config8888);
448 } 479 }
449 480
450 class AutoImmediateDrawIfNeeded { 481 class AutoImmediateDrawIfNeeded {
(...skipping 30 matching lines...) Expand all
481 512
482 SkDeferredCanvas::SkDeferredCanvas() { 513 SkDeferredCanvas::SkDeferredCanvas() {
483 this->init(); 514 this->init();
484 } 515 }
485 516
486 SkDeferredCanvas::SkDeferredCanvas(SkDevice* device) { 517 SkDeferredCanvas::SkDeferredCanvas(SkDevice* device) {
487 this->init(); 518 this->init();
488 this->setDevice(device); 519 this->setDevice(device);
489 } 520 }
490 521
522 SkDeferredCanvas::SkDeferredCanvas(SkSurface* surface) {
523 this->init();
524 this->INHERITED::setDevice(SkNEW_ARGS(DeferredDevice, (surface)))->unref();
525 }
526
491 void SkDeferredCanvas::init() { 527 void SkDeferredCanvas::init() {
492 fDeferredDrawing = true; // On by default 528 fDeferredDrawing = true; // On by default
493 } 529 }
494 530
495 void SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) { 531 void SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) {
496 this->validate(); 532 this->validate();
497 this->getDeferredDevice()->setMaxRecordingStorage(maxStorage); 533 this->getDeferredDevice()->setMaxRecordingStorage(maxStorage);
498 } 534 }
499 535
500 size_t SkDeferredCanvas::storageAllocatedForRecording() const { 536 size_t SkDeferredCanvas::storageAllocatedForRecording() const {
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
577 NotificationClient* notificationClient) { 613 NotificationClient* notificationClient) {
578 614
579 DeferredDevice* deferredDevice = this->getDeferredDevice(); 615 DeferredDevice* deferredDevice = this->getDeferredDevice();
580 SkASSERT(deferredDevice); 616 SkASSERT(deferredDevice);
581 if (deferredDevice) { 617 if (deferredDevice) {
582 deferredDevice->setNotificationClient(notificationClient); 618 deferredDevice->setNotificationClient(notificationClient);
583 } 619 }
584 return notificationClient; 620 return notificationClient;
585 } 621 }
586 622
623 SkImage* SkDeferredCanvas::newImageShapshot() {
624 DeferredDevice* deferredDevice = this->getDeferredDevice();
625 SkASSERT(deferredDevice);
626 return deferredDevice ? deferredDevice->newImageShapshot() : NULL;
627 }
628
587 bool SkDeferredCanvas::isFullFrame(const SkRect* rect, 629 bool SkDeferredCanvas::isFullFrame(const SkRect* rect,
588 const SkPaint* paint) const { 630 const SkPaint* paint) const {
589 SkCanvas* canvas = this->drawingCanvas(); 631 SkCanvas* canvas = this->drawingCanvas();
590 SkISize canvasSize = this->getDeviceSize(); 632 SkISize canvasSize = this->getDeviceSize();
591 if (rect) { 633 if (rect) {
592 if (!canvas->getTotalMatrix().rectStaysRect()) { 634 if (!canvas->getTotalMatrix().rectStaysRect()) {
593 return false; // conservative 635 return false; // conservative
594 } 636 }
595 637
596 SkRect transformedRect; 638 SkRect transformedRect;
(...skipping 318 matching lines...) Expand 10 before | Expand all | Expand 10 after
915 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { 957 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) {
916 this->drawingCanvas()->setDrawFilter(filter); 958 this->drawingCanvas()->setDrawFilter(filter);
917 this->INHERITED::setDrawFilter(filter); 959 this->INHERITED::setDrawFilter(filter);
918 this->recordedDrawCommand(); 960 this->recordedDrawCommand();
919 return filter; 961 return filter;
920 } 962 }
921 963
922 SkCanvas* SkDeferredCanvas::canvasForDrawIter() { 964 SkCanvas* SkDeferredCanvas::canvasForDrawIter() {
923 return this->drawingCanvas(); 965 return this->drawingCanvas();
924 } 966 }
OLDNEW
« no previous file with comments | « include/utils/SkDeferredCanvas.h ('k') | tests/DeferredCanvasTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698