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 "SkPicture.h"
14db539905bb3af7bd05839a7d2558e97d5cb51ca2robertphillips#include "SkPictureData.h"
158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTemplates.h"
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkWriter32.h"
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
182ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// These macros help with packing and unpacking a single byte value and
192ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com// a 3 byte value into/out of a uint32_t
202ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define MASK_24 0x00FFFFFF
212ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define UNPACK_8_24(combined, small, large)             \
222ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    small = (combined >> 24) & 0xFF;                    \
232ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    large = combined & MASK_24;
242ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com#define PACK_8_24(small, large) ((small << 24) | large)
252ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
262ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkPictureRecord : public SkCanvas {
288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
290bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags);
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    virtual ~SkPictureRecord();
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
3236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void beginCommentGroup(const char* description) override;
3336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void addComment(const char* kywd, const char* value) override;
3436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void endCommentGroup() override;
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
369b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    const SkTDArray<const SkPicture* >& getPictureRefs() const {
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fPictureRefs;
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
3974b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
40b7425173f96e93b090787e2386ba5f022b6c2869fmalita    const SkTDArray<const SkTextBlob* >& getTextBlobRefs() const {
41b7425173f96e93b090787e2386ba5f022b6c2869fmalita        return fTextBlobRefs;
42b7425173f96e93b090787e2386ba5f022b6c2869fmalita    }
43b7425173f96e93b090787e2386ba5f022b6c2869fmalita
440bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkData* opData(bool deepCopy) const {
450bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        this->validate(fWriter.bytesWritten(), 0);
460bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
470bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        if (fWriter.bytesWritten() == 0) {
480bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips            return SkData::NewEmpty();
490bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        }
500bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
510bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        if (deepCopy) {
520bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips            return SkData::NewWithCopy(fWriter.contiguousArray(), fWriter.bytesWritten());
530bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        }
540bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
550bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        return fWriter.snapshotAsData();
560bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    }
570bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
580bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    const SkPictureContentInfo& contentInfo() const {
590bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips        return fContentInfo;
600bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    }
610bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
624866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    void setFlags(uint32_t recordFlags) {
634866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org        fRecordFlags = recordFlags;
644866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    }
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const SkWriter32& writeStream() const {
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fWriter;
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
70d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com    void beginRecording();
71a6c9e0e02be390d36b80f4872c628edb3594208ejunov@chromium.org    void endRecording();
72d86e7ab6044e4aba017cb126a26dd378eec9fcbareed@google.com
7368250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.orgprotected:
7468250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org    void addNoOp();
7568250c8e7c2bf5d669397c849259c3bcad40237esenorblanco@chromium.org
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate:
774b32bd53c63b245707822ae83e3215863303bf43commit-bot@chromium.org    void handleOptimization(int opt);
78dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordRestoreOffsetPlaceholder(SkRegion::Op);
795a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset);
80e3dbedb44cad6c7b7e5c9aae5224d0b0abec9bf4junov@chromium.org
81ffacd3c56d73c03d3fe53b47a49ea6be2ca4748freed@google.com    SkTDArray<int32_t> fRestoreOffsetStack;
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
83210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org    SkTDArray<uint32_t> fCullOffsetStack;
84210ae2a42613b9048e8e8c4096c5bf4fe2ddf838commit-bot@chromium.org
852ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    /*
862ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * Write the 'drawType' operation and chunk size to the skp. 'size'
87ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com     * can potentially be increased if the chunk size needs its own storage
882ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * location (i.e., it overflows 24 bits).
892ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * Returns the start offset of the chunk. This is the location at which
902ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * the opcode & size are stored.
91ce8343d7dde40e509317708de239be1fa72b28f9skia.committer@gmail.com     * TODO: since we are handing the size into here we could call reserve
922ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * and then return a pointer to the memory storage. This could decrease
932ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * allocation overhead but could lead to more wasted space (the tail
942ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * end of blocks could go unused). Possibly add a second addDraw that
952ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     * operates in this manner.
962ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com     */
97dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t addDraw(DrawType drawType, size_t* size) {
984469938e92d779dff05e745559e67907bbf21e78reed@google.com        size_t offset = fWriter.bytesWritten();
992ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
10097af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com        this->predrawNotify();
101afdada2eabdef47a59e08c884b2beb1af3f31aa5hendrikw        fContentInfo.addOperation();
10297af1a64ae6bdddd346d8babfd9f188279dd6644reed@google.com
1032ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        SkASSERT(0 != *size);
1042ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        SkASSERT(((uint8_t) drawType) == drawType);
1052ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1062ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        if (0 != (*size & ~MASK_24) || *size == MASK_24) {
1072ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com            fWriter.writeInt(PACK_8_24(drawType, MASK_24));
1082ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com            *size += 1;
109dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org            fWriter.writeInt(SkToU32(*size));
1102ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        } else {
111dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org            fWriter.writeInt(PACK_8_24(drawType, SkToU32(*size)));
1122ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        }
1132ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1142ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com        return offset;
11574b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org    }
1162ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addInt(int value) {
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fWriter.writeInt(value);
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addScalar(SkScalar scalar) {
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        fWriter.writeScalar(scalar);
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12374b461961607fa57a150a9282c410ef0cab38764vandebo@chromium.org
124e069400cabd0edd3db52bbf1958063d3ed12ef28mtklein    void addBitmap(const SkBitmap& bitmap);
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addMatrix(const SkMatrix& matrix);
12646616af01b412ea984a516fda1ed8ec08e689f29mtklein    void addPaint(const SkPaint& paint) { this->addPaintPtr(&paint); }
12746616af01b412ea984a516fda1ed8ec08e689f29mtklein    void addPaintPtr(const SkPaint* paint);
128b3c9d1c33caf325aada244204215eb790c228c12dandov    void addPatch(const SkPoint cubics[12]);
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPath(const SkPath& path);
1309b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips    void addPicture(const SkPicture* picture);
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPoint(const SkPoint& point);
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addPoints(const SkPoint pts[], int count);
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRect(const SkRect& rect);
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRectPtr(const SkRect* rect);
135f0b5e1190af9807a027c0adba2f1380663c8e910reed@google.com    void addIRect(const SkIRect& rect);
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addIRectPtr(const SkIRect* rect);
1374ed0fb768409bf97b79899c3990d8c15f5e9d784reed@google.com    void addRRect(const SkRRect&);
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addRegion(const SkRegion& region);
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void addText(const void* text, size_t byteLength);
140b7425173f96e93b090787e2386ba5f022b6c2869fmalita    void addTextBlob(const SkTextBlob* blob);
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1424866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org    int find(const SkBitmap& bitmap);
1434866cc0afb7571309d9fdecb221d919f663054c0junov@chromium.org
1446162af8d4c05354a160f6aa44d9c4440721c892arobertphillipsprotected:
145dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    void validate(size_t initialOffset, size_t size) const {
1464469938e92d779dff05e745559e67907bbf21e78reed@google.com        SkASSERT(fWriter.bytesWritten() == initialOffset + size);
1472ca1aaaa442290b8262e1ca3ec64ebe46a191211robertphillips@google.com    }
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
14936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SkSurface* onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override;
15036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    const void* onPeekPixels(SkImageInfo*, size_t*) override {
151c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org        return NULL;
152c3bd8af6d5722e854feca70c40d92f4954c5b67bcommit-bot@chromium.org    }
153e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
15436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void willSave() override;
15536352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    SaveLayerStrategy willSaveLayer(const SkRect*, const SkPaint*, SaveFlags) override;
15636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void willRestore() override;
157e54a23fcfa42b2fc9d320650de72bcb2d9566b2dcommit-bot@chromium.org
15836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void didConcat(const SkMatrix&) override;
15936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void didSetMatrix(const SkMatrix&) override;
16044c48d062f7996b5b46917e1b312a32ad101f326commit-bot@chromium.org
16136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
16276f10a3bd936af7dbe2b5873d5a7eedd73cdc5dareed@google.com
163e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawText(const void* text, size_t byteLength, SkScalar x, SkScalar y,
16436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                            const SkPaint&) override;
165e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosText(const void* text, size_t byteLength, const SkPoint pos[],
16636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                               const SkPaint&) override;
167e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawPosTextH(const void* text, size_t byteLength, const SkScalar xpos[],
16836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                SkScalar constY, const SkPaint&) override;
169e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com    virtual void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
17036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                  const SkMatrix* matrix, const SkPaint&) override;
171b7425173f96e93b090787e2386ba5f022b6c2869fmalita    virtual void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
17236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                                const SkPaint& paint) override;
17346616af01b412ea984a516fda1ed8ec08e689f29mtklein
174b3c9d1c33caf325aada244204215eb790c228c12dandov    virtual void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
175b3c9d1c33caf325aada244204215eb790c228c12dandov                             const SkPoint texCoords[4], SkXfermode* xmode,
17636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                             const SkPaint& paint) override;
17736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein
17836352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPaint(const SkPaint&) override;
17936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
18036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawRect(const SkRect&, const SkPaint&) override;
18136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawOval(const SkRect&, const SkPaint&) override;
18236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawRRect(const SkRRect&, const SkPaint&) override;
18336352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPath(const SkPath&, const SkPaint&) override;
18436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override;
18541af966ab338e95eee81ab618ab28195075338f7reed    void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
18636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                          DrawBitmapRectFlags flags) override;
18736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
18841af966ab338e95eee81ab618ab28195075338f7reed    void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
18936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                         const SkPaint*) override;
19041af966ab338e95eee81ab618ab28195075338f7reed    void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
19136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                          const SkPaint*) override;
19236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawSprite(const SkBitmap&, int left, int top, const SkPaint*) override;
19341af966ab338e95eee81ab618ab28195075338f7reed    void onDrawVertices(VertexMode vmode, int vertexCount,
19441af966ab338e95eee81ab618ab28195075338f7reed                        const SkPoint vertices[], const SkPoint texs[],
19541af966ab338e95eee81ab618ab28195075338f7reed                        const SkColor colors[], SkXfermode* xmode,
19641af966ab338e95eee81ab618ab28195075338f7reed                        const uint16_t indices[], int indexCount,
19736352bf5e38f45a70ee4f4fc132a38048d38206dmtklein                        const SkPaint&) override;
19841af966ab338e95eee81ab618ab28195075338f7reed
19936352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRect(const SkRect&, SkRegion::Op, ClipEdgeStyle) override;
20036352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRRect(const SkRRect&, SkRegion::Op, ClipEdgeStyle) override;
20136352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipPath(const SkPath&, SkRegion::Op, ClipEdgeStyle) override;
20236352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onClipRegion(const SkRegion&, SkRegion::Op) override;
2038f90a892c5130d4d26b5588e1ff151d01a40688arobertphillips@google.com
20436352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
2059b14f26d0f3a974f3dd626c8354e1db1cfcd322frobertphillips
2065a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    int addPathToHeap(const SkPath& path);  // does not write to ops stream
2075a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com
2081dab403e447f4f663690e018651338304fe6e86askia.committer@gmail.com    // These entry points allow the writing of matrices, clips, saves &
2095a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    // restores to be deferred (e.g., if the MC state is being collapsed and
2105a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    // only written out as needed).
2115a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void recordConcat(const SkMatrix& matrix);
212d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    void recordTranslate(const SkMatrix& matrix);
213d9ea09e1f29b303e6fa36079e99729d2951925b9commit-bot@chromium.org    void recordScale(const SkMatrix& matrix);
214dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRect(const SkRect& rect, SkRegion::Op op, bool doAA);
215dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRRect(const SkRRect& rrect, SkRegion::Op op, bool doAA);
216dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipPath(int pathID, SkRegion::Op op, bool doAA);
217dcecb168968ca136c7fb9e8b444bec56f19af70ccommit-bot@chromium.org    size_t recordClipRegion(const SkRegion& region, SkRegion::Op op);
2185f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita    void recordSave();
2195a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com    void recordSaveLayer(const SkRect* bounds, const SkPaint* paint, SaveFlags flags);
220105a4a584c4c2c84c24e102112326b15683673f5robertphillips@google.com    void recordRestore(bool fillInSkips = true);
2215a63f24558b84610e93c6d7b67d849b5ab435e51robertphillips@google.com
222801cee1d4cad2c382059c0f367edd77298b05caarobertphillips@google.comprivate:
2230bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips    SkPictureContentInfo fContentInfo;
2240bdbea75ff1a6f3c313c18cab0139728967cb93erobertphillips
22571a236370792416b367a7d2d6b8e471b06b331cdmtklein    SkTArray<SkBitmap> fBitmaps;
22671a236370792416b367a7d2d6b8e471b06b331cdmtklein    SkTArray<SkPaint>  fPaints;
22771a236370792416b367a7d2d6b8e471b06b331cdmtklein    SkTArray<SkPath>   fPaths;
228d2700eec7eb2e26beb206b88a0f0b6f3c5f49118djsollen@google.com
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkWriter32 fWriter;
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
23109b84a00f79979142fbcfd691ccaeb5e5600922dreed@android.com    // we ref each item in these arrays
232b7425173f96e93b090787e2386ba5f022b6c2869fmalita    SkTDArray<const SkPicture*>  fPictureRefs;
233b7425173f96e93b090787e2386ba5f022b6c2869fmalita    SkTDArray<const SkTextBlob*> fTextBlobRefs;
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
235ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com    uint32_t fRecordFlags;
236e494dbdec36f0ffa4affeac1c3f405b58ac41220commit-bot@chromium.org    int      fInitialSaveCount;
237ae814c809e1c4e02a1876c39065775c8c7d00f96reed@android.com
2386142609b22814283210f79d698182b651a93136crobertphillips    friend class SkPictureData;   // for SkPictureData's SkPictureRecord-based constructor
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    typedef SkCanvas INHERITED;
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
244