SkDeferredCanvas.cpp revision e54a23fcfa42b2fc9d320650de72bcb2d9566b2d
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
16088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual uint32_t getDeviceCapabilities() SK_OVERRIDE;
16188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual int width() const SK_OVERRIDE;
16288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual int height() const SK_OVERRIDE;
163284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual SkBitmap::Config config() const SK_OVERRIDE;
164284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual bool isOpaque() const SK_OVERRIDE;
165284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual SkImageInfo imageInfo() const SK_OVERRIDE;
166284a84d21044d8b45df3047f261fbc922dca175creed@google.com
167b8d00db075b5ea09e353508a26ef5ced50722a6ccommit-bot@chromium.org    virtual GrRenderTarget* accessRenderTarget() SK_OVERRIDE;
16888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
16915a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    virtual SkBaseDevice* onCreateDevice(const SkImageInfo&, Usage) SK_OVERRIDE;
17088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
1714cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG
17288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void writePixels(const SkBitmap& bitmap, int x, int y,
17388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                SkCanvas::Config8888 config8888) SK_OVERRIDE;
1744cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#endif
17576f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com    virtual SkSurface* newSurface(const SkImageInfo&) SK_OVERRIDE;
17676f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com
17788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgprotected:
1781f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    virtual const SkBitmap& onAccessBitmap() SK_OVERRIDE;
17988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual bool onReadPixels(const SkBitmap& bitmap,
18088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                int x, int y,
18188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                SkCanvas::Config8888 config8888) SK_OVERRIDE;
1824cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    virtual bool onWritePixels(const SkImageInfo&, const void*, size_t, int x, int y) SK_OVERRIDE;
18388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
18488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    // The following methods are no-ops on a deferred device
1851f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    virtual bool filterTextFlags(const SkPaint& paint, TextFlags*) SK_OVERRIDE {
1861f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com        return false;
1871f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    }
18888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
18988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    // None of the following drawing methods should ever get called on the
19088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    // deferred device
1913e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org    virtual void clear(SkColor color) SK_OVERRIDE
19288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
1933e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org    virtual void drawPaint(const SkDraw&, const SkPaint& paint) SK_OVERRIDE
19488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
19588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawPoints(const SkDraw&, SkCanvas::PointMode mode,
19688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                            size_t count, const SkPoint[],
1973e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            const SkPaint& paint) SK_OVERRIDE
19888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
19988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawRect(const SkDraw&, const SkRect& r,
2003e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            const SkPaint& paint) SK_OVERRIDE
20188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
202284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual void drawOval(const SkDraw&, const SkRect&, const SkPaint&) SK_OVERRIDE
203284a84d21044d8b45df3047f261fbc922dca175creed@google.com        {SkASSERT(0);}
204cac8d01eabd05d11365f56b6af3f30bccb173487scroggo@google.com    virtual void drawRRect(const SkDraw&, const SkRRect& rr,
205cac8d01eabd05d11365f56b6af3f30bccb173487scroggo@google.com                           const SkPaint& paint) SK_OVERRIDE
206284a84d21044d8b45df3047f261fbc922dca175creed@google.com    {SkASSERT(0);}
20788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawPath(const SkDraw&, const SkPath& path,
20888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                            const SkPaint& paint,
20988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                            const SkMatrix* prePathMatrix = NULL,
2103e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            bool pathIsMutable = false) SK_OVERRIDE
21188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
21288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawBitmap(const SkDraw&, const SkBitmap& bitmap,
2133e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            const SkMatrix& matrix, const SkPaint& paint) SK_OVERRIDE
21488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
215284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual void drawBitmapRect(const SkDraw&, const SkBitmap&, const SkRect*,
216284a84d21044d8b45df3047f261fbc922dca175creed@google.com                                const SkRect&, const SkPaint&,
217284a84d21044d8b45df3047f261fbc922dca175creed@google.com                                SkCanvas::DrawBitmapRectFlags) SK_OVERRIDE
218284a84d21044d8b45df3047f261fbc922dca175creed@google.com        {SkASSERT(0);}
21988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawSprite(const SkDraw&, const SkBitmap& bitmap,
2203e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            int x, int y, const SkPaint& paint) SK_OVERRIDE
22188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
22288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawText(const SkDraw&, const void* text, size_t len,
2233e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            SkScalar x, SkScalar y, const SkPaint& paint) SK_OVERRIDE
22488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
22588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawPosText(const SkDraw&, const void* text, size_t len,
22688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                const SkScalar pos[], SkScalar constY,
2273e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                                int scalarsPerPos, const SkPaint& paint) SK_OVERRIDE
22888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
22988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawTextOnPath(const SkDraw&, const void* text,
23088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                size_t len, const SkPath& path,
23188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                const SkMatrix* matrix,
2323e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                                const SkPaint& paint) SK_OVERRIDE
23388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
23488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    virtual void drawVertices(const SkDraw&, SkCanvas::VertexMode,
23588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                int vertexCount, const SkPoint verts[],
23688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                const SkPoint texs[], const SkColor colors[],
23788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                SkXfermode* xmode, const uint16_t indices[],
2383e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                                int indexCount, const SkPaint& paint) SK_OVERRIDE
23988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
2401f2f338e23789f3eef168dcbd8171a28820ba6c1robertphillips@google.com    virtual void drawDevice(const SkDraw&, SkBaseDevice*, int x, int y,
2413e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org                            const SkPaint&) SK_OVERRIDE
24288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        {SkASSERT(0);}
243284a84d21044d8b45df3047f261fbc922dca175creed@google.com
244284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual void lockPixels() SK_OVERRIDE {}
245284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual void unlockPixels() SK_OVERRIDE {}
246284a84d21044d8b45df3047f261fbc922dca175creed@google.com
247284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual bool allowImageFilter(const SkImageFilter*) SK_OVERRIDE {
248284a84d21044d8b45df3047f261fbc922dca175creed@google.com        return false;
249284a84d21044d8b45df3047f261fbc922dca175creed@google.com    }
250284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual bool canHandleImageFilter(const SkImageFilter*) SK_OVERRIDE {
251284a84d21044d8b45df3047f261fbc922dca175creed@google.com        return false;
252284a84d21044d8b45df3047f261fbc922dca175creed@google.com    }
253284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual bool filterImage(const SkImageFilter*, const SkBitmap&,
254284a84d21044d8b45df3047f261fbc922dca175creed@google.com                             const SkMatrix&, SkBitmap*, SkIPoint*) SK_OVERRIDE {
255284a84d21044d8b45df3047f261fbc922dca175creed@google.com        return false;
256284a84d21044d8b45df3047f261fbc922dca175creed@google.com    }
257284a84d21044d8b45df3047f261fbc922dca175creed@google.com
25888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgprivate:
2593e2ea2565d12e572a977fa04b4b1996c8eb3fefccommit-bot@chromium.org    virtual void flush() SK_OVERRIDE;
260284a84d21044d8b45df3047f261fbc922dca175creed@google.com    virtual void replaceBitmapBackendForRasterSurface(const SkBitmap&) SK_OVERRIDE {}
26188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
26288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    void beginRecording();
26367d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    void init();
26444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    void aboutToDraw();
26544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    void prepareForImmediatePixelWrite();
26688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
26788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    DeferredPipeController fPipeController;
26888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkGPipeWriter  fPipeWriter;
26988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkCanvas* fImmediateCanvas;
27088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkCanvas* fRecordingCanvas;
27167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    SkSurface* fSurface;
2729ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    SkDeferredCanvas::NotificationClient* fNotificationClient;
27388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    bool fFreshFrame;
274c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org    bool fCanDiscardCanvasContents;
27588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    size_t fMaxRecordingStorageBytes;
2769ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    size_t fPreviousStorageAllocated;
2777775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    size_t fBitmapSizeThreshold;
27888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org};
27988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
2809c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice::SkDeferredDevice(SkSurface* surface) {
28188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
28267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fNotificationClient = NULL;
2837070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    fImmediateCanvas = NULL;
2847070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    fSurface = NULL;
2857070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    this->setSurface(surface);
28667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    this->init();
28767d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org}
28867d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org
2899c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setSurface(SkSurface* surface) {
2907070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    SkRefCnt_SafeAssign(fImmediateCanvas, surface->getCanvas());
2917070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    SkRefCnt_SafeAssign(fSurface, surface);
2927070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    fPipeController.setPlaybackCanvas(fImmediateCanvas);
2937070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org}
2947070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org
2959c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::init() {
29667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fRecordingCanvas = NULL;
29767d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fFreshFrame = true;
298c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org    fCanDiscardCanvasContents = false;
29967d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fPreviousStorageAllocated = 0;
30067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fBitmapSizeThreshold = kDeferredCanvasBitmapSizeThreshold;
30167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fMaxRecordingStorageBytes = kDefaultMaxRecordingStorageBytes;
30267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    fNotificationClient = NULL;
30388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    this->beginRecording();
30488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
30588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3069c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice::~SkDeferredDevice() {
307eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    this->flushPendingCommands(kSilent_PlaybackMode);
30888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkSafeUnref(fImmediateCanvas);
30967d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    SkSafeUnref(fSurface);
31088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
31188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3129c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setMaxRecordingStorage(size_t maxStorage) {
31388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    fMaxRecordingStorageBytes = maxStorage;
31488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    this->recordingCanvas(); // Accessing the recording canvas applies the new limit.
31588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
31688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3179c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::beginRecording() {
318a8db8fe39a640bda4b85b9342c3b6b2525142afajunov@chromium.org    SkASSERT(NULL == fRecordingCanvas);
319d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    fRecordingCanvas = fPipeWriter.startRecording(&fPipeController, 0,
3209becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org        immediateDevice()->width(), immediateDevice()->height());
32188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
322d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
3239c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setNotificationClient(
3249ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    SkDeferredCanvas::NotificationClient* notificationClient) {
32552805485581cff7e13134aa1465a2950f7bed007junov@chromium.org    fNotificationClient = notificationClient;
32688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
32788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3289c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::skipPendingCommands() {
329c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org    if (!fRecordingCanvas->isDrawingToLayer()) {
330c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org        fCanDiscardCanvasContents = true;
331c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org        if (fPipeController.hasPendingCommands()) {
332c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org            fFreshFrame = true;
333c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org            flushPendingCommands(kSilent_PlaybackMode);
334c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org            if (fNotificationClient) {
335c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org                fNotificationClient->skippedPendingDrawCommands();
336c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org            }
33752a00cac514dfd9cedb85a9c3e92fdb3e32a03f7junov@google.com        }
33888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
33988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
34088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3419c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::isFreshFrame() {
34288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    bool ret = fFreshFrame;
34388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    fFreshFrame = false;
34488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return ret;
34588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
34688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3479c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::hasPendingCommands() {
348a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org    return fPipeController.hasPendingCommands();
349a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org}
350a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org
3519c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::aboutToDraw()
35244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org{
35344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    if (NULL != fNotificationClient) {
35444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        fNotificationClient->prepareForDraw();
35544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    }
35644324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    if (fCanDiscardCanvasContents) {
35744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        if (NULL != fSurface) {
35844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org            fSurface->notifyContentWillChange(SkSurface::kDiscard_ContentChangeMode);
35944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        }
360ea4b7970b9513d5ac3786ceab33a855b0b1b8577skia.committer@gmail.com        fCanDiscardCanvasContents = false;
36144324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    }
36244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org}
36344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org
3649c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::flushPendingCommands(PlaybackMode playbackMode) {
365a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org    if (!fPipeController.hasPendingCommands()) {
36688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        return;
36788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
368c4c9870953037be94da00ac9db887d171f6e479ccommit-bot@chromium.org    if (playbackMode == kNormal_PlaybackMode) {
36944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        aboutToDraw();
37088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
37188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    fPipeWriter.flushRecording(true);
372d4501a0aba2541489c32c89426bbfc59ed945da2junov@chromium.org    fPipeController.playback(kSilent_PlaybackMode == playbackMode);
373eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    if (playbackMode == kNormal_PlaybackMode && fNotificationClient) {
3749ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        fNotificationClient->flushedDrawCommands();
3759ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    }
3769ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    fPreviousStorageAllocated = storageAllocatedForRecording();
37788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
37888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3799c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::flush() {
380eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    this->flushPendingCommands(kNormal_PlaybackMode);
38188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    fImmediateCanvas->flush();
38288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
38388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3849c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::freeMemoryIfPossible(size_t bytesToFree) {
3859ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    size_t val = fPipeWriter.freeMemoryIfPossible(bytesToFree);
3869ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    fPreviousStorageAllocated = storageAllocatedForRecording();
3879ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
38888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
38988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
3909c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::getBitmapSizeThreshold() const {
3917775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    return fBitmapSizeThreshold;
3927775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com}
3937775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
3949c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::setBitmapSizeThreshold(size_t sizeThreshold) {
3957775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    fBitmapSizeThreshold = sizeThreshold;
3967775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com}
3977775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
3989c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comsize_t SkDeferredDevice::storageAllocatedForRecording() const {
39988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return (fPipeController.storageAllocatedForRecording()
40088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org            + fPipeWriter.storageAllocatedForRecording());
40188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
40288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4039c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::recordedDrawCommand() {
40488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    size_t storageAllocated = this->storageAllocatedForRecording();
4059ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org
40688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    if (storageAllocated > fMaxRecordingStorageBytes) {
40788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        // First, attempt to reduce cache without flushing
40888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        size_t tryFree = storageAllocated - fMaxRecordingStorageBytes;
40988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        if (this->freeMemoryIfPossible(tryFree) < tryFree) {
41088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org            // Flush is necessary to free more space.
411eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org            this->flushPendingCommands(kNormal_PlaybackMode);
41288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org            // Free as much as possible to avoid oscillating around fMaxRecordingStorageBytes
41388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org            // which could cause a high flushing frequency.
414100abf49e10544bc4f436bf1f38e6929779621f4bsalomon@google.com            this->freeMemoryIfPossible(~0U);
41588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        }
4169ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        storageAllocated = this->storageAllocatedForRecording();
41788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
4189ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org
419d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fNotificationClient &&
4209ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        storageAllocated != fPreviousStorageAllocated) {
4219ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        fPreviousStorageAllocated = storageAllocated;
4229ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        fNotificationClient->storageAllocatedForRecordingChanged(storageAllocated);
4239ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    }
4249ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org}
4259ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org
4269c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkCanvas* SkDeferredDevice::recordingCanvas() {
42788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return fRecordingCanvas;
42888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
42988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4309c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkImage* SkDeferredDevice::newImageSnapshot() {
43167d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    this->flush();
4325ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org    return fSurface ? fSurface->newImageSnapshot() : NULL;
43367d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org}
43467d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org
4359c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comuint32_t SkDeferredDevice::getDeviceCapabilities() {
4369becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org    return immediateDevice()->getDeviceCapabilities();
43788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
43888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4399c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comint SkDeferredDevice::width() const {
4409becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org    return immediateDevice()->width();
44188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
44288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4439c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comint SkDeferredDevice::height() const {
4449becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org    return immediateDevice()->height();
44588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
44688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4479c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkBitmap::Config SkDeferredDevice::config() const {
448284a84d21044d8b45df3047f261fbc922dca175creed@google.com    return immediateDevice()->config();
449284a84d21044d8b45df3047f261fbc922dca175creed@google.com}
450284a84d21044d8b45df3047f261fbc922dca175creed@google.com
4519c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::isOpaque() const {
452284a84d21044d8b45df3047f261fbc922dca175creed@google.com    return immediateDevice()->isOpaque();
453284a84d21044d8b45df3047f261fbc922dca175creed@google.com}
454284a84d21044d8b45df3047f261fbc922dca175creed@google.com
4559c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkImageInfo SkDeferredDevice::imageInfo() const {
456284a84d21044d8b45df3047f261fbc922dca175creed@google.com    return immediateDevice()->imageInfo();
457284a84d21044d8b45df3047f261fbc922dca175creed@google.com}
458284a84d21044d8b45df3047f261fbc922dca175creed@google.com
4599c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comGrRenderTarget* SkDeferredDevice::accessRenderTarget() {
460eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    this->flushPendingCommands(kNormal_PlaybackMode);
4619becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org    return immediateDevice()->accessRenderTarget();
46288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
46388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
4649c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::prepareForImmediatePixelWrite() {
46544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    // The purpose of the following code is to make sure commands are flushed, that
46644324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    // aboutToDraw() is called and that notifyContentWillChange is called, without
46744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    // calling anything redundantly.
46844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    if (fPipeController.hasPendingCommands()) {
46944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        this->flushPendingCommands(kNormal_PlaybackMode);
47044324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    } else {
47144324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        bool mustNotifyDirectly = !fCanDiscardCanvasContents;
47244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        this->aboutToDraw();
47344324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        if (mustNotifyDirectly) {
47444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org            fSurface->notifyContentWillChange(SkSurface::kRetain_ContentChangeMode);
47544324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        }
47644324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    }
47744324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org
47844324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org    fImmediateCanvas->flush();
47944324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org}
48044324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org
4814cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#ifdef SK_SUPPORT_LEGACY_WRITEPIXELSCONFIG
4829c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comvoid SkDeferredDevice::writePixels(const SkBitmap& bitmap, int x, int y,
4834cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org                                 SkCanvas::Config8888 config8888) {
48488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
48588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    if (x <= 0 && y <= 0 && (x + bitmap.width()) >= width() &&
48688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        (y + bitmap.height()) >= height()) {
4870a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->skipPendingCommands();
48888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
48988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
49088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    if (SkBitmap::kARGB_8888_Config == bitmap.config() &&
49188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        SkCanvas::kNative_Premul_Config8888 != config8888 &&
49288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        kPMColorAlias != config8888) {
49388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        //Special case config: no deferral
49444324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        prepareForImmediatePixelWrite();
4959becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org        immediateDevice()->writePixels(bitmap, x, y, config8888);
49688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        return;
49788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
49888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
49988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkPaint paint;
50088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    paint.setXfermodeMode(SkXfermode::kSrc_Mode);
5017775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    if (shouldDrawImmediately(&bitmap, NULL, getBitmapSizeThreshold())) {
50244324fae1c231bf262af24fc7f8a0f489ae5a490junov@chromium.org        prepareForImmediatePixelWrite();
50388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        fImmediateCanvas->drawSprite(bitmap, x, y, &paint);
50488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    } else {
50588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org        this->recordingCanvas()->drawSprite(bitmap, x, y, &paint);
5069ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        this->recordedDrawCommand();
5079ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org
50888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    }
50988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
5104cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org#endif
5114cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org
5129c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::onWritePixels(const SkImageInfo& info, const void* pixels, size_t rowBytes,
5134cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org                                   int x, int y) {
5144cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    SkASSERT(x >= 0 && y >= 0);
5154cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    SkASSERT(x + info.width() <= width());
5164cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    SkASSERT(y + info.height() <= height());
5174cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org
5184cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    this->flushPendingCommands(kNormal_PlaybackMode);
5194cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org
5204cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    const SkImageInfo deviceInfo = this->imageInfo();
5214cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    if (info.width() == deviceInfo.width() && info.height() == deviceInfo.height()) {
5224cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org        this->skipPendingCommands();
5234cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    }
524e62513fb9274b65bcd9fecf61acc418dd3949df5skia.committer@gmail.com
5254cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    this->prepareForImmediatePixelWrite();
5264cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org    return immediateDevice()->onWritePixels(info, pixels, rowBytes, x, y);
5274cd9e2169e35cd67ee7358acea6541245e1d1744commit-bot@chromium.org}
52888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
5299c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comconst SkBitmap& SkDeferredDevice::onAccessBitmap() {
530eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    this->flushPendingCommands(kNormal_PlaybackMode);
5319becf0090f9c1c14f42d161b9a1fb3af142f9420junov@chromium.org    return immediateDevice()->accessBitmap(false);
53288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
53388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
5349c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkBaseDevice* SkDeferredDevice::onCreateDevice(const SkImageInfo& info, Usage usage) {
53588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    // Save layer usage not supported, and not required by SkDeferredCanvas.
53688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    SkASSERT(usage != kSaveLayer_Usage);
53788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    // Create a compatible non-deferred device.
538b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org    // We do not create a deferred device because we know the new device
539b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org    // will not be used with a deferred canvas (there is no API for that).
5409c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    // And connecting a SkDeferredDevice to non-deferred canvas can result
541b1c725a108f57ac186542b43de80fa651a4dddbajunov@chromium.org    // in unpredictable behavior.
54215a140599942f70e47380e3f700a825c7cece3b4commit-bot@chromium.org    return immediateDevice()->createCompatibleDevice(info);
54388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
54488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
5459c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkSurface* SkDeferredDevice::newSurface(const SkImageInfo& info) {
54676f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com    return this->immediateDevice()->newSurface(info);
54776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com}
54876f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com
5499c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.combool SkDeferredDevice::onReadPixels(
55088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    const SkBitmap& bitmap, int x, int y, SkCanvas::Config8888 config8888) {
551eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org    this->flushPendingCommands(kNormal_PlaybackMode);
55288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return fImmediateCanvas->readPixels(const_cast<SkBitmap*>(&bitmap),
55388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org                                                   x, y, config8888);
55488e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
55588e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
5567775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comclass AutoImmediateDrawIfNeeded {
5577775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.compublic:
5587775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkBitmap* bitmap,
5597775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com                              const SkPaint* paint) {
5607775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        this->init(canvas, bitmap, paint);
5617775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    }
5627775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
5637775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    AutoImmediateDrawIfNeeded(SkDeferredCanvas& canvas, const SkPaint* paint) {
5647775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        this->init(canvas, NULL, paint);
5657775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    }
5667775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
5677775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    ~AutoImmediateDrawIfNeeded() {
5687775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        if (fCanvas) {
5697775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com            fCanvas->setDeferredDrawing(true);
5707775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        }
5717775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    }
5727775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comprivate:
5737775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    void init(SkDeferredCanvas& canvas, const SkBitmap* bitmap, const SkPaint* paint)
5747775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    {
5759c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com        SkDeferredDevice* device = static_cast<SkDeferredDevice*>(canvas.getDevice());
5767775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        if (canvas.isDeferredDrawing() && (NULL != device) &&
5777775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com            shouldDrawImmediately(bitmap, paint, device->getBitmapSizeThreshold())) {
5787775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com            canvas.setDeferredDrawing(false);
5797775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com            fCanvas = &canvas;
5807775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        } else {
5817775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com            fCanvas = NULL;
5827775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com        }
5837775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    }
5847775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
5857775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    SkDeferredCanvas* fCanvas;
5867775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com};
58788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
58866070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.orgSkDeferredCanvas* SkDeferredCanvas::Create(SkSurface* surface) {
5899c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    SkAutoTUnref<SkDeferredDevice> deferredDevice(SkNEW_ARGS(SkDeferredDevice, (surface)));
59066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    return SkNEW_ARGS(SkDeferredCanvas, (deferredDevice));
59166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org}
59266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org
5939c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredCanvas::SkDeferredCanvas(SkDeferredDevice* device) : SkCanvas (device) {
59466070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    this->init();
59566070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org}
59667d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org
597c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::init() {
5985e5a095a94281167056da707b03930f135748d71junov@chromium.org    fDeferredDrawing = true; // On by default
5994370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
601bfeddae9da240693441556b2f278827e213f75e8junov@chromium.orgvoid SkDeferredCanvas::setMaxRecordingStorage(size_t maxStorage) {
6029060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->validate();
603bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org    this->getDeferredDevice()->setMaxRecordingStorage(maxStorage);
604bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org}
605bfeddae9da240693441556b2f278827e213f75e8junov@chromium.org
6062e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkDeferredCanvas::storageAllocatedForRecording() const {
6072e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org    return this->getDeferredDevice()->storageAllocatedForRecording();
6082e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org}
6092e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org
6102e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.orgsize_t SkDeferredCanvas::freeMemoryIfPossible(size_t bytesToFree) {
6112e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org    return this->getDeferredDevice()->freeMemoryIfPossible(bytesToFree);
6122e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org}
6132e14ba8ceb41c68042ff133fecf0561a2c22efcajunov@chromium.org
6147775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.comvoid SkDeferredCanvas::setBitmapSizeThreshold(size_t sizeThreshold) {
6159c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    SkDeferredDevice* deferredDevice = this->getDeferredDevice();
6167775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    SkASSERT(deferredDevice);
6177775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com    deferredDevice->setBitmapSizeThreshold(sizeThreshold);
6187775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com}
6197775fd5779e632d6f5724e0e5d39ed347cf965b0sugoi@google.com
6209ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.orgvoid SkDeferredCanvas::recordedDrawCommand() {
6219ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    if (fDeferredDrawing) {
6229ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        this->getDeferredDevice()->recordedDrawCommand();
6239ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    }
6249ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org}
6259ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org
626c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::validate() const {
6279060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    SkASSERT(this->getDevice());
6284370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6294370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
6305e5a095a94281167056da707b03930f135748d71junov@chromium.orgSkCanvas* SkDeferredCanvas::drawingCanvas() const {
6319060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->validate();
6329060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    return fDeferredDrawing ? this->getDeferredDevice()->recordingCanvas() :
6339060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org        this->getDeferredDevice()->immediateCanvas();
6345e5a095a94281167056da707b03930f135748d71junov@chromium.org}
6355e5a095a94281167056da707b03930f135748d71junov@chromium.org
63688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgSkCanvas* SkDeferredCanvas::immediateCanvas() const {
63788e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    this->validate();
63888e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return this->getDeferredDevice()->immediateCanvas();
63988e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
64088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
6419c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.comSkDeferredDevice* SkDeferredCanvas::getDeferredDevice() const {
6429c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    return static_cast<SkDeferredDevice*>(this->getDevice());
6434370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6444370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
645c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::setDeferredDrawing(bool val) {
6469060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->validate(); // Must set device before calling this method
6474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    if (val != fDeferredDrawing) {
6484370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        if (fDeferredDrawing) {
6495e5a095a94281167056da707b03930f135748d71junov@chromium.org            // Going live.
650eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org            this->getDeferredDevice()->flushPendingCommands(kNormal_PlaybackMode);
6514370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        }
6524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        fDeferredDrawing = val;
6534370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
6544370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6554370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
65688e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgbool SkDeferredCanvas::isDeferredDrawing() const {
657b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org    return fDeferredDrawing;
658b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org}
659b10a6bd0a7df0ceeea0d53585c049450ec58b4b9junov@chromium.org
66088e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.orgbool SkDeferredCanvas::isFreshFrame() const {
66188e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org    return this->getDeferredDevice()->isFreshFrame();
66288e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org}
66388e29146c1efc5ff8eec06076c9dce12684f2c11junov@chromium.org
664a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.orgbool SkDeferredCanvas::hasPendingCommands() const {
665a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org    return this->getDeferredDevice()->hasPendingCommands();
666a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org}
667a38dfb6981379770221b16b5ec036b08f3005973junov@chromium.org
668fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.orgvoid SkDeferredCanvas::silentFlush() {
669fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    if (fDeferredDrawing) {
670eeaf47f638dbab2cbe3306e099d93dc6244b25a5junov@chromium.org        this->getDeferredDevice()->flushPendingCommands(kSilent_PlaybackMode);
671fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org    }
672fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org}
673fb10389403cf1cc771e103016207fde84c5f4825junov@chromium.org
674c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgSkDeferredCanvas::~SkDeferredCanvas() {
6754370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6764370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
6777070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.orgSkSurface* SkDeferredCanvas::setSurface(SkSurface* surface) {
6789c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    SkDeferredDevice* deferredDevice = this->getDeferredDevice();
67966070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    SkASSERT(NULL != deferredDevice);
68066070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    // By swapping the surface into the existing device, we preserve
68166070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    // all pending commands, which can help to seamlessly recover from
68266070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    // a lost accelerated graphics context.
68366070a527c480d1cef5f7f7136f68d4f17b68f06junov@chromium.org    deferredDevice->setSurface(surface);
6847070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org    return surface;
6857070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org}
6867070f76b90b098b4713bc0d13dc129adea64d7efjunov@chromium.org
6879ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.orgSkDeferredCanvas::NotificationClient* SkDeferredCanvas::setNotificationClient(
6889ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    NotificationClient* notificationClient) {
689c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org
6909c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    SkDeferredDevice* deferredDevice = this->getDeferredDevice();
6914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    SkASSERT(deferredDevice);
6924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    if (deferredDevice) {
6939ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org        deferredDevice->setNotificationClient(notificationClient);
6944370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
6959ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return notificationClient;
6964370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
6974370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
6985ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.orgSkImage* SkDeferredCanvas::newImageSnapshot() {
6999c135db83d198e7d8200027c7d2cf60f38517ee3reed@google.com    SkDeferredDevice* deferredDevice = this->getDeferredDevice();
70067d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org    SkASSERT(deferredDevice);
7015ee449af7448c202cfc6e9a359d8f996392885b2junov@chromium.org    return deferredDevice ? deferredDevice->newImageSnapshot() : NULL;
70267d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org}
70367d74228448cab0f1eca77fff444ddbe8c2eaef3junov@chromium.org
7044370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.combool SkDeferredCanvas::isFullFrame(const SkRect* rect,
705c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                   const SkPaint* paint) const {
7069060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    SkCanvas* canvas = this->drawingCanvas();
7079060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    SkISize canvasSize = this->getDeviceSize();
7084370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    if (rect) {
7094370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        if (!canvas->getTotalMatrix().rectStaysRect()) {
7104370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            return false; // conservative
7114370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        }
7124370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
7134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        SkRect transformedRect;
7144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        canvas->getTotalMatrix().mapRect(&transformedRect, *rect);
7154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
7164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        if (paint) {
7174370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            SkPaint::Style paintStyle = paint->getStyle();
718d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com            if (!(paintStyle == SkPaint::kFill_Style ||
7194370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                paintStyle == SkPaint::kStrokeAndFill_Style)) {
7204370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                return false;
7214370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            }
7224370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            if (paint->getMaskFilter() || paint->getLooper()
7234370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                || paint->getPathEffect() || paint->getImageFilter()) {
7244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                return false; // conservative
7254370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            }
7264370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        }
7274370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
7284370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        // The following test holds with AA enabled, and is conservative
7294370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        // by a 0.5 pixel margin with AA disabled
730d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        if (transformedRect.fLeft > SkIntToScalar(0) ||
731d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com            transformedRect.fTop > SkIntToScalar(0) ||
732b1e218e782261304440199642f1b98e7ba96b525junov@chromium.org            transformedRect.fRight < SkIntToScalar(canvasSize.fWidth) ||
733b1e218e782261304440199642f1b98e7ba96b525junov@chromium.org            transformedRect.fBottom < SkIntToScalar(canvasSize.fHeight)) {
7344370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com            return false;
7354370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com        }
7364370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
7374370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
7388f0ca06ef44f7b94da549fbb0c5fab27092c5116junov@chromium.org    return this->getClipStack()->quickContains(SkRect::MakeXYWH(0, 0,
7398f0ca06ef44f7b94da549fbb0c5fab27092c5116junov@chromium.org        SkIntToScalar(canvasSize.fWidth), SkIntToScalar(canvasSize.fHeight)));
7404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
742e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDeferredCanvas::willSave(SaveFlags flags) {
7439060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->save(flags);
7449ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
745e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willSave(flags);
7464370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
748e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkDeferredCanvas::willSaveLayer(const SkRect* bounds,
749e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org                                                            const SkPaint* paint, SaveFlags flags) {
7509060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->saveLayer(bounds, paint, flags);
7519ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
752e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willSaveLayer(bounds, paint, flags);
753e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    // No need for a full layer.
754e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    return kNoLayer_SaveLayerStrategy;
7554370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7564370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
757e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.orgvoid SkDeferredCanvas::willRestore() {
7589060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->restore();
7599ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
760e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    this->INHERITED::willRestore();
7614370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7624370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
763c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::isDrawingToLayer() const {
7649060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    return this->drawingCanvas()->isDrawingToLayer();
7654370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7664370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
767c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::translate(SkScalar dx, SkScalar dy) {
7689060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->translate(dx, dy);
7699ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    bool val = this->INHERITED::translate(dx, dy);
7709ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
7719ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
7724370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7734370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
774c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::scale(SkScalar sx, SkScalar sy) {
7759060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->scale(sx, sy);
7769ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    bool val = this->INHERITED::scale(sx, sy);
7779ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
7789ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
7794370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7804370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
781c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::rotate(SkScalar degrees) {
7829060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->rotate(degrees);
7839ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    bool val = this->INHERITED::rotate(degrees);
7849ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
7859ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
7864370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7874370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
788c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::skew(SkScalar sx, SkScalar sy) {
7899060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->skew(sx, sy);
7909ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    bool val = this->INHERITED::skew(sx, sy);
7919ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
7929ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
7934370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
7944370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
795c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgbool SkDeferredCanvas::concat(const SkMatrix& matrix) {
7969060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->concat(matrix);
7979ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    bool val = this->INHERITED::concat(matrix);
7989ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
7999ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return val;
8004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8014370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
802c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::setMatrix(const SkMatrix& matrix) {
8039060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->setMatrix(matrix);
804a907ac3e3e3458fbb5d673c3feafb31fd7647b38junov@chromium.org    this->INHERITED::setMatrix(matrix);
8059ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8064370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8074370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8088f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRect(const SkRect& rect,
8098f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                  SkRegion::Op op,
8108f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                  ClipEdgeStyle edgeStyle) {
8118f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->drawingCanvas()->clipRect(rect, op, kSoft_ClipEdgeStyle == edgeStyle);
8128f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->INHERITED::onClipRect(rect, op, edgeStyle);
8139ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8168f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRRect(const SkRRect& rrect,
8178f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                   SkRegion::Op op,
8188f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                   ClipEdgeStyle edgeStyle) {
8198f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->drawingCanvas()->clipRRect(rrect, op, kSoft_ClipEdgeStyle == edgeStyle);
8208f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->INHERITED::onClipRRect(rrect, op, edgeStyle);
8214ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    this->recordedDrawCommand();
8224ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
8234ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
8248f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipPath(const SkPath& path,
8258f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                  SkRegion::Op op,
8268f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com                                  ClipEdgeStyle edgeStyle) {
8278f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->drawingCanvas()->clipPath(path, op, kSoft_ClipEdgeStyle == edgeStyle);
8288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->INHERITED::onClipPath(path, op, edgeStyle);
8299ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8328f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.comvoid SkDeferredCanvas::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
8339060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->clipRegion(deviceRgn, op);
8348f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    this->INHERITED::onClipRegion(deviceRgn, op);
8359ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8364370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8374370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
838c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::clear(SkColor color) {
8394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    // purge pending commands
8404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    if (fDeferredDrawing) {
8410a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
8424370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
8434370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8449060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->clear(color);
8459ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8464370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
848c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::drawPaint(const SkPaint& paint) {
849d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fDeferredDrawing && this->isFullFrame(NULL, &paint) &&
850c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org        isPaintOpaque(&paint)) {
8510a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
8524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
85310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
8549060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPaint(paint);
8559ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8564370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8574370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawPoints(PointMode mode, size_t count,
859c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                  const SkPoint pts[], const SkPaint& paint) {
86010f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
8619060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPoints(mode, count, pts, paint);
8629ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8634370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8644370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8654ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkDeferredCanvas::drawOval(const SkRect& rect, const SkPaint& paint) {
8664ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
8674ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    this->drawingCanvas()->drawOval(rect, paint);
8684ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    this->recordedDrawCommand();
8694ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
8704ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
8717ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDeferredCanvas::drawRect(const SkRect& rect, const SkPaint& paint) {
872d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fDeferredDrawing && this->isFullFrame(&rect, &paint) &&
873c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org        isPaintOpaque(&paint)) {
8740a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
8754370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
876306ab9d5de38f2a547fd1d69aedbe69b5c6617ccskia.committer@gmail.com
87710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
8789060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawRect(rect, paint);
8799ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
8804370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
8814370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
8824ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.comvoid SkDeferredCanvas::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
8834ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    if (rrect.isRect()) {
8844ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        this->SkDeferredCanvas::drawRect(rrect.getBounds(), paint);
8854ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    } else if (rrect.isOval()) {
8864ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        this->SkDeferredCanvas::drawOval(rrect.getBounds(), paint);
8874ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    } else {
8884ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
8894ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        this->drawingCanvas()->drawRRect(rrect, paint);
8904ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com        this->recordedDrawCommand();
8914ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    }
8924ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com}
8934ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com
894ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.orgvoid SkDeferredCanvas::onDrawDRRect(const SkRRect& outer, const SkRRect& inner,
895ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org                                    const SkPaint& paint) {
896ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
897ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org    this->drawingCanvas()->drawDRRect(outer, inner, paint);
898ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org    this->recordedDrawCommand();
899ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org}
900ab5827354e2c23624acc3fc1fe4a83788bc99e96commit-bot@chromium.org
9017ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.comvoid SkDeferredCanvas::drawPath(const SkPath& path, const SkPaint& paint) {
90210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
9039060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPath(path, paint);
9049ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9054370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9064370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9074370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmap(const SkBitmap& bitmap, SkScalar left,
908c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                  SkScalar top, const SkPaint* paint) {
9098f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    SkRect bitmapRect = SkRect::MakeXYWH(left, top,
9108f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org        SkIntToScalar(bitmap.width()), SkIntToScalar(bitmap.height()));
911d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fDeferredDrawing &&
9129060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org        this->isFullFrame(&bitmapRect, paint) &&
91387f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org        isPaintOpaque(paint, &bitmap)) {
9140a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
9154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
9164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
91710f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint);
9189060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawBitmap(bitmap, left, top, paint);
9199ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9204370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9214370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9227112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.comvoid SkDeferredCanvas::drawBitmapRectToRect(const SkBitmap& bitmap,
9237112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com                                            const SkRect* src,
9247112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com                                            const SkRect& dst,
925eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                            const SkPaint* paint,
926eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                            DrawBitmapRectFlags flags) {
927d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fDeferredDrawing &&
9289060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org        this->isFullFrame(&dst, paint) &&
92987f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org        isPaintOpaque(paint, &bitmap)) {
9300a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
9314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
9324370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
93310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint);
934eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org    this->drawingCanvas()->drawBitmapRectToRect(bitmap, src, dst, paint, flags);
9359ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9364370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9374370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9384370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmapMatrix(const SkBitmap& bitmap,
9404370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                        const SkMatrix& m,
941c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                        const SkPaint* paint) {
9424370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    // TODO: reset recording canvas if paint+bitmap is opaque and clip rect
9434370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    // covers canvas entirely and transformed bitmap covers canvas entirely
94410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint);
9459060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawBitmapMatrix(bitmap, m, paint);
9469ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9474370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9484370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9494370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawBitmapNine(const SkBitmap& bitmap,
9504370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                      const SkIRect& center, const SkRect& dst,
951c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                      const SkPaint* paint) {
9524370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    // TODO: reset recording canvas if paint+bitmap is opaque and clip rect
9534370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    // covers canvas entirely and dst covers canvas entirely
95410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint);
9559060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawBitmapNine(bitmap, center, dst, paint);
9569ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9574370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9584370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9594370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawSprite(const SkBitmap& bitmap, int left, int top,
960c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                  const SkPaint* paint) {
9618f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    SkRect bitmapRect = SkRect::MakeXYWH(
9628f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org        SkIntToScalar(left),
963d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        SkIntToScalar(top),
9648f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org        SkIntToScalar(bitmap.width()),
9658f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org        SkIntToScalar(bitmap.height()));
966d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    if (fDeferredDrawing &&
9679060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org        this->isFullFrame(&bitmapRect, paint) &&
96887f982c80833eeebf541becec8e27b96c8c889f7junov@chromium.org        isPaintOpaque(paint, &bitmap)) {
9690a67f964b3ed6046303655ced757be7c0f2c060cjunov@chromium.org        this->getDeferredDevice()->skipPendingCommands();
9704370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com    }
9714370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
97210f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &bitmap, paint);
9739060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawSprite(bitmap, left, top, paint);
9749ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9754370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9764370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9774370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawText(const void* text, size_t byteLength,
978c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                SkScalar x, SkScalar y, const SkPaint& paint) {
97910f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
9809060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawText(text, byteLength, x, y, paint);
9819ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9824370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9834370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9844370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawPosText(const void* text, size_t byteLength,
985c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                   const SkPoint pos[], const SkPaint& paint) {
98610f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
9879060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPosText(text, byteLength, pos, paint);
9889ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9894370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9904370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9914370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawPosTextH(const void* text, size_t byteLength,
9924370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                    const SkScalar xpos[], SkScalar constY,
993c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                    const SkPaint& paint) {
99410f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
9959060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPosTextH(text, byteLength, xpos, constY, paint);
9969ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
9974370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
9984370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
9994370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawTextOnPath(const void* text, size_t byteLength,
10004370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                      const SkPath& path,
10014370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                      const SkMatrix* matrix,
1002c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                      const SkPaint& paint) {
100310f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
10049060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawTextOnPath(text, byteLength, path, matrix, paint);
10059ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
10064370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
10074370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
1008c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgvoid SkDeferredCanvas::drawPicture(SkPicture& picture) {
10099060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawPicture(picture);
10109ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
10114370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
10124370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
10134370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comvoid SkDeferredCanvas::drawVertices(VertexMode vmode, int vertexCount,
10144370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                    const SkPoint vertices[],
10154370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                    const SkPoint texs[],
10164370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                    const SkColor colors[], SkXfermode* xmode,
10174370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com                                    const uint16_t indices[], int indexCount,
1018c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.org                                    const SkPaint& paint) {
101910f7f97d4213a251d63fcfcfd6e55b7b528d949ajunov@chromium.org    AutoImmediateDrawIfNeeded autoDraw(*this, &paint);
10209060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->drawVertices(vmode, vertexCount, vertices, texs, colors, xmode,
10219060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org                                        indices, indexCount, paint);
10229ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
10234370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
10244370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
1025c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgSkBounder* SkDeferredCanvas::setBounder(SkBounder* bounder) {
10269060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    this->drawingCanvas()->setBounder(bounder);
10279ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->INHERITED::setBounder(bounder);
10289ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
10299ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    return bounder;
10304370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
10314370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
1032c16ca92fd1ca609eb2902d14727bec78848ba767junov@chromium.orgSkDrawFilter* SkDeferredCanvas::setDrawFilter(SkDrawFilter* filter) {
1033d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    this->drawingCanvas()->setDrawFilter(filter);
10349ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->INHERITED::setDrawFilter(filter);
10359ed02b9da25a76ee4c73c1ab19c18b899a223a17junov@chromium.org    this->recordedDrawCommand();
1036d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com    return filter;
10374370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
10384370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com
10394370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.comSkCanvas* SkDeferredCanvas::canvasForDrawIter() {
10409060c9bae9dc895ffe73adefccbc896d2973882djunov@chromium.org    return this->drawingCanvas();
10414370aedf7f55af74e9ebb4ad1c2e010c08236dfajunov@google.com}
1042