14370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 24370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com/* 3baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org * Copyright 2013 Google Inc. 44370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * 54370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * Use of this source code is governed by a BSD-style license that can be 64370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com * found in the LICENSE file. 74370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com */ 84370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 94370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkDeferredCanvas.h" 104370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 111f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com#include "SkBitmapDevice.h" 1288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org#include "SkChunkAlloc.h" 134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkColorFilter.h" 144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com#include "SkDrawFilter.h" 1588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org#include "SkGPipe.h" 1688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org#include "SkPaint.h" 17baa0220dfddda3cd44f0ffb5f95a4a60443eb8c3junov@chromium.org#include "SkPaintPriv.h" 184ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com#include "SkRRect.h" 1988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org#include "SkShader.h" 2067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org#include "SkSurface.h" 214370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 22bfeddae9da240693441556b2f278827e213f75e8junov@chromium.orgenum { 23bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org // Deferred canvas will auto-flush when recording reaches this limit 24bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org kDefaultMaxRecordingStorageBytes = 64*1024*1024, 25140d7286c5a40058932696eaa28818c313bd2ddfreed@google.com kDeferredCanvasBitmapSizeThreshold = ~0U, // Disables this feature 26bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org}; 27bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org 28eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.orgenum PlaybackMode { 29eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org kNormal_PlaybackMode, 30eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org kSilent_PlaybackMode, 31eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org}; 32eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org 334cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.orgstatic bool shouldDrawImmediately(const SkBitmap* bitmap, const SkPaint* paint, 347775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com size_t bitmapSizeThreshold) { 357775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com if (bitmap && ((bitmap->getTexture() && !bitmap->isImmutable()) || 367775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com (bitmap->getSize() > bitmapSizeThreshold))) { 3710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org return true; 3810f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org } 3910f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org if (paint) { 4010f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org SkShader* shader = paint->getShader(); 4110f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org // Here we detect the case where the shader is an SkBitmapProcShader 4210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org // with a gpu texture attached. Checking this without RTTI 4310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org // requires making the assumption that only gradient shaders 4410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org // and SkBitmapProcShader implement asABitmap(). The following 4510f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org // code may need to be revised if that assumption is ever broken. 4610f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org if (shader && !shader->asAGradient(NULL)) { 4710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org SkBitmap bm; 48d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (shader->asABitmap(&bm, NULL, NULL) && 4910f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org NULL != bm.getTexture()) { 5010f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org return true; 5110f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org } 5210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org } 5310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org } 5410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org return false; 55b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org} 56b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org 5788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org//----------------------------------------------------------------------------- 5888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org// DeferredPipeController 5988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org//----------------------------------------------------------------------------- 6088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 6188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgclass DeferredPipeController : public SkGPipeController { 6288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgpublic: 6388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org DeferredPipeController(); 6488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org void setPlaybackCanvas(SkCanvas*); 6588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual ~DeferredPipeController(); 6688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void* requestBlock(size_t minRequest, size_t* actual) SK_OVERRIDE; 6788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void notifyWritten(size_t bytes) SK_OVERRIDE; 68fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org void playback(bool silent); 69a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org bool hasPendingCommands() const { return fAllocator.blockCount() != 0; } 7088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t storageAllocatedForRecording() const { return fAllocator.totalCapacity(); } 7188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgprivate: 7288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org enum { 7388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org kMinBlockSize = 4096 7488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org }; 7588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org struct PipeBlock { 7688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org PipeBlock(void* block, size_t size) { fBlock = block, fSize = size; } 7788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org void* fBlock; 7888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t fSize; 7988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org }; 8088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org void* fBlock; 8188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t fBytesWritten; 8288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkChunkAlloc fAllocator; 8388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkTDArray<PipeBlock> fBlockList; 8488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkGPipeReader fReader; 8588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}; 8688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 8788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgDeferredPipeController::DeferredPipeController() : 8888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fAllocator(kMinBlockSize) { 8988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBlock = NULL; 9088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBytesWritten = 0; 9188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 9288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 9388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgDeferredPipeController::~DeferredPipeController() { 9488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fAllocator.reset(); 9588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 9688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 9788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgvoid DeferredPipeController::setPlaybackCanvas(SkCanvas* canvas) { 9888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fReader.setCanvas(canvas); 9988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 10088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 10188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgvoid* DeferredPipeController::requestBlock(size_t minRequest, size_t *actual) { 10288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org if (fBlock) { 10388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Save the previous block for later 10488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org PipeBlock previousBloc(fBlock, fBytesWritten); 10588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBlockList.push(previousBloc); 10688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 107adacc7067ad617cdc7bbef39192ca80f4b4d27f9robertphillips@google.com size_t blockSize = SkTMax<size_t>(minRequest, kMinBlockSize); 10888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBlock = fAllocator.allocThrow(blockSize); 10988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBytesWritten = 0; 11088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org *actual = blockSize; 11188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return fBlock; 11288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 11388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 11488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgvoid DeferredPipeController::notifyWritten(size_t bytes) { 11588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBytesWritten += bytes; 11688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 11788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 118fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgvoid DeferredPipeController::playback(bool silent) { 119fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org uint32_t flags = silent ? SkGPipeReader::kSilent_PlaybackFlag : 0; 12088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org for (int currentBlock = 0; currentBlock < fBlockList.count(); currentBlock++ ) { 121fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org fReader.playback(fBlockList[currentBlock].fBlock, fBlockList[currentBlock].fSize, 122fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org flags); 12388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 12488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBlockList.reset(); 12588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 12688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org if (fBlock) { 127fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org fReader.playback(fBlock, fBytesWritten, flags); 12888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fBlock = NULL; 12988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 13088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 13188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Release all allocated blocks 13288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fAllocator.reset(); 13388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 13488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 13588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org//----------------------------------------------------------------------------- 1369c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com// SkDeferredDevice 13788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org//----------------------------------------------------------------------------- 1389c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comclass SkDeferredDevice : public SkBaseDevice { 13988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgpublic: 1409c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com explicit SkDeferredDevice(SkSurface* surface); 1419c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com ~SkDeferredDevice(); 14288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 1439ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org void setNotificationClient(SkDeferredCanvas::NotificationClient* notificationClient); 14488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkCanvas* recordingCanvas(); 14588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkCanvas* immediateCanvas() const {return fImmediateCanvas;} 1461f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com SkBaseDevice* immediateDevice() const {return fImmediateCanvas->getTopDevice();} 1475ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org SkImage* newImageSnapshot(); 1487070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org void setSurface(SkSurface* surface); 14988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org bool isFreshFrame(); 150a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org bool hasPendingCommands(); 15188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t storageAllocatedForRecording() const; 15288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t freeMemoryIfPossible(size_t bytesToFree); 1537775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com size_t getBitmapSizeThreshold() const; 1547775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com void setBitmapSizeThreshold(size_t sizeThreshold); 155eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org void flushPendingCommands(PlaybackMode); 1560a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org void skipPendingCommands(); 15788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org void setMaxRecordingStorage(size_t); 1589ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org void recordedDrawCommand(); 15988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 160284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual SkImageInfo imageInfo() const SK_OVERRIDE; 161284a84d21044d8b45df3047f261fbc922dca175creed@google.com 162b8d00db075b5ea09e353508a26ef5ced50722a6ccommit-bot@chromium.org virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE; 16388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 16415a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE; 16588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 16676f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com virtual SkSurface* newSurface(const SkImageInfo&) SK_OVERRIDE; 16776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com 16888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgprotected: 1691f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE; 170a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org virtual bool onReadPixels(const SkImageInfo&, void*, size_t, int x, int y) SK_OVERRIDE; 1714cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org virtual bool onWritePixels(const SkImageInfo&, const void*, size_t, int x, int y) SK_OVERRIDE; 17288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 17388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // The following methods are no-ops on a deferred device 1741f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE { 1751f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com return false; 1761f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com } 17788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 17888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // None of the following drawing methods should ever get called on the 17988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // deferred device 1803e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org virtual void clear(SkColor color) SK_OVERRIDE 18188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 1823e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE 18388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 18488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode, 18588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t count, const SkPoint[], 1863e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org const SkPaint& paint) SK_OVERRIDE 18788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 18888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawRect(const SkDraw&, const SkRect& r, 1893e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org const SkPaint& paint) SK_OVERRIDE 19088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 191284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual void drawOval(const SkDraw&, const SkRect&, const SkPaint&) SK_OVERRIDE 192284a84d21044d8b45df3047f261fbc922dca175creed@google.com {SkASSERT(0);} 193cac8d01eabd05d11365f56b6af3f30bccb173487scroggo@google.com virtual void drawRRect(const SkDraw&, const SkRRect& rr, 194cac8d01eabd05d11365f56b6af3f30bccb173487scroggo@google.com const SkPaint& paint) SK_OVERRIDE 195284a84d21044d8b45df3047f261fbc922dca175creed@google.com {SkASSERT(0);} 19688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawPath(const SkDraw&, const SkPath& path, 19788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org const SkPaint& paint, 19888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org const SkMatrix* prePathMatrix = NULL, 1993e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org bool pathIsMutable = false) SK_OVERRIDE 20088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 20188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap, 2023e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org const SkMatrix& matrix, const SkPaint& paint) SK_OVERRIDE 20388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 204284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual void drawBitmapRect(const SkDraw&, const SkBitmap&, const SkRect*, 205284a84d21044d8b45df3047f261fbc922dca175creed@google.com const SkRect&, const SkPaint&, 206284a84d21044d8b45df3047f261fbc922dca175creed@google.com SkCanvas::DrawBitmapRectFlags) SK_OVERRIDE 207284a84d21044d8b45df3047f261fbc922dca175creed@google.com {SkASSERT(0);} 20888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap, 2093e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org int x, int y, const SkPaint& paint) SK_OVERRIDE 21088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 21188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawText(const SkDraw&, const void* text, size_t len, 2123e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org SkScalar x, SkScalar y, const SkPaint& paint) SK_OVERRIDE 21388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 21488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawPosText(const SkDraw&, const void* text, size_t len, 21588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org const SkScalar pos[], SkScalar constY, 2163e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org int scalarsPerPos, const SkPaint& paint) SK_OVERRIDE 21788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 21888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawTextOnPath(const SkDraw&, const void* text, 21988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t len, const SkPath& path, 22088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org const SkMatrix* matrix, 2213e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org const SkPaint& paint) SK_OVERRIDE 22288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 22388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode, 22488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org int vertexCount, const SkPoint verts[], 22588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org const SkPoint texs[], const SkColor colors[], 22688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkXfermode* xmode, const uint16_t indices[], 2273e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org int indexCount, const SkPaint& paint) SK_OVERRIDE 22888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 2291f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y, 2303e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org const SkPaint&) SK_OVERRIDE 23188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org {SkASSERT(0);} 232284a84d21044d8b45df3047f261fbc922dca175creed@google.com 233284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual void lockPixels() SK_OVERRIDE {} 234284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual void unlockPixels() SK_OVERRIDE {} 235284a84d21044d8b45df3047f261fbc922dca175creed@google.com 236284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE { 237284a84d21044d8b45df3047f261fbc922dca175creed@google.com return false; 238284a84d21044d8b45df3047f261fbc922dca175creed@google.com } 239284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual bool canHandleImageFilter(const SkImageFilter*) SK_OVERRIDE { 240284a84d21044d8b45df3047f261fbc922dca175creed@google.com return false; 241284a84d21044d8b45df3047f261fbc922dca175creed@google.com } 242284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual bool filterImage(const SkImageFilter*, const SkBitmap&, 2434cb543d6057b692e1099e9f115155f0bf323a0c8senorblanco@chromium.org const SkImageFilter::Context&, SkBitmap*, SkIPoint*) SK_OVERRIDE { 244284a84d21044d8b45df3047f261fbc922dca175creed@google.com return false; 245284a84d21044d8b45df3047f261fbc922dca175creed@google.com } 246284a84d21044d8b45df3047f261fbc922dca175creed@google.com 24788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgprivate: 2483e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org virtual void flush() SK_OVERRIDE; 249284a84d21044d8b45df3047f261fbc922dca175creed@google.com virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) SK_OVERRIDE {} 25088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 25188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org void beginRecording(); 25267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org void init(); 25344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org void aboutToDraw(); 25444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org void prepareForImmediatePixelWrite(); 25588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 25688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org DeferredPipeController fPipeController; 25788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkGPipeWriter fPipeWriter; 25888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkCanvas* fImmediateCanvas; 25988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkCanvas* fRecordingCanvas; 26067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org SkSurface* fSurface; 2619ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org SkDeferredCanvas::NotificationClient* fNotificationClient; 26288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org bool fFreshFrame; 263c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org bool fCanDiscardCanvasContents; 26488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t fMaxRecordingStorageBytes; 2659ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org size_t fPreviousStorageAllocated; 2667775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com size_t fBitmapSizeThreshold; 26788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}; 26888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 2699c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice::SkDeferredDevice(SkSurface* surface) { 27088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes; 27167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fNotificationClient = NULL; 2727070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org fImmediateCanvas = NULL; 2737070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org fSurface = NULL; 2747070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org this->setSurface(surface); 27567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org this->init(); 27667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org} 27767d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 2789c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setSurface(SkSurface* surface) { 2797070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org SkRefCnt_SafeAssign(fImmediateCanvas, surface->getCanvas()); 2807070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org SkRefCnt_SafeAssign(fSurface, surface); 2817070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org fPipeController.setPlaybackCanvas(fImmediateCanvas); 2827070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org} 2837070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org 2849c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::init() { 28567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fRecordingCanvas = NULL; 28667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fFreshFrame = true; 287c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org fCanDiscardCanvasContents = false; 28867d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fPreviousStorageAllocated = 0; 28967d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fBitmapSizeThreshold = kDeferredCanvasBitmapSizeThreshold; 29067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes; 29167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org fNotificationClient = NULL; 29288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org this->beginRecording(); 29388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 29488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 2959c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice::~SkDeferredDevice() { 296eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->flushPendingCommands(kSilent_PlaybackMode); 29788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkSafeUnref(fImmediateCanvas); 29867d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org SkSafeUnref(fSurface); 29988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 30088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3019c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setMaxRecordingStorage(size_t maxStorage) { 30288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fMaxRecordingStorageBytes = maxStorage; 30388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org this->recordingCanvas(); // Accessing the recording canvas applies the new limit. 30488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 30588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3069c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::beginRecording() { 307a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org SkASSERT(NULL == fRecordingCanvas); 308d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com fRecordingCanvas = fPipeWriter.startRecording(&fPipeController, 0, 3099becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org immediateDevice()->width(), immediateDevice()->height()); 31088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 311d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 3129c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setNotificationClient( 3139ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org SkDeferredCanvas::NotificationClient* notificationClient) { 31452805485581cff7e13134aa1465a2950f7bed007junov@chromium.org fNotificationClient = notificationClient; 31588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 31688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3179c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::skipPendingCommands() { 318c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org if (!fRecordingCanvas->isDrawingToLayer()) { 319c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org fCanDiscardCanvasContents = true; 320c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org if (fPipeController.hasPendingCommands()) { 321c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org fFreshFrame = true; 322c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org flushPendingCommands(kSilent_PlaybackMode); 32352a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com } 32488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 32588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 32688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3279c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::isFreshFrame() { 32888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org bool ret = fFreshFrame; 32988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fFreshFrame = false; 33088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return ret; 33188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 33288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3339c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::hasPendingCommands() { 334a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org return fPipeController.hasPendingCommands(); 335a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org} 336a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org 3379c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::aboutToDraw() 33844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org{ 33944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org if (NULL != fNotificationClient) { 34044324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org fNotificationClient->prepareForDraw(); 34144324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } 34244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org if (fCanDiscardCanvasContents) { 34344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org if (NULL != fSurface) { 34444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org fSurface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode); 34544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } 346ea4b7970b9513d5ac3786ceab33a855b0b1b8577skia.committer@gmail.com fCanDiscardCanvasContents = false; 34744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } 34844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org} 34944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org 3509c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::flushPendingCommands(PlaybackMode playbackMode) { 351a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org if (!fPipeController.hasPendingCommands()) { 35288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return; 35388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 354c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org if (playbackMode == kNormal_PlaybackMode) { 35544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org aboutToDraw(); 35688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 35788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fPipeWriter.flushRecording(true); 358d4501a0aba2541489c32c89426bbfc59ed945da2junov@chromium.org fPipeController.playback(kSilent_PlaybackMode == playbackMode); 359dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org if (fNotificationClient) { 360dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org if (playbackMode == kSilent_PlaybackMode) { 361dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org fNotificationClient->skippedPendingDrawCommands(); 362dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org } else { 363dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org fNotificationClient->flushedDrawCommands(); 364dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org } 3659ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org } 366dad009be4ae15cae7b1ae9cecdf816a21bb7c5f9commit-bot@chromium.org 3679ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org fPreviousStorageAllocated = storageAllocatedForRecording(); 36888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 36988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3709c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::flush() { 371eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 37288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org fImmediateCanvas->flush(); 37388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 37488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3759c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::freeMemoryIfPossible(size_t bytesToFree) { 3769ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org size_t val = fPipeWriter.freeMemoryIfPossible(bytesToFree); 3779ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org fPreviousStorageAllocated = storageAllocatedForRecording(); 3789ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org return val; 37988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 38088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3819c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::getBitmapSizeThreshold() const { 3827775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com return fBitmapSizeThreshold; 3837775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com} 3847775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 3859c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setBitmapSizeThreshold(size_t sizeThreshold) { 3867775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com fBitmapSizeThreshold = sizeThreshold; 3877775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com} 3887775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 3899c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::storageAllocatedForRecording() const { 39088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return (fPipeController.storageAllocatedForRecording() 39188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org + fPipeWriter.storageAllocatedForRecording()); 39288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 39388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 3949c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::recordedDrawCommand() { 39588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t storageAllocated = this->storageAllocatedForRecording(); 3969ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 39788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org if (storageAllocated > fMaxRecordingStorageBytes) { 39888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // First, attempt to reduce cache without flushing 39988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org size_t tryFree = storageAllocated - fMaxRecordingStorageBytes; 40088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org if (this->freeMemoryIfPossible(tryFree) < tryFree) { 40188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Flush is necessary to free more space. 402eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 40388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Free as much as possible to avoid oscillating around fMaxRecordingStorageBytes 40488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // which could cause a high flushing frequency. 405100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com this->freeMemoryIfPossible(~0U); 40688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 4079ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org storageAllocated = this->storageAllocatedForRecording(); 40888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org } 4099ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 410d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fNotificationClient && 4119ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org storageAllocated != fPreviousStorageAllocated) { 4129ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org fPreviousStorageAllocated = storageAllocated; 4139ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org fNotificationClient->storageAllocatedForRecordingChanged(storageAllocated); 4149ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org } 4159ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org} 4169ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 4179c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkCanvas* SkDeferredDevice::recordingCanvas() { 41888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return fRecordingCanvas; 41988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 42088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4219c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkImage* SkDeferredDevice::newImageSnapshot() { 42267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org this->flush(); 4235ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org return fSurface ? fSurface->newImageSnapshot() : NULL; 42467d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org} 42567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 4269c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkImageInfo SkDeferredDevice::imageInfo() const { 427284a84d21044d8b45df3047f261fbc922dca175creed@google.com return immediateDevice()->imageInfo(); 428284a84d21044d8b45df3047f261fbc922dca175creed@google.com} 429284a84d21044d8b45df3047f261fbc922dca175creed@google.com 4309c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comGrRenderTarget* SkDeferredDevice::accessRenderTarget() { 431eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 4329becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org return immediateDevice()->accessRenderTarget(); 43388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 43488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4359c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::prepareForImmediatePixelWrite() { 43644324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org // The purpose of the following code is to make sure commands are flushed, that 43744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org // aboutToDraw() is called and that notifyContentWillChange is called, without 43844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org // calling anything redundantly. 43944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org if (fPipeController.hasPendingCommands()) { 44044324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 44144324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } else { 44244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org bool mustNotifyDirectly = !fCanDiscardCanvasContents; 44344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org this->aboutToDraw(); 44444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org if (mustNotifyDirectly) { 44544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org fSurface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMode); 44644324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } 44744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org } 44844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org 44944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org fImmediateCanvas->flush(); 45044324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org} 45144324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org 4529c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::onWritePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes, 4534cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org int x, int y) { 4544cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(x >= 0 && y >= 0); 4554cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(x + info.width() <= width()); 4564cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org SkASSERT(y + info.height() <= height()); 4574cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 4584cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 4594cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org 4604cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org const SkImageInfo deviceInfo = this->imageInfo(); 4614cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org if (info.width() == deviceInfo.width() && info.height() == deviceInfo.height()) { 4624cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org this->skipPendingCommands(); 4634cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org } 464e62513fb9274b65bcd9fecf61acc418dd3949df5skia.committer@gmail.com 4654cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org this->prepareForImmediatePixelWrite(); 4664cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org return immediateDevice()->onWritePixels(info, pixels, rowBytes, x, y); 4674cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org} 46888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4699c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comconst SkBitmap& SkDeferredDevice::onAccessBitmap() { 470eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 4719becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org return immediateDevice()->accessBitmap(false); 47288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 47388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4749c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkBaseDevice* SkDeferredDevice::onCreateDevice(const SkImageInfo& info, Usage usage) { 47588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Save layer usage not supported, and not required by SkDeferredCanvas. 47688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org SkASSERT(usage != kSaveLayer_Usage); 47788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org // Create a compatible non-deferred device. 478b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org // We do not create a deferred device because we know the new device 479b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org // will not be used with a deferred canvas (there is no API for that). 4809c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com // And connecting a SkDeferredDevice to non-deferred canvas can result 481b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org // in unpredictable behavior. 48215a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org return immediateDevice()->createCompatibleDevice(info); 48388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 48488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4859c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkSurface* SkDeferredDevice::newSurface(const SkImageInfo& info) { 48676f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com return this->immediateDevice()->newSurface(info); 48776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com} 48876f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com 489a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.orgbool SkDeferredDevice::onReadPixels(const SkImageInfo& info, void* pixels, size_t rowBytes, 490a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org int x, int y) { 491a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org this->flushPendingCommands(kNormal_PlaybackMode); 492a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org return fImmediateCanvas->readPixels(info, pixels, rowBytes, x, y); 493a713f9c6f6a06d216d53e268b9c691941053dabfcommit-bot@chromium.org} 49488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 4957775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comclass AutoImmediateDrawIfNeeded { 4967775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.compublic: 4977775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkBitmap* bitmap, 4987775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com const SkPaint* paint) { 4997775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com this->init(canvas, bitmap, paint); 5007775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5017775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 5027775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkPaint* paint) { 5037775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com this->init(canvas, NULL, paint); 5047775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5057775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 5067775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com ~AutoImmediateDrawIfNeeded() { 5077775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com if (fCanvas) { 5087775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com fCanvas->setDeferredDrawing(true); 5097775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5107775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5117775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comprivate: 5127775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint) 5137775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com { 5149c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* device = static_cast<SkDeferredDevice*>(canvas.getDevice()); 5157775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com if (canvas.isDeferredDrawing() && (NULL != device) && 5167775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com shouldDrawImmediately(bitmap, paint, device->getBitmapSizeThreshold())) { 5177775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com canvas.setDeferredDrawing(false); 5187775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com fCanvas = &canvas; 5197775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } else { 5207775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com fCanvas = NULL; 5217775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5227775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com } 5237775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 5247775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com SkDeferredCanvas* fCanvas; 5257775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com}; 52688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 52766070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.orgSkDeferredCanvas* SkDeferredCanvas::Create(SkSurface* surface) { 5289c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkAutoTUnref<SkDeferredDevice> deferredDevice(SkNEW_ARGS(SkDeferredDevice, (surface))); 52966070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org return SkNEW_ARGS(SkDeferredCanvas, (deferredDevice)); 53066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org} 53166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org 5329c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredCanvas::SkDeferredCanvas(SkDeferredDevice* device) : SkCanvas (device) { 53366070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org this->init(); 53466070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org} 53567d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 536c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::init() { 5375e5a095a94281167056da707b03930f135748d71junov@chromium.org fDeferredDrawing = true; // On by default 5384370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 5394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 540bfeddae9da240693441556b2f278827e213f75e8junov@chromium.orgvoid SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) { 5419060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->validate(); 542bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org this->getDeferredDevice()->setMaxRecordingStorage(maxStorage); 543bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org} 544bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org 5452e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkDeferredCanvas::storageAllocatedForRecording() const { 5462e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return this->getDeferredDevice()->storageAllocatedForRecording(); 5472e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 5482e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 5492e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkDeferredCanvas::freeMemoryIfPossible(size_t bytesToFree) { 5502e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org return this->getDeferredDevice()->freeMemoryIfPossible(bytesToFree); 5512e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org} 5522e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org 5537775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comvoid SkDeferredCanvas::setBitmapSizeThreshold(size_t sizeThreshold) { 5549c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* deferredDevice = this->getDeferredDevice(); 5557775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com SkASSERT(deferredDevice); 5567775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com deferredDevice->setBitmapSizeThreshold(sizeThreshold); 5577775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com} 5587775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com 5599ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.orgvoid SkDeferredCanvas::recordedDrawCommand() { 5609ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org if (fDeferredDrawing) { 5619ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->getDeferredDevice()->recordedDrawCommand(); 5629ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org } 5639ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org} 5649ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org 565c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::validate() const { 5669060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org SkASSERT(this->getDevice()); 5674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 5684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 5695e5a095a94281167056da707b03930f135748d71junov@chromium.orgSkCanvas* SkDeferredCanvas::drawingCanvas() const { 5709060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->validate(); 5719060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org return fDeferredDrawing ? this->getDeferredDevice()->recordingCanvas() : 5729060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->getDeferredDevice()->immediateCanvas(); 5735e5a095a94281167056da707b03930f135748d71junov@chromium.org} 5745e5a095a94281167056da707b03930f135748d71junov@chromium.org 57588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgSkCanvas* SkDeferredCanvas::immediateCanvas() const { 57688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org this->validate(); 57788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return this->getDeferredDevice()->immediateCanvas(); 57888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 57988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 5809c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice* SkDeferredCanvas::getDeferredDevice() const { 5819c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com return static_cast<SkDeferredDevice*>(this->getDevice()); 5824370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 5834370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 584c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::setDeferredDrawing(bool val) { 5859060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->validate(); // Must set device before calling this method 5864370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (val != fDeferredDrawing) { 5874370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (fDeferredDrawing) { 5885e5a095a94281167056da707b03930f135748d71junov@chromium.org // Going live. 589eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->getDeferredDevice()->flushPendingCommands(kNormal_PlaybackMode); 5904370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 5914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com fDeferredDrawing = val; 5924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 5934370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 5944370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 59588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgbool SkDeferredCanvas::isDeferredDrawing() const { 596b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org return fDeferredDrawing; 597b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org} 598b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org 59988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgbool SkDeferredCanvas::isFreshFrame() const { 60088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org return this->getDeferredDevice()->isFreshFrame(); 60188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org} 60288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org 603a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.orgbool SkDeferredCanvas::hasPendingCommands() const { 604a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org return this->getDeferredDevice()->hasPendingCommands(); 605a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org} 606a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org 607fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgvoid SkDeferredCanvas::silentFlush() { 608fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org if (fDeferredDrawing) { 609eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org this->getDeferredDevice()->flushPendingCommands(kSilent_PlaybackMode); 610fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org } 611fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org} 612fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org 613c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgSkDeferredCanvas::~SkDeferredCanvas() { 6144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 6154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6167070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.orgSkSurface* SkDeferredCanvas::setSurface(SkSurface* surface) { 6179c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* deferredDevice = this->getDeferredDevice(); 61866070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org SkASSERT(NULL != deferredDevice); 61966070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org // By swapping the surface into the existing device, we preserve 62066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org // all pending commands, which can help to seamlessly recover from 62166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org // a lost accelerated graphics context. 62266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org deferredDevice->setSurface(surface); 6237070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org return surface; 6247070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org} 6257070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org 6269ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.orgSkDeferredCanvas::NotificationClient* SkDeferredCanvas::setNotificationClient( 6279ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org NotificationClient* notificationClient) { 628c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org 6299c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* deferredDevice = this->getDeferredDevice(); 6304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com SkASSERT(deferredDevice); 6314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (deferredDevice) { 6329ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org deferredDevice->setNotificationClient(notificationClient); 6334370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6349ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org return notificationClient; 6354370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 6364370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6375ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.orgSkImage* SkDeferredCanvas::newImageSnapshot() { 6389c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com SkDeferredDevice* deferredDevice = this->getDeferredDevice(); 63967d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org SkASSERT(deferredDevice); 6405ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org return deferredDevice ? deferredDevice->newImageSnapshot() : NULL; 64167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org} 64267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org 6434370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.combool SkDeferredCanvas::isFullFrame(const SkRect* rect, 644c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPaint* paint) const { 6459060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org SkCanvas* canvas = this->drawingCanvas(); 6469060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org SkISize canvasSize = this->getDeviceSize(); 6474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (rect) { 6484370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (!canvas->getTotalMatrix().rectStaysRect()) { 6494370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com return false; // conservative 6504370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6514370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com SkRect transformedRect; 6534370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com canvas->getTotalMatrix().mapRect(&transformedRect, *rect); 6544370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6554370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (paint) { 6564370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com SkPaint::Style paintStyle = paint->getStyle(); 657d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (!(paintStyle == SkPaint::kFill_Style || 6584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com paintStyle == SkPaint::kStrokeAndFill_Style)) { 6594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com return false; 6604370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6614370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (paint->getMaskFilter() || paint->getLooper() 6624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com || paint->getPathEffect() || paint->getImageFilter()) { 6634370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com return false; // conservative 6644370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // The following test holds with AA enabled, and is conservative 6684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // by a 0.5 pixel margin with AA disabled 669d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (transformedRect.fLeft > SkIntToScalar(0) || 670d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com transformedRect.fTop > SkIntToScalar(0) || 671b1e218e782261304440199642f1b98e7ba96b525junov@chromium.org transformedRect.fRight < SkIntToScalar(canvasSize.fWidth) || 672b1e218e782261304440199642f1b98e7ba96b525junov@chromium.org transformedRect.fBottom < SkIntToScalar(canvasSize.fHeight)) { 6734370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com return false; 6744370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6754370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 6764370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 6778f0ca06ef44f7b94da549fbb0c5fab27092c5116junov@chromium.org return this->getClipStack()->quickContains(SkRect::MakeXYWH(0, 0, 6788f0ca06ef44f7b94da549fbb0c5fab27092c5116junov@chromium.org SkIntToScalar(canvasSize.fWidth), SkIntToScalar(canvasSize.fHeight))); 6794370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 6804370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 681e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDeferredCanvas::willSave(SaveFlags flags) { 6829060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->save(flags); 6839ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 684e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSave(flags); 6854370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 6864370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 687e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds, 688e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org const SkPaint* paint, SaveFlags flags) { 6899060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->saveLayer(bounds, paint, flags); 6909ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 691e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willSaveLayer(bounds, paint, flags); 692e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org // No need for a full layer. 693e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org return kNoLayer_SaveLayerStrategy; 6944370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 6954370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 696e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDeferredCanvas::willRestore() { 6979060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->restore(); 6989ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 699e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org this->INHERITED::willRestore(); 7004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7014370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 702c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::isDrawingToLayer() const { 7039060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org return this->drawingCanvas()->isDrawingToLayer(); 7044370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7054370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 70644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkDeferredCanvas::didConcat(const SkMatrix& matrix) { 7079060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->concat(matrix); 7089ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 70944c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didConcat(matrix); 7104370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7114370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 71244c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.orgvoid SkDeferredCanvas::didSetMatrix(const SkMatrix& matrix) { 7139060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->setMatrix(matrix); 7149ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 71544c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org this->INHERITED::didSetMatrix(matrix); 7164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7174370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7188f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRect(const SkRect& rect, 7198f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com SkRegion::Op op, 7208f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 7218f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->drawingCanvas()->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle); 7228f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRect(rect, op, edgeStyle); 7239ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7254370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7268f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRRect(const SkRRect& rrect, 7278f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com SkRegion::Op op, 7288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 7298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->drawingCanvas()->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle); 7308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRRect(rrect, op, edgeStyle); 7314ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->recordedDrawCommand(); 7324ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7334ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 7348f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipPath(const SkPath& path, 7358f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com SkRegion::Op op, 7368f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com ClipEdgeStyle edgeStyle) { 7378f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->drawingCanvas()->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle); 7388f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipPath(path, op, edgeStyle); 7399ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7428f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) { 7439060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->clipRegion(deviceRgn, op); 7448f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com this->INHERITED::onClipRegion(deviceRgn, op); 7459ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7464370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 748c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::clear(SkColor color) { 7494370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // purge pending commands 7504370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com if (fDeferredDrawing) { 7510a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 7524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 7534370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7549060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->clear(color); 7559ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7564370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7574370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 758c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::drawPaint(const SkPaint& paint) { 759d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fDeferredDrawing && this->isFullFrame(NULL, &paint) && 760c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org isPaintOpaque(&paint)) { 7610a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 7624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 76310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 7649060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPaint(paint); 7659ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawPoints(PointMode mode, size_t count, 769c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPoint pts[], const SkPaint& paint) { 77010f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 7719060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPoints(mode, count, pts, paint); 7729ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7734370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7744370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7754ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkDeferredCanvas::drawOval(const SkRect& rect, const SkPaint& paint) { 7764ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 7774ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->drawingCanvas()->drawOval(rect, paint); 7784ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->recordedDrawCommand(); 7794ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 7804ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 7817ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDeferredCanvas::drawRect(const SkRect& rect, const SkPaint& paint) { 782d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fDeferredDrawing && this->isFullFrame(&rect, &paint) && 783c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org isPaintOpaque(&paint)) { 7840a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 7854370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 786306ab9d5de38f2a547fd1d69aedbe69b5c6617ccskia.committer@gmail.com 78710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 7889060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawRect(rect, paint); 7899ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 7904370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 7914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 7924ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkDeferredCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) { 7934ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com if (rrect.isRect()) { 7944ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->SkDeferredCanvas::drawRect(rrect.getBounds(), paint); 7954ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } else if (rrect.isOval()) { 7964ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->SkDeferredCanvas::drawOval(rrect.getBounds(), paint); 7974ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } else { 7984ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 7994ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->drawingCanvas()->drawRRect(rrect, paint); 8004ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com this->recordedDrawCommand(); 8014ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com } 8024ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com} 8034ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com 804ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgvoid SkDeferredCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, 805ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org const SkPaint& paint) { 806ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 807ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org this->drawingCanvas()->drawDRRect(outer, inner, paint); 808ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org this->recordedDrawCommand(); 809ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org} 810ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org 8117ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDeferredCanvas::drawPath(const SkPath& path, const SkPaint& paint) { 81210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 8139060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPath(path, paint); 8149ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8174370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left, 818c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org SkScalar top, const SkPaint* paint) { 8198f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkRect bitmapRect = SkRect::MakeXYWH(left, top, 8208f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height())); 821d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fDeferredDrawing && 8229060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->isFullFrame(&bitmapRect, paint) && 82387f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org isPaintOpaque(paint, &bitmap)) { 8240a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 8254370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 8264370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 82710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint); 8289060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawBitmap(bitmap, left, top, paint); 8299ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8327112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkDeferredCanvas::drawBitmapRectToRect(const SkBitmap& bitmap, 8337112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkRect* src, 8347112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com const SkRect& dst, 835eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org const SkPaint* paint, 836eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org DrawBitmapRectFlags flags) { 837d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fDeferredDrawing && 8389060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->isFullFrame(&dst, paint) && 83987f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org isPaintOpaque(paint, &bitmap)) { 8400a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 8414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 8424370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 84310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint); 844eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org this->drawingCanvas()->drawBitmapRectToRect(bitmap, src, dst, paint, flags); 8459ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8464370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8484370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8494370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmapMatrix(const SkBitmap& bitmap, 8504370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const SkMatrix& m, 851c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPaint* paint) { 8524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // TODO: reset recording canvas if paint+bitmap is opaque and clip rect 8534370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // covers canvas entirely and transformed bitmap covers canvas entirely 85410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint); 8559060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawBitmapMatrix(bitmap, m, paint); 8569ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8574370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmapNine(const SkBitmap& bitmap, 8604370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const SkIRect& center, const SkRect& dst, 861c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPaint* paint) { 8624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // TODO: reset recording canvas if paint+bitmap is opaque and clip rect 8634370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com // covers canvas entirely and dst covers canvas entirely 86410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint); 8659060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawBitmapNine(bitmap, center, dst, paint); 8669ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8674370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8684370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 8694370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawSprite(const SkBitmap& bitmap, int left, int top, 870c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPaint* paint) { 8718f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkRect bitmapRect = SkRect::MakeXYWH( 8728f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkIntToScalar(left), 873d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkIntToScalar(top), 8748f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkIntToScalar(bitmap.width()), 8758f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org SkIntToScalar(bitmap.height())); 876d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com if (fDeferredDrawing && 8779060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->isFullFrame(&bitmapRect, paint) && 87887f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org isPaintOpaque(paint, &bitmap)) { 8790a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org this->getDeferredDevice()->skipPendingCommands(); 8804370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com } 8814370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 88210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint); 8839060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawSprite(bitmap, left, top, paint); 8849ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8854370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8864370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 887e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDeferredCanvas::onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y, 888e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 88910f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 8909060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawText(text, byteLength, x, y, paint); 8919ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 8934370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 894e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDeferredCanvas::onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[], 895e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkPaint& paint) { 89610f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 8979060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPosText(text, byteLength, pos, paint); 8989ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 8994370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 901e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDeferredCanvas::onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[], 902e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com SkScalar constY, const SkPaint& paint) { 90310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 9049060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPosTextH(text, byteLength, xpos, constY, paint); 9059ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 9064370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9074370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 908e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkDeferredCanvas::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path, 909e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com const SkMatrix* matrix, const SkPaint& paint) { 91010f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 9119060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawTextOnPath(text, byteLength, path, matrix, paint); 9129ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 9134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 9159b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillipsvoid SkDeferredCanvas::onDrawPicture(const SkPicture* picture) { 9169060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawPicture(picture); 9179ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 9184370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9194370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 9204370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawVertices(VertexMode vmode, int vertexCount, 9214370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const SkPoint vertices[], 9224370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const SkPoint texs[], 9234370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const SkColor colors[], SkXfermode* xmode, 9244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com const uint16_t indices[], int indexCount, 925c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org const SkPaint& paint) { 92610f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org AutoImmediateDrawIfNeeded autoDraw(*this, &paint); 9279060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org this->drawingCanvas()->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode, 9289060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org indices, indexCount, paint); 9299ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 9304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 932c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgSkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) { 933d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com this->drawingCanvas()->setDrawFilter(filter); 9349ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->INHERITED::setDrawFilter(filter); 9359ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org this->recordedDrawCommand(); 936d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com return filter; 9374370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 9384370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com 9394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comSkCanvas* SkDeferredCanvas::canvasForDrawIter() { 9409060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org return this->drawingCanvas(); 9414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com} 942