1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 Google Inc.
3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *
4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be
5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file.
6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */
7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#ifndef SkPictureRecord_DEFINED
9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define SkPictureRecord_DEFINED
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkCanvas.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkFlattenable.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPicture.h"
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPictureData.h"
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTArray.h"
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTDArray.h"
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkTHash.h"
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkVertices.h"
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkWriter32.h"
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// These macros help with packing and unpacking a single byte value and
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// a 3 byte value into/out of a uint32_t
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define MASK_24 0x00FFFFFF
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define UNPACK_8_24(combined, small, large)             \
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    small = (combined >> 24) & 0xFF;                    \
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    large = combined & MASK_24;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#define PACK_8_24(small, large) ((small << 24) | large)
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass SkPictureRecord : public SkCanvas {
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkPictureRecord(const SkISize& dimensions, uint32_t recordFlags);
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    ~SkPictureRecord() override;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkTDArray<const SkPicture* >& getPictureRefs() const {
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fPictureRefs;
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkTDArray<SkDrawable* >& getDrawableRefs() const {
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fDrawableRefs;
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkTDArray<const SkTextBlob* >& getTextBlobRefs() const {
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fTextBlobRefs;
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkTDArray<const SkVertices* >& getVerticesRefs() const {
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fVerticesRefs;
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot   const SkTDArray<const SkImage* >& getImageRefs() const {
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fImageRefs;
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkData> opData() const {
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->validate(fWriter.bytesWritten(), 0);
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (fWriter.bytesWritten() == 0) {
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            return SkData::MakeEmpty();
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fWriter.snapshotAsData();
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void setFlags(uint32_t recordFlags) {
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fRecordFlags = recordFlags;
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    const SkWriter32& writeStream() const {
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return fWriter;
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void beginRecording();
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void endRecording();
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addNoOp();
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void handleOptimization(int opt);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t recordRestoreOffsetPlaceholder(SkClipOp);
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void fillRestoreOffsetPlaceholdersForCurrentStackLevel(uint32_t restoreOffset);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<int32_t> fRestoreOffsetStack;
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<uint32_t> fCullOffsetStack;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    /*
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Write the 'drawType' operation and chunk size to the skp. 'size'
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * can potentially be increased if the chunk size needs its own storage
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * location (i.e., it overflows 24 bits).
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * Returns the start offset of the chunk. This is the location at which
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * the opcode & size are stored.
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * TODO: since we are handing the size into here we could call reserve
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * and then return a pointer to the memory storage. This could decrease
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * allocation overhead but could lead to more wasted space (the tail
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * end of blocks could go unused). Possibly add a second addDraw that
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     * operates in this manner.
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot     */
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t addDraw(DrawType drawType, size_t* size) {
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        size_t offset = fWriter.bytesWritten();
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        this->predrawNotify();
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(0 != *size);
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(((uint8_t) drawType) == drawType);
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        if (0 != (*size & ~MASK_24) || *size == MASK_24) {
108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fWriter.writeInt(PACK_8_24(drawType, MASK_24));
109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            *size += 1;
110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fWriter.writeInt(SkToU32(*size));
111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        } else {
112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fWriter.writeInt(PACK_8_24(drawType, SkToU32(*size)));
113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return offset;
116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addInt(int value) {
119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fWriter.writeInt(value);
120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addScalar(SkScalar scalar) {
122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        fWriter.writeScalar(scalar);
123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addImage(const SkImage*);
126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addMatrix(const SkMatrix& matrix);
127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPaint(const SkPaint& paint) { this->addPaintPtr(&paint); }
128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPaintPtr(const SkPaint* paint);
129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPatch(const SkPoint cubics[12]);
130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPath(const SkPath& path);
131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPicture(const SkPicture* picture);
132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addDrawable(SkDrawable* picture);
133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPoint(const SkPoint& point);
134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addPoints(const SkPoint pts[], int count);
135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addRect(const SkRect& rect);
136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addRectPtr(const SkRect* rect);
137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addIRect(const SkIRect& rect);
138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addIRectPtr(const SkIRect* rect);
139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addRRect(const SkRRect&);
140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addRegion(const SkRegion& region);
141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addText(const void* text, size_t byteLength);
142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addTextBlob(const SkTextBlob* blob);
143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void addVertices(const SkVertices*);
144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int find(const SkBitmap& bitmap);
146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void validate(size_t initialOffset, size_t size) const {
149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkASSERT(fWriter.bytesWritten() == initialOffset + size);
150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    sk_sp<SkSurface> onNewSurface(const SkImageInfo&, const SkSurfaceProps&) override;
153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bool onPeekPixels(SkPixmap*) override { return false; }
154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onFlush() override;
156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void willSave() override;
158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SaveLayerStrategy getSaveLayerStrategy(const SaveLayerRec&) override;
159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void willRestore() override;
160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void didConcat(const SkMatrix&) override;
162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void didSetMatrix(const SkMatrix&) override;
163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawDRRect(const SkRRect&, const SkRRect&, const SkPaint&) override;
165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawText(const void* text, size_t, SkScalar x, SkScalar y, const SkPaint&) override;
167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPosText(const void* text, size_t, const SkPoint pos[], const SkPaint&) override;
168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPosTextH(const void* text, size_t, const SkScalar xpos[], SkScalar constY,
169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                        const SkPaint&) override;
170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                  const SkMatrix* matrix, const SkPaint&) override;
172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawTextRSXform(const void* text, size_t byteLength, const SkRSXform xform[],
173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                           const SkRect* cull, const SkPaint&) override;
174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                const SkPaint& paint) override;
176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
178fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     const SkPoint texCoords[4], SkBlendMode, const SkPaint& paint) override;
179fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawAtlas(const SkImage*, const SkRSXform[], const SkRect[], const SkColor[], int,
180fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                     SkBlendMode, const SkRect*, const SkPaint*) override;
181fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
182fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPaint(const SkPaint&) override;
183fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPoints(PointMode, size_t count, const SkPoint pts[], const SkPaint&) override;
184fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawRect(const SkRect&, const SkPaint&) override;
185fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawRegion(const SkRegion&, const SkPaint&) override;
186fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawOval(const SkRect&, const SkPaint&) override;
187fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawArc(const SkRect&, SkScalar, SkScalar, bool, const SkPaint&) override;
188fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawRRect(const SkRRect&, const SkPaint&) override;
189fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPath(const SkPath&, const SkPaint&) override;
190fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawImage(const SkImage*, SkScalar left, SkScalar top, const SkPaint*) override;
191fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawImageRect(const SkImage*, const SkRect* src, const SkRect& dst,
192fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         const SkPaint*, SrcRectConstraint) override;
193fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawImageNine(const SkImage*, const SkIRect& center, const SkRect& dst,
194fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                         const SkPaint*) override;
195fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawImageLattice(const SkImage*, const SkCanvas::Lattice& lattice, const SkRect& dst,
196fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                            const SkPaint*) override;
197fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawShadowRec(const SkPath&, const SkDrawShadowRec&) override;
198fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawVerticesObject(const SkVertices*, SkBlendMode, const SkPaint&) override;
199fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
200fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onClipRect(const SkRect&, SkClipOp, ClipEdgeStyle) override;
201fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onClipRRect(const SkRRect&, SkClipOp, ClipEdgeStyle) override;
202fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onClipPath(const SkPath&, SkClipOp, ClipEdgeStyle) override;
203fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onClipRegion(const SkRegion&, SkClipOp) override;
204fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
205fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawPicture(const SkPicture*, const SkMatrix*, const SkPaint*) override;
206fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
207fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawDrawable(SkDrawable*, const SkMatrix*) override;
208fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawAnnotation(const SkRect&, const char[], SkData*) override;
209fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
210fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int addPathToHeap(const SkPath& path);  // does not write to ops stream
211fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
212fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // These entry points allow the writing of matrices, clips, saves &
213fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // restores to be deferred (e.g., if the MC state is being collapsed and
214fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // only written out as needed).
215fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordConcat(const SkMatrix& matrix);
216fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordTranslate(const SkMatrix& matrix);
217fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordScale(const SkMatrix& matrix);
218fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t recordClipRect(const SkRect& rect, SkClipOp op, bool doAA);
219fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t recordClipRRect(const SkRRect& rrect, SkClipOp op, bool doAA);
220fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t recordClipPath(int pathID, SkClipOp op, bool doAA);
221fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    size_t recordClipRegion(const SkRegion& region, SkClipOp op);
222fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordSave();
223fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordSaveLayer(const SaveLayerRec&);
224fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void recordRestore(bool fillInSkips = true);
225fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
226fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // SHOULD NEVER BE CALLED
227fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawBitmap(const SkBitmap&, SkScalar left, SkScalar top, const SkPaint*) override {
228fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("not reached");
229fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
230fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawBitmapRect(const SkBitmap&, const SkRect* src, const SkRect& dst, const SkPaint*,
231fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          SrcRectConstraint) override {
232fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("not reached");
233fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
234fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawBitmapNine(const SkBitmap&, const SkIRect& center, const SkRect& dst,
235fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                          const SkPaint*) override {
236fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("not reached");
237fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
238fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDrawBitmapLattice(const SkBitmap&, const SkCanvas::Lattice& lattice, const SkRect& dst,
239fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                             const SkPaint*) override {
240fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SK_ABORT("not reached");
241fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
242fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
243fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
244fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTArray<SkPaint>  fPaints;
245fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
246fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct PathHash {
247fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        uint32_t operator()(const SkPath& p) { return p.getGenerationID(); }
248fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    };
249fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTHashMap<SkPath, int, PathHash> fPaths;
250fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
251fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkWriter32 fWriter;
252fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
253fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    // we ref each item in these arrays
254fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<const SkImage*>    fImageRefs;
255fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<const SkPicture*>  fPictureRefs;
256fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<SkDrawable*>       fDrawableRefs;
257fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<const SkTextBlob*> fTextBlobRefs;
258fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkTDArray<const SkVertices*> fVerticesRefs;
259fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
260fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    uint32_t fRecordFlags;
261fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int      fInitialSaveCount;
262fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
263fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    friend class SkPictureData;   // for SkPictureData's SkPictureRecord-based constructor
264fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
265fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef SkCanvas INHERITED;
266fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
267fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
268fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#endif
269