1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com
2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/*
3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2011 Google Inc.
4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com *
5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file.
7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */
8bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifndef SkPictureRecord_DEFINED
9bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#define SkPictureRecord_DEFINED
10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
11bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkCanvas.h"
12bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkFlattenable.h"
13bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkPathHeap.h"
14bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkPicture.h"
15bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkPictureFlat.h"
16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkTemplates.h"
17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkWriter32.h"
18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
196e832b50c712743d821e01829b127b86271a7ebbrileya@google.comclass SkPictureStateTree;
206e832b50c712743d821e01829b127b86271a7ebbrileya@google.comclass SkBBoxHierarchy;
216e832b50c712743d821e01829b127b86271a7ebbrileya@google.com
22f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com// These macros help with packing and unpacking a single byte value and
23f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com// a 3 byte value into/out of a uint32_t
24f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com#define MASK_24 0x00FFFFFF
25f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com#define UNPACK_8_24(combined, small, large)             \
26f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    small = (combined >> 24) & 0xFF;                    \
27f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    large = combined & MASK_24;
28f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com#define PACK_8_24(small, large) ((small << 24) | large)
29f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
30f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
31bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comclass SkPictureRecord : public SkCanvas {
32bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
33118a6d00c3089c0fcfce67919bbbeb37adda6423reed@google.com    SkPictureRecord(uint32_t recordFlags, SkDevice*);
34bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual ~SkPictureRecord();
35bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
36d84ed564a00a67019a345ea545ca63ab514533f7junov@chromium.org    virtual SkDevice* setDevice(SkDevice* device) SK_OVERRIDE;
37d84ed564a00a67019a345ea545ca63ab514533f7junov@chromium.org
382c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual int save(SaveFlags) SK_OVERRIDE;
392c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
402c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void restore() SK_OVERRIDE;
412c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
422c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
432c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
442c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
452c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
462c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
477e93ed91c3173a963cc17ef6e34b731b577b1250reed@google.com    virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
487a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    virtual bool clipRRect(const SkRRect&, SkRegion::Op, bool) SK_OVERRIDE;
497e93ed91c3173a963cc17ef6e34b731b577b1250reed@google.com    virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
502c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
512c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void clear(SkColor) SK_OVERRIDE;
522c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
542c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                            const SkPaint&) SK_OVERRIDE;
557a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
567a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
577a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
582c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
602c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                            const SkPaint*) SK_OVERRIDE;
613b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com    virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
623b4aeaece7522f100f25bcb2214214acaf7891e8reed@google.com                                      const SkRect& dst, const SkPaint*) SK_OVERRIDE;
63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
642c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                                  const SkPaint*) SK_OVERRIDE;
653f270706ca0ff7302b938355e6d481a6b5f04e4breed@google.com    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
662c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawSprite(const SkBitmap&, int left, int top,
682c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                            const SkPaint*) SK_OVERRIDE;
698c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
702c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                          SkScalar y, const SkPaint&) SK_OVERRIDE;
718c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org    virtual void drawPosText(const void* text, size_t byteLength,
722c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                             const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawPosTextH(const void* text, size_t byteLength,
742c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                      const SkScalar xpos[], SkScalar constY, const SkPaint&) SK_OVERRIDE;
758c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org    virtual void drawTextOnPath(const void* text, size_t byteLength,
768c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org                            const SkPath& path, const SkMatrix* matrix,
772c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                                const SkPaint&) SK_OVERRIDE;
782c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
79bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    virtual void drawVertices(VertexMode, int vertexCount,
80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                          const SkPoint vertices[], const SkPoint texs[],
81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                          const SkColor colors[], SkXfermode*,
82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com                          const uint16_t indices[], int indexCount,
832c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com                              const SkPaint&) SK_OVERRIDE;
842c381c97d14b46a59b14908009107c8a3f7bd5d7reed@google.com    virtual void drawData(const void*, size_t) SK_OVERRIDE;
85aa62052fd968fb037fc17a1f2a3c1be34b4342bbrobertphillips@google.com    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
86aa62052fd968fb037fc17a1f2a3c1be34b4342bbrobertphillips@google.com    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
87aa62052fd968fb037fc17a1f2a3c1be34b4342bbrobertphillips@google.com    virtual void endCommentGroup() SK_OVERRIDE;
886bfd74c3d62f40c933ade44051e8a407e017b882junov@chromium.org    virtual bool isDrawingToLayer() const SK_OVERRIDE;
89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
9075714eee0c7480aa4787b976da221739fe5d8977junov@chromium.org    void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&,
918878ff132d537e6bd4e682fbcc570f6a8b2ac689reed@google.com                                 SkScalar minY, SkScalar maxY);
928c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org
93bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const SkTDArray<SkPicture* >& getPictureRefs() const {
94bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return fPictureRefs;
95bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
968c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org
97dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org    void setFlags(uint32_t recordFlags) {
98dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org        fRecordFlags = recordFlags;
99dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org    }
100bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
101bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    const SkWriter32& writeStream() const {
102bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        return fWriter;
103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
104bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
105118a6d00c3089c0fcfce67919bbbeb37adda6423reed@google.com    void beginRecording();
1069aa18db116c81f6fbd563a6c28111c65bb56d742junov@chromium.org    void endRecording();
107118a6d00c3089c0fcfce67919bbbeb37adda6423reed@google.com
108bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comprivate:
10947c2076e9e3b4777af036acfa5ff258a38cca586commit-bot@chromium.org    void handleOptimization(int opt);
110c74b2c43b91702aac3f4f7d1dae4754da3952dbbjunov@chromium.org    void recordRestoreOffsetPlaceholder(SkRegion::Op);
111c74b2c43b91702aac3f4f7d1dae4754da3952dbbjunov@chromium.org    void fillRestoreOffsetPlaceholdersForCurrentStackLevel(
112c74b2c43b91702aac3f4f7d1dae4754da3952dbbjunov@chromium.org        uint32_t restoreOffset);
113c74b2c43b91702aac3f4f7d1dae4754da3952dbbjunov@chromium.org
1142522d74ffa4a622327fb1a14c1f0e2482d2466e0reed@google.com    SkTDArray<int32_t> fRestoreOffsetStack;
1156bfd74c3d62f40c933ade44051e8a407e017b882junov@chromium.org    int fFirstSavedLayerIndex;
1166bfd74c3d62f40c933ade44051e8a407e017b882junov@chromium.org    enum {
1176bfd74c3d62f40c933ade44051e8a407e017b882junov@chromium.org        kNoSavedLayerIndex = -1
1186bfd74c3d62f40c933ade44051e8a407e017b882junov@chromium.org    };
119bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
120f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    /*
121f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * Write the 'drawType' operation and chunk size to the skp. 'size'
1224b7bb5ccda62759133bc13e69f5247c91ef6a61eskia.committer@gmail.com     * can potentially be increased if the chunk size needs its own storage
123f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * location (i.e., it overflows 24 bits).
124f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * Returns the start offset of the chunk. This is the location at which
125f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * the opcode & size are stored.
1264b7bb5ccda62759133bc13e69f5247c91ef6a61eskia.committer@gmail.com     * TODO: since we are handing the size into here we could call reserve
127f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * and then return a pointer to the memory storage. This could decrease
128f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * allocation overhead but could lead to more wasted space (the tail
129f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * end of blocks could go unused). Possibly add a second addDraw that
130f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     * operates in this manner.
131f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com     */
132f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    uint32_t addDraw(DrawType drawType, uint32_t* size) {
133f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        uint32_t offset = fWriter.size();
134f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
1352ffcbf828d03b8e32ffc93b1b0ee8a98faeaa51ereed@google.com        this->predrawNotify();
1362ffcbf828d03b8e32ffc93b1b0ee8a98faeaa51ereed@google.com
137f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    #ifdef SK_DEBUG_TRACE
138bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        SkDebugf("add %s\n", DrawTypeToString(drawType));
139f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    #endif
140f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
141f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        SkASSERT(0 != *size);
142f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        SkASSERT(((uint8_t) drawType) == drawType);
143f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
144f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        if (0 != (*size & ~MASK_24) || *size == MASK_24) {
145f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com            fWriter.writeInt(PACK_8_24(drawType, MASK_24));
146f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com            *size += 1;
147f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com            fWriter.writeInt(*size);
148f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        } else {
149f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com            fWriter.writeInt(PACK_8_24(drawType, *size));
150f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        }
151f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
152f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        return offset;
1538c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org    }
154f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com
155bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addInt(int value) {
156bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        fWriter.writeInt(value);
157bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
158bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addScalar(SkScalar scalar) {
159bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com        fWriter.writeScalar(scalar);
160bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    }
1618c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org
162bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addBitmap(const SkBitmap& bitmap);
163bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addMatrix(const SkMatrix& matrix);
164bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addMatrixPtr(const SkMatrix* matrix);
165fc8ff2e8e6b71629b28b31e759f3551418f4ea13junov@chromium.org    const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr(&paint); }
166fc8ff2e8e6b71629b28b31e759f3551418f4ea13junov@chromium.org    const SkFlatData* addPaintPtr(const SkPaint* paint);
167bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addPath(const SkPath& path);
168bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addPicture(SkPicture& picture);
169bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addPoint(const SkPoint& point);
170bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addPoints(const SkPoint pts[], int count);
171bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addRect(const SkRect& rect);
172bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addRectPtr(const SkRect* rect);
1733f270706ca0ff7302b938355e6d481a6b5f04e4breed@google.com    void addIRect(const SkIRect& rect);
174bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addIRectPtr(const SkIRect* rect);
1757a7e655343617093a5eea37c7a556602a1bb0576reed@google.com    void addRRect(const SkRRect&);
176bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addRegion(const SkRegion& region);
177bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void addText(const void* text, size_t byteLength);
178bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
179dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org    int find(const SkBitmap& bitmap);
180dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org
181bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG_DUMP
182bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
183bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void dumpMatrices();
184bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void dumpPaints();
185bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
186bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
187bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG_SIZE
188bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
1898c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org    size_t size() const;
190bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int bitmaps(size_t* size) const;
191bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int matrices(size_t* size) const;
192bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int paints(size_t* size) const;
193bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int paths(size_t* size) const;
194bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int regions(size_t* size) const;
195bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    size_t streamlen() const;
1968c331d260c7fe604a69b6ace405a4c6cd160cf17vandebo@chromium.org
197bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    size_t fPointBytes, fRectBytes, fTextBytes;
198bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    int fPointWrites, fRectWrites, fTextWrites;
199bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
200bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
201bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#ifdef SK_DEBUG_VALIDATE
202bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
203f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    void validate(uint32_t initialOffset, uint32_t size) const;
204bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comprivate:
205bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void validateBitmaps() const;
206bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void validateMatrices() const;
207bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void validatePaints() const;
208bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void validatePaths() const;
209bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    void validateRegions() const;
210bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#else
211bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.compublic:
212f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    void validate(uint32_t initialOffset, uint32_t size) const {
213f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com        SkASSERT(fWriter.size() == initialOffset + size);
214f2a01d9185ed3a378410418de02dfc9fc6ecd725robertphillips@google.com    }
215bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
216bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
2176e832b50c712743d821e01829b127b86271a7ebbrileya@google.comprotected:
2186e832b50c712743d821e01829b127b86271a7ebbrileya@google.com
2196e832b50c712743d821e01829b127b86271a7ebbrileya@google.com    // These are set to NULL in our constructor, but may be changed by
2206e832b50c712743d821e01829b127b86271a7ebbrileya@google.com    // subclasses, in which case they will be SkSafeUnref'd in our destructor.
2216e832b50c712743d821e01829b127b86271a7ebbrileya@google.com    SkBBoxHierarchy* fBoundingHierarchy;
2226e832b50c712743d821e01829b127b86271a7ebbrileya@google.com    SkPictureStateTree* fStateTree;
2236e832b50c712743d821e01829b127b86271a7ebbrileya@google.com
224a26d7d39508b41303ac6d10c87de0704823d7760robertphillips@google.com    // Allocated in the constructor and managed by this class.
2253855f87fcb9a9e590b6c94d742395415a3f1b06cdjsollen@google.com    SkBitmapHeap* fBitmapHeap;
226a26d7d39508b41303ac6d10c87de0704823d7760robertphillips@google.com
227a26d7d39508b41303ac6d10c87de0704823d7760robertphillips@google.comprivate:
228a9aa73ae674668fe929a04566a17804eefe7938edjsollen@google.com    SkChunkFlatController fFlattenableHeap;
229dc8630fa3915d6b1a6cfef385ac6846cf78e0b94junov@chromium.org
230ba64210404187e9ef7a9d55135695aa0bd745467djsollen@google.com    SkMatrixDictionary fMatrices;
231ba64210404187e9ef7a9d55135695aa0bd745467djsollen@google.com    SkPaintDictionary fPaints;
232ba64210404187e9ef7a9d55135695aa0bd745467djsollen@google.com    SkRegionDictionary fRegions;
233ba64210404187e9ef7a9d55135695aa0bd745467djsollen@google.com
234bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkPathHeap* fPathHeap;  // reference counted
235bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkWriter32 fWriter;
236bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
237a29ebf3d2a01b26182e0998bdeba43afa9998bdcreed@android.com    // we ref each item in these arrays
238bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    SkTDArray<SkPicture*> fPictureRefs;
239bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
240c4a55d734d36f634765d63b9adfb69ddbc6182fereed@android.com    uint32_t fRecordFlags;
241d84ed564a00a67019a345ea545ca63ab514533f7junov@chromium.org    int fInitialSaveCount;
242c4a55d734d36f634765d63b9adfb69ddbc6182fereed@android.com
243bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    friend class SkPicturePlayback;
2440803cf0def1522f41242a298a5b431c0d006dca6junov@chromium.org    friend class SkPictureTester; // for unit testing
245bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
246bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com    typedef SkCanvas INHERITED;
247bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com};
248bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com
249bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#endif
250