180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2011 Google Inc.
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifndef SkPictureRecord_DEFINED
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#define SkPictureRecord_DEFINED
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkCanvas.h"
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkFlattenable.h"
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPathHeap.h"
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPicture.h"
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkPictureFlat.h"
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkTemplates.h"
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkWriter32.h"
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPictureStateTree;
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkBBoxHierarchy;
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// These macros help with packing and unpacking a single byte value and
23096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger// a 3 byte value into/out of a uint32_t
24096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define MASK_24 0x00FFFFFF
25096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define UNPACK_8_24(combined, small, large)             \
26096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    small = (combined >> 24) & 0xFF;                    \
27096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    large = combined & MASK_24;
28096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger#define PACK_8_24(small, large) ((small << 24) | large)
29096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
30096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruclass SkPictureRecord : public SkCanvas {
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPictureRecord(uint32_t recordFlags, SkDevice*);
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual ~SkPictureRecord();
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual SkDevice* setDevice(SkDevice* device) SK_OVERRIDE;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual int save(SaveFlags) SK_OVERRIDE;
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual int saveLayer(const SkRect* bounds, const SkPaint*, SaveFlags) SK_OVERRIDE;
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void restore() SK_OVERRIDE;
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool translate(SkScalar dx, SkScalar dy) SK_OVERRIDE;
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool scale(SkScalar sx, SkScalar sy) SK_OVERRIDE;
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool rotate(SkScalar degrees) SK_OVERRIDE;
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool skew(SkScalar sx, SkScalar sy) SK_OVERRIDE;
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool concat(const SkMatrix& matrix) SK_OVERRIDE;
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void setMatrix(const SkMatrix& matrix) SK_OVERRIDE;
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool clipRect(const SkRect&, SkRegion::Op, bool) SK_OVERRIDE;
48363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual bool clipRRect(const SkRRect&, SkRegion::Op, bool) SK_OVERRIDE;
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool clipPath(const SkPath&, SkRegion::Op, bool) SK_OVERRIDE;
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool clipRegion(const SkRegion& region, SkRegion::Op op) SK_OVERRIDE;
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void clear(SkColor) SK_OVERRIDE;
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPaint(const SkPaint& paint) SK_OVERRIDE;
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPoints(PointMode, size_t count, const SkPoint pts[],
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPaint&) SK_OVERRIDE;
55363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void drawOval(const SkRect&, const SkPaint&) SK_OVERRIDE;
56363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void drawRect(const SkRect&, const SkPaint&) SK_OVERRIDE;
57363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    virtual void drawRRect(const SkRRect&, const SkPaint&) SK_OVERRIDE;
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPath(const SkPath& path, const SkPaint&) SK_OVERRIDE;
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawBitmap(const SkBitmap&, SkScalar left, SkScalar top,
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPaint*) SK_OVERRIDE;
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawBitmapRectToRect(const SkBitmap&, const SkRect* src,
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                      const SkRect& dst, const SkPaint*) SK_OVERRIDE;
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawBitmapMatrix(const SkBitmap&, const SkMatrix&,
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                  const SkPaint*) SK_OVERRIDE;
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawBitmapNine(const SkBitmap& bitmap, const SkIRect& center,
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                const SkRect& dst, const SkPaint*) SK_OVERRIDE;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawSprite(const SkBitmap&, int left, int top,
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPaint*) SK_OVERRIDE;
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawText(const void* text, size_t byteLength, SkScalar x,
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                          SkScalar y, const SkPaint&) SK_OVERRIDE;
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPosText(const void* text, size_t byteLength,
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                             const SkPoint pos[], const SkPaint&) SK_OVERRIDE;
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPosTextH(const void* text, size_t byteLength,
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                      const SkScalar xpos[], SkScalar constY, const SkPaint&) SK_OVERRIDE;
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawTextOnPath(const void* text, size_t byteLength,
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                            const SkPath& path, const SkMatrix* matrix,
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                const SkPaint&) SK_OVERRIDE;
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawPicture(SkPicture& picture) SK_OVERRIDE;
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawVertices(VertexMode, int vertexCount,
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                          const SkPoint vertices[], const SkPoint texs[],
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                          const SkColor colors[], SkXfermode*,
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                          const uint16_t indices[], int indexCount,
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                              const SkPaint&) SK_OVERRIDE;
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual void drawData(const void*, size_t) SK_OVERRIDE;
8558190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void beginCommentGroup(const char* description) SK_OVERRIDE;
8658190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void addComment(const char* kywd, const char* value) SK_OVERRIDE;
8758190644c30e1c4aa8e527f3503c58f841e0fcf3Derek Sollenberger    virtual void endCommentGroup() SK_OVERRIDE;
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    virtual bool isDrawingToLayer() const SK_OVERRIDE;
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
90d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&,
91363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger                                 SkScalar minY, SkScalar maxY);
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkTDArray<SkPicture* >& getPictureRefs() const {
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fPictureRefs;
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void setFlags(uint32_t recordFlags) {
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fRecordFlags = recordFlags;
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    const SkWriter32& writeStream() const {
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return fWriter;
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void beginRecording();
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void endRecording();
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
109096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void handleOptimization(int opt);
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void recordRestoreOffsetPlaceholder(SkRegion::Op);
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void fillRestoreOffsetPlaceholdersForCurrentStackLevel(
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        uint32_t restoreOffset);
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<int32_t> fRestoreOffsetStack;
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int fFirstSavedLayerIndex;
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    enum {
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        kNoSavedLayerIndex = -1
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    };
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
120096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    /*
121096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Write the 'drawType' operation and chunk size to the skp. 'size'
122096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * can potentially be increased if the chunk size needs its own storage
123096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * location (i.e., it overflows 24 bits).
124096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * Returns the start offset of the chunk. This is the location at which
125096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * the opcode & size are stored.
126096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * TODO: since we are handing the size into here we could call reserve
127096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * and then return a pointer to the memory storage. This could decrease
128096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * allocation overhead but could lead to more wasted space (the tail
129096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * end of blocks could go unused). Possibly add a second addDraw that
130096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     * operates in this manner.
131096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger     */
132096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    uint32_t addDraw(DrawType drawType, uint32_t* size) {
133096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        uint32_t offset = fWriter.size();
134096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        this->predrawNotify();
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
137096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    #ifdef SK_DEBUG_TRACE
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkDebugf("add %s\n", DrawTypeToString(drawType));
139096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    #endif
140096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
141096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkASSERT(0 != *size);
142096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkASSERT(((uint8_t) drawType) == drawType);
143096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
144096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        if (0 != (*size & ~MASK_24) || *size == MASK_24) {
145096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            fWriter.writeInt(PACK_8_24(drawType, MASK_24));
146096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            *size += 1;
147096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            fWriter.writeInt(*size);
148096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        } else {
149096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger            fWriter.writeInt(PACK_8_24(drawType, *size));
150096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        }
151096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
152096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        return offset;
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
154096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addInt(int value) {
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fWriter.writeInt(value);
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addScalar(SkScalar scalar) {
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fWriter.writeScalar(scalar);
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addBitmap(const SkBitmap& bitmap);
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addMatrix(const SkMatrix& matrix);
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addMatrixPtr(const SkMatrix* matrix);
165d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr(&paint); }
166d686ac77c2c485c4a3302eda9c1de597a6f8c568Derek Sollenberger    const SkFlatData* addPaintPtr(const SkPaint* paint);
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addPath(const SkPath& path);
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addPicture(SkPicture& picture);
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addPoint(const SkPoint& point);
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addPoints(const SkPoint pts[], int count);
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addRect(const SkRect& rect);
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addRectPtr(const SkRect* rect);
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addIRect(const SkIRect& rect);
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addIRectPtr(const SkIRect* rect);
175363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    void addRRect(const SkRRect&);
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addRegion(const SkRegion& region);
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void addText(const void* text, size_t byteLength);
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int find(const SkBitmap& bitmap);
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG_DUMP
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void dumpMatrices();
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void dumpPaints();
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG_SIZE
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t size() const;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int bitmaps(size_t* size) const;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int matrices(size_t* size) const;
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int paints(size_t* size) const;
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int paths(size_t* size) const;
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int regions(size_t* size) const;
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t streamlen() const;
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    size_t fPointBytes, fRectBytes, fTextBytes;
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int fPointWrites, fRectWrites, fTextWrites;
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG_VALIDATE
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
203096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void validate(uint32_t initialOffset, uint32_t size) const;
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprivate:
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validateBitmaps() const;
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validateMatrices() const;
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validatePaints() const;
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validatePaths() const;
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    void validateRegions() const;
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#else
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querupublic:
212096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    void validate(uint32_t initialOffset, uint32_t size) const {
213096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger        SkASSERT(fWriter.size() == initialOffset + size);
214096defe64d408e54474fe19f418c95bf1a554fc7Derek Sollenberger    }
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruprotected:
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // These are set to NULL in our constructor, but may be changed by
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // subclasses, in which case they will be SkSafeUnref'd in our destructor.
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBBoxHierarchy* fBoundingHierarchy;
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPictureStateTree* fStateTree;
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
224363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger    // Allocated in the constructor and managed by this class.
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkBitmapHeap* fBitmapHeap;
226363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenberger
227363e546ed626b6dbbc42f5db87b3594bc0b5944bDerek Sollenbergerprivate:
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkChunkFlatController fFlattenableHeap;
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkMatrixDictionary fMatrices;
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPaintDictionary fPaints;
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRegionDictionary fRegions;
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkPathHeap* fPathHeap;  // reference counted
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkWriter32 fWriter;
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // we ref each item in these arrays
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkTDArray<SkPicture*> fPictureRefs;
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    uint32_t fRecordFlags;
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    int fInitialSaveCount;
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkPicturePlayback;
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    friend class SkPictureTester; // for unit testing
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    typedef SkCanvas INHERITED;
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru};
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
250