Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 235 int indexCount, const SkPaint& paint) SK_OVERRID E | 235 int indexCount, const SkPaint& paint) SK_OVERRID E |
| 236 {SkASSERT(0);} | 236 {SkASSERT(0);} |
| 237 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y, | 237 virtual void drawDevice(const SkDraw&, SkDevice*, int x, int y, |
| 238 const SkPaint&) SK_OVERRIDE | 238 const SkPaint&) SK_OVERRIDE |
| 239 {SkASSERT(0);} | 239 {SkASSERT(0);} |
| 240 private: | 240 private: |
| 241 virtual void flush() SK_OVERRIDE; | 241 virtual void flush() SK_OVERRIDE; |
| 242 | 242 |
| 243 void beginRecording(); | 243 void beginRecording(); |
| 244 void init(); | 244 void init(); |
| 245 void aboutToDraw(); | |
| 246 void prepareForImmediatePixelWrite(); | |
| 245 | 247 |
| 246 DeferredPipeController fPipeController; | 248 DeferredPipeController fPipeController; |
| 247 SkGPipeWriter fPipeWriter; | 249 SkGPipeWriter fPipeWriter; |
| 248 SkCanvas* fImmediateCanvas; | 250 SkCanvas* fImmediateCanvas; |
| 249 SkCanvas* fRecordingCanvas; | 251 SkCanvas* fRecordingCanvas; |
| 250 SkSurface* fSurface; | 252 SkSurface* fSurface; |
| 251 SkDeferredCanvas::NotificationClient* fNotificationClient; | 253 SkDeferredCanvas::NotificationClient* fNotificationClient; |
| 252 bool fFreshFrame; | 254 bool fFreshFrame; |
| 253 bool fCanDiscardCanvasContents; | 255 bool fCanDiscardCanvasContents; |
| 254 size_t fMaxRecordingStorageBytes; | 256 size_t fMaxRecordingStorageBytes; |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 336 bool DeferredDevice::isFreshFrame() { | 338 bool DeferredDevice::isFreshFrame() { |
| 337 bool ret = fFreshFrame; | 339 bool ret = fFreshFrame; |
| 338 fFreshFrame = false; | 340 fFreshFrame = false; |
| 339 return ret; | 341 return ret; |
| 340 } | 342 } |
| 341 | 343 |
| 342 bool DeferredDevice::hasPendingCommands() { | 344 bool DeferredDevice::hasPendingCommands() { |
| 343 return fPipeController.hasPendingCommands(); | 345 return fPipeController.hasPendingCommands(); |
| 344 } | 346 } |
| 345 | 347 |
| 348 void DeferredDevice::aboutToDraw() | |
|
Justin Novosad
2013/08/01 18:48:01
Code factored-out to avoid duplication
| |
| 349 { | |
| 350 if (NULL != fNotificationClient) { | |
| 351 fNotificationClient->prepareForDraw(); | |
| 352 } | |
| 353 if (fCanDiscardCanvasContents) { | |
| 354 if (NULL != fSurface) { | |
| 355 fSurface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeM ode); | |
| 356 } | |
| 357 fCanDiscardCanvasContents = false; | |
| 358 } | |
| 359 } | |
| 360 | |
| 346 void DeferredDevice::flushPendingCommands(PlaybackMode playbackMode) { | 361 void DeferredDevice::flushPendingCommands(PlaybackMode playbackMode) { |
| 347 if (!fPipeController.hasPendingCommands()) { | 362 if (!fPipeController.hasPendingCommands()) { |
| 348 return; | 363 return; |
| 349 } | 364 } |
| 350 if (playbackMode == kNormal_PlaybackMode) { | 365 if (playbackMode == kNormal_PlaybackMode) { |
| 351 if (NULL != fNotificationClient) { | 366 aboutToDraw(); |
| 352 fNotificationClient->prepareForDraw(); | |
| 353 } | |
| 354 if (fCanDiscardCanvasContents) { | |
| 355 if (NULL != fSurface) { | |
| 356 // Pre-empt notifyContentChanged(false) calls that will happen | |
| 357 // during flush | |
| 358 fSurface->notifyContentWillChange(SkSurface::kDiscard_ContentCha ngeMode); | |
| 359 } | |
| 360 fCanDiscardCanvasContents = false; | |
| 361 } | |
| 362 } | 367 } |
| 363 fPipeWriter.flushRecording(true); | 368 fPipeWriter.flushRecording(true); |
| 364 fPipeController.playback(kSilent_PlaybackMode == playbackMode); | 369 fPipeController.playback(kSilent_PlaybackMode == playbackMode); |
| 365 if (playbackMode == kNormal_PlaybackMode && fNotificationClient) { | 370 if (playbackMode == kNormal_PlaybackMode && fNotificationClient) { |
| 366 fNotificationClient->flushedDrawCommands(); | 371 fNotificationClient->flushedDrawCommands(); |
| 367 } | 372 } |
| 368 fPreviousStorageAllocated = storageAllocatedForRecording(); | 373 fPreviousStorageAllocated = storageAllocatedForRecording(); |
| 369 } | 374 } |
| 370 | 375 |
| 371 void DeferredDevice::flush() { | 376 void DeferredDevice::flush() { |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 434 | 439 |
| 435 int DeferredDevice::height() const { | 440 int DeferredDevice::height() const { |
| 436 return immediateDevice()->height(); | 441 return immediateDevice()->height(); |
| 437 } | 442 } |
| 438 | 443 |
| 439 GrRenderTarget* DeferredDevice::accessRenderTarget() { | 444 GrRenderTarget* DeferredDevice::accessRenderTarget() { |
| 440 this->flushPendingCommands(kNormal_PlaybackMode); | 445 this->flushPendingCommands(kNormal_PlaybackMode); |
| 441 return immediateDevice()->accessRenderTarget(); | 446 return immediateDevice()->accessRenderTarget(); |
| 442 } | 447 } |
| 443 | 448 |
| 449 void DeferredDevice::prepareForImmediatePixelWrite() { | |
| 450 // The purpose of the following code is to make sure commands are flushed, t hat | |
| 451 // aboutToDraw() is called and that notifyContentWillChange is called, witho ut | |
| 452 // calling anything redundantly. | |
| 453 if (fPipeController.hasPendingCommands()) { | |
| 454 this->flushPendingCommands(kNormal_PlaybackMode); | |
| 455 } else { | |
| 456 bool mustNotifyDirectly = !fCanDiscardCanvasContents; | |
| 457 this->aboutToDraw(); | |
| 458 if (mustNotifyDirectly) { | |
| 459 fSurface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMo de); | |
| 460 } | |
| 461 } | |
| 462 | |
| 463 fImmediateCanvas->flush(); | |
| 464 } | |
| 465 | |
| 444 void DeferredDevice::writePixels(const SkBitmap& bitmap, | 466 void DeferredDevice::writePixels(const SkBitmap& bitmap, |
| 445 int x, int y, SkCanvas::Config8888 config8888) { | 467 int x, int y, SkCanvas::Config8888 config8888) { |
| 446 | 468 |
| 447 if (x <= 0 && y <= 0 && (x + bitmap.width()) >= width() && | 469 if (x <= 0 && y <= 0 && (x + bitmap.width()) >= width() && |
| 448 (y + bitmap.height()) >= height()) { | 470 (y + bitmap.height()) >= height()) { |
| 449 this->skipPendingCommands(); | 471 this->skipPendingCommands(); |
| 450 } | 472 } |
| 451 | 473 |
| 452 if (SkBitmap::kARGB_8888_Config == bitmap.config() && | 474 if (SkBitmap::kARGB_8888_Config == bitmap.config() && |
| 453 SkCanvas::kNative_Premul_Config8888 != config8888 && | 475 SkCanvas::kNative_Premul_Config8888 != config8888 && |
| 454 kPMColorAlias != config8888) { | 476 kPMColorAlias != config8888) { |
| 455 //Special case config: no deferral | 477 //Special case config: no deferral |
| 456 this->flushPendingCommands(kNormal_PlaybackMode); | 478 prepareForImmediatePixelWrite(); |
| 457 immediateDevice()->writePixels(bitmap, x, y, config8888); | 479 immediateDevice()->writePixels(bitmap, x, y, config8888); |
| 458 return; | 480 return; |
| 459 } | 481 } |
| 460 | 482 |
| 461 SkPaint paint; | 483 SkPaint paint; |
| 462 paint.setXfermodeMode(SkXfermode::kSrc_Mode); | 484 paint.setXfermodeMode(SkXfermode::kSrc_Mode); |
| 463 if (shouldDrawImmediately(&bitmap, NULL, getBitmapSizeThreshold())) { | 485 if (shouldDrawImmediately(&bitmap, NULL, getBitmapSizeThreshold())) { |
| 464 this->flushPendingCommands(kNormal_PlaybackMode); | 486 prepareForImmediatePixelWrite(); |
| 465 fImmediateCanvas->drawSprite(bitmap, x, y, &paint); | 487 fImmediateCanvas->drawSprite(bitmap, x, y, &paint); |
| 466 } else { | 488 } else { |
| 467 this->recordingCanvas()->drawSprite(bitmap, x, y, &paint); | 489 this->recordingCanvas()->drawSprite(bitmap, x, y, &paint); |
| 468 this->recordedDrawCommand(); | 490 this->recordedDrawCommand(); |
| 469 | 491 |
| 470 } | 492 } |
| 471 } | 493 } |
| 472 | 494 |
| 473 const SkBitmap& DeferredDevice::onAccessBitmap(SkBitmap*) { | 495 const SkBitmap& DeferredDevice::onAccessBitmap(SkBitmap*) { |
| 474 this->flushPendingCommands(kNormal_PlaybackMode); | 496 this->flushPendingCommands(kNormal_PlaybackMode); |
| (...skipping 532 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1007 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { | 1029 SkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { |
| 1008 this->drawingCanvas()->setDrawFilter(filter); | 1030 this->drawingCanvas()->setDrawFilter(filter); |
| 1009 this->INHERITED::setDrawFilter(filter); | 1031 this->INHERITED::setDrawFilter(filter); |
| 1010 this->recordedDrawCommand(); | 1032 this->recordedDrawCommand(); |
| 1011 return filter; | 1033 return filter; |
| 1012 } | 1034 } |
| 1013 | 1035 |
| 1014 SkCanvas* SkDeferredCanvas::canvasForDrawIter() { | 1036 SkCanvas* SkDeferredCanvas::canvasForDrawIter() { |
| 1015 return this->drawingCanvas(); | 1037 return this->drawingCanvas(); |
| 1016 } | 1038 } |
| OLD | NEW |