1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
776f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPictureRecord_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPictureRecord_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkCanvas.h"
128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h"
138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPathHeap.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPicture.h"
15db539905bb3af7bd05839a7d2558e97d5cb51ca2robertphillips#include "SkPictureData.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPictureFlat.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTemplates.h"
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkWriter32.h"
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
209f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.comclass SkBBoxHierarchy;
218016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.orgclass SkPictureStateTree;
229f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com
232ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// These macros help with packing and unpacking a single byte value and
242ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// a 3 byte value into/out of a uint32_t
252ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define MASK_24 0x00FFFFFF
262ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define UNPACK_8_24(combined, small, large)             \
272ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    small = (combined >> 24) & 0xFF;                    \
282ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    large = combined & MASK_24;
292ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define PACK_8_24(small, large) ((small << 24) | large)
302ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
312ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPictureRecord : public SkCanvas {
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
340bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags);
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkPictureRecord();
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
372d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void clear(SkColor) SK_OVERRIDE;
382d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
402d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint&) SK_OVERRIDE;
414ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
427ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
434ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
447ce564cccb246ec56427085872b2e1458fe74bd1bsalomon@google.com    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
462d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint*) SK_OVERRIDE;
477112173c3c4cd1b1e7da8cdf971d71f01dd91299reed@google.com    virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
487475811143e190e172bf83d13c4bdba85704b604skia.committer@gmail.com                                      const SkRect& dst, const SkPaint* paint,
49eed779d866e1e239bfb9ebc6a225b7345a41adf9commit-bot@chromium.org                                      DrawBitmapRectFlags flags) SK_OVERRIDE;
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
512d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                  const SkPaint*) SK_OVERRIDE;
52f0b5e1190af9807a027c0adba2f1380663c8e910reed@google.com    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
532d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawSprite(const SkBitmap&, int left, int top,
552d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                            const SkPaint*) SK_OVERRIDE;
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual void drawVertices(VertexMode, int vertexCount,
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkPoint vertices[], const SkPoint texs[],
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const SkColor colors[], SkXfermode*,
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                          const uint16_t indices[], int indexCount,
602d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com                              const SkPaint&) SK_OVERRIDE;
612d4297cfa40e69ef155b70614d5cee6a6c21d2f9reed@google.com    virtual void drawData(const void*, size_t) SK_OVERRIDE;
620a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
630a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
640a4805e33f8ddb445a2fd061462e715e1707f049robertphillips@google.com    virtual void endCommentGroup() SK_OVERRIDE;
658f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    virtual bool isDrawingToLayer() const SK_OVERRIDE;
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
673f5ecd6cb417c7adf256e48ef3f336052d326b84junov@chromium.org    void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&,
684595426b553c0c721f41aa14d598caa5d9940207reed@google.com                                 SkScalar minY, SkScalar maxY);
6974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
709b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    const SkTDArray<const SkPicture* >& getPictureRefs() const {
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fPictureRefs;
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
7374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
74b7425173f96e93b090787e2386ba5f022b6c2869fmalita    const SkTDArray<const SkTextBlob* >& getTextBlobRefs() const {
75b7425173f96e93b090787e2386ba5f022b6c2869fmalita        return fTextBlobRefs;
76b7425173f96e93b090787e2386ba5f022b6c2869fmalita    }
77b7425173f96e93b090787e2386ba5f022b6c2869fmalita
780bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkData* opData(bool deepCopy) const {
790bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        this->validate(fWriter.bytesWritten(), 0);
800bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
810bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        if (fWriter.bytesWritten() == 0) {
820bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips            return SkData::NewEmpty();
830bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        }
840bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
850bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        if (deepCopy) {
860bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips            return SkData::NewWithCopy(fWriter.contiguousArray(), fWriter.bytesWritten());
870bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        }
880bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
890bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        return fWriter.snapshotAsData();
900bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    }
910bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
92e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips    const SkPathHeap* pathHeap() const {
93e26e65e8f831f7a5626c92d11bbb8c2cec1f70derobertphillips        return fPathHeap.get();
940bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    }
950bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
960bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    const SkPictureContentInfo& contentInfo() const {
970bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        return fContentInfo;
980bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    }
990bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
1004866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    void setFlags(uint32_t recordFlags) {
1014866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org        fRecordFlags = recordFlags;
1024866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    }
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkWriter32& writeStream() const {
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fWriter;
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
108d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com    void beginRecording();
109a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org    void endRecording();
110d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com
111e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org    void internalOnly_EnableOpts(bool optsEnabled) {
112e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org        fOptsEnabled = optsEnabled;
113e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org    }
114e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org
11568250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.orgprotected:
11668250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org    void addNoOp();
11768250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
1194b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    void handleOptimization(int opt);
120dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordRestoreOffsetPlaceholder(SkRegion::Op);
1215a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset);
122e3dbedb44cad6c7b7e5c9aae5224d0b0abec9bf4junov@chromium.org
123ffacd3c56d73c03d3fe53b47a49ea6be2ca4748freed@google.com    SkTDArray<int32_t> fRestoreOffsetStack;
1248f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    int fFirstSavedLayerIndex;
1258f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    enum {
1268f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org        kNoSavedLayerIndex = -1
1278f9ecbd3466d4330886b4c23b06e75b468c795adjunov@chromium.org    };
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
129210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    SkTDArray<uint32_t> fCullOffsetStack;
130210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
1312ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    /*
1322ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * Write the 'drawType' operation and chunk size to the skp. 'size'
133ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com     * can potentially be increased if the chunk size needs its own storage
1342ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * location (i.e., it overflows 24 bits).
1352ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * Returns the start offset of the chunk. This is the location at which
1362ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * the opcode & size are stored.
137ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com     * TODO: since we are handing the size into here we could call reserve
1382ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * and then return a pointer to the memory storage. This could decrease
1392ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * allocation overhead but could lead to more wasted space (the tail
1402ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * end of blocks could go unused). Possibly add a second addDraw that
1412ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * operates in this manner.
1422ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     */
143dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t addDraw(DrawType drawType, size_t* size) {
1444469938e92d779dff05e745559e67907bbf21e78reed@google.com        size_t offset = fWriter.bytesWritten();
1452ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
14697af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com        this->predrawNotify();
147afdada2eabdef47a59e08c884b2beb1af3f31aa5hendrikw        fContentInfo.addOperation();
14897af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
1492ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        SkASSERT(0 != *size);
1502ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        SkASSERT(((uint8_t) drawType) == drawType);
1512ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1522ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        if (0 != (*size & ~MASK_24) || *size == MASK_24) {
1532ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com            fWriter.writeInt(PACK_8_24(drawType, MASK_24));
1542ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com            *size += 1;
155dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org            fWriter.writeInt(SkToU32(*size));
1562ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        } else {
157dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org            fWriter.writeInt(PACK_8_24(drawType, SkToU32(*size)));
1582ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        }
1592ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1602ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        return offset;
16174b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org    }
1622ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addInt(int value) {
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fWriter.writeInt(value);
1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addScalar(SkScalar scalar) {
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fWriter.writeScalar(scalar);
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
16974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
1708016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.org    // The command at 'offset' in the skp uses the specified bitmap
1718016f79cfc6b4e9b34049ecbccdb65ee222d537acommit-bot@chromium.org    int addBitmap(const SkBitmap& bitmap);
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addMatrix(const SkMatrix& matrix);
173f3b1223e6d52b161dbc59a4119ba6a4161b10a54junov@chromium.org    const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr(&paint); }
174f3b1223e6d52b161dbc59a4119ba6a4161b10a54junov@chromium.org    const SkFlatData* addPaintPtr(const SkPaint* paint);
175cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    void addFlatPaint(const SkFlatData* flatPaint);
176b3c9d1c33caf325aada244204215eb790c228c12dandov    void addPatch(const SkPoint cubics[12]);
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPath(const SkPath& path);
1789b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    void addPicture(const SkPicture* picture);
1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPoint(const SkPoint& point);
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPoints(const SkPoint pts[], int count);
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRect(const SkRect& rect);
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRectPtr(const SkRect* rect);
183f0b5e1190af9807a027c0adba2f1380663c8e910reed@google.com    void addIRect(const SkIRect& rect);
1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addIRectPtr(const SkIRect* rect);
1854ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    void addRRect(const SkRRect&);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRegion(const SkRegion& region);
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addText(const void* text, size_t byteLength);
188b7425173f96e93b090787e2386ba5f022b6c2869fmalita    void addTextBlob(const SkTextBlob* blob);
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1904866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    int find(const SkBitmap& bitmap);
1914866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org
1926162af8d4c05354a160f6aa44d9c4440721c892arobertphillipsprotected:
193dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    void validate(size_t initialOffset, size_t size) const {
1944469938e92d779dff05e745559e67907bbf21e78reed@google.com        SkASSERT(fWriter.bytesWritten() == initialOffset + size);
1952ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    }
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1974a8126e7f81384526629b1e21bf89b632ea13cd9reed    virtual SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) SK_OVERRIDE;
198c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org    const void* onPeekPixels(SkImageInfo*, size_t*) SK_OVERRIDE {
199c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        return NULL;
200c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org    }
201e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
2025f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita    virtual void willSave() SK_OVERRIDE;
203e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    virtual SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) SK_OVERRIDE;
204e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org    virtual void willRestore() SK_OVERRIDE;
205e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
20644c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    virtual void didConcat(const SkMatrix&) SK_OVERRIDE;
20744c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org    virtual void didSetMatrix(const SkMatrix&) SK_OVERRIDE;
20844c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org
209ed9806f5c972513d4141c9d1b5a04ab78b3af4cbcommit-bot@chromium.org    virtual void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) SK_OVERRIDE;
210210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    virtual void onPushCull(const SkRect&) SK_OVERRIDE;
211210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    virtual void onPopCull() SK_OVERRIDE;
21276f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com
213e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
214e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                            const SkPaint&) SK_OVERRIDE;
215e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
216e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                               const SkPaint&) SK_OVERRIDE;
217e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
218e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                SkScalar constY, const SkPaint&) SK_OVERRIDE;
219e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
220e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                  const SkMatrix* matrix, const SkPaint&) SK_OVERRIDE;
221b7425173f96e93b090787e2386ba5f022b6c2869fmalita    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
222b7425173f96e93b090787e2386ba5f022b6c2869fmalita                                const SkPaint& paint) SK_OVERRIDE;
223b3c9d1c33caf325aada244204215eb790c228c12dandov
224b3c9d1c33caf325aada244204215eb790c228c12dandov    virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
225b3c9d1c33caf325aada244204215eb790c228c12dandov                             const SkPoint texCoords[4], SkXfermode* xmode,
226b3c9d1c33caf325aada244204215eb790c228c12dandov                             const SkPaint& paint) SK_OVERRIDE;
227e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com
2288f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
2298f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
2308f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) SK_OVERRIDE;
2318f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com    virtual void onClipRegion(const SkRegion&, SkRegion::Op) SK_OVERRIDE;
2328f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
233d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed    virtual void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) SK_OVERRIDE;
2349b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips
235cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    // Return fontmetrics.fTop,fBottom in topbot[0,1], after they have been
236cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    // tweaked by paint.computeFastBounds().
237cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    static void ComputeFontMetricsTopBottom(const SkPaint& paint, SkScalar topbot[2]);
238cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org
239cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    // Make sure that flat has fTopBot written.
240cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    static void WriteTopBot(const SkPaint& paint, const SkFlatData& flat) {
241cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org        if (!flat.isTopBotWritten()) {
242cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org            ComputeFontMetricsTopBottom(paint, flat.writableTopBot());
243cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org            SkASSERT(flat.isTopBotWritten());
244cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org        }
245cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    }
246cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    // Will return a cached version when possible.
247cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    const SkFlatData* getFlatPaintData(const SkPaint& paint);
248cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    /**
249cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org     * SkBBoxRecord::drawPosTextH gets a flat paint and uses it,
250cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org     * then it calls this, using the extra parameter, to avoid duplication.
251cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org     */
252cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org    void drawPosTextHImpl(const void* text, size_t byteLength,
253cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org                          const SkScalar xpos[], SkScalar constY,
254cf7be95b19f283e3c5410f977474f433a1e10dadcommit-bot@chromium.org                          const SkPaint& paint, const SkFlatData* flatPaintData);
2559f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com
2565a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    int addPathToHeap(const SkPath& path);  // does not write to ops stream
2575a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com
2581dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com    // These entry points allow the writing of matrices, clips, saves &
2595a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    // restores to be deferred (e.g., if the MC state is being collapsed and
2605a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    // only written out as needed).
2615a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void recordConcat(const SkMatrix& matrix);
262d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    void recordTranslate(const SkMatrix& matrix);
263d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    void recordScale(const SkMatrix& matrix);
264dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRect(const SkRect& rect, SkRegion::Op op, bool doAA);
265dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA);
266dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipPath(int pathID, SkRegion::Op op, bool doAA);
267dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRegion(const SkRegion& region, SkRegion::Op op);
2685f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita    void recordSave();
2695a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void recordSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags);
270105a4a584c4c2c84c24e102112326b15683673f5robertphillips@google.com    void recordRestore(bool fillInSkips = true);
2715a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com
2729f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com    // These are set to NULL in our constructor, but may be changed by
2739f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com    // subclasses, in which case they will be SkSafeUnref'd in our destructor.
2749f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com    SkBBoxHierarchy* fBoundingHierarchy;
2759f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com    SkPictureStateTree* fStateTree;
2769f5898d31b91500e09a70c7f70265a2d813b2534rileya@google.com
277801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.com    // Allocated in the constructor and managed by this class.
278c9ab987efcb7e8b69237d565f73c28c137610232djsollen@google.com    SkBitmapHeap* fBitmapHeap;
279801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.com
280801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.comprivate:
2810bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkPictureContentInfo fContentInfo;
2820bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkAutoTUnref<SkPathHeap> fPathHeap;
2830bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
28421830d90096d2dccc4168d99a427e78035ce942adjsollen@google.com    SkChunkFlatController fFlattenableHeap;
2854866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org
286d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com    SkPaintDictionary fPaints;
287d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkWriter32 fWriter;
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
29009b84a00f79979142fbcfd691ccaeb5e5600922dreed@android.com    // we ref each item in these arrays
291b7425173f96e93b090787e2386ba5f022b6c2869fmalita    SkTDArray<const SkPicture*>  fPictureRefs;
292b7425173f96e93b090787e2386ba5f022b6c2869fmalita    SkTDArray<const SkTextBlob*> fTextBlobRefs;
2938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
294ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com    uint32_t fRecordFlags;
295e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org    bool     fOptsEnabled;
296e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org    int      fInitialSaveCount;
297ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com
2986142609b22814283210f79d698182b651a93136crobertphillips    friend class SkPictureData;   // for SkPictureData's SkPictureRecord-based constructor
2991cc8f6f3c48b33430d0e39a4a36601ac0d1de04ajunov@chromium.org    friend class SkPictureTester; // for unit testing
3008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
3028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
3038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
305