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