1#ifndef SkPicturePlayback_DEFINED 2#define SkPicturePlayback_DEFINED 3 4#include "SkPicture.h" 5#include "SkReader32.h" 6 7#include "SkBitmap.h" 8#include "SkMatrix.h" 9#include "SkPaint.h" 10#include "SkPath.h" 11#include "SkPathHeap.h" 12#include "SkRegion.h" 13#include "SkPictureFlat.h" 14#include "SkShape.h" 15 16class SkPictureRecord; 17class SkStream; 18class SkWStream; 19 20class SkPicturePlayback { 21public: 22 SkPicturePlayback(); 23 SkPicturePlayback(const SkPicturePlayback& src); 24 explicit SkPicturePlayback(const SkPictureRecord& record); 25 explicit SkPicturePlayback(SkStream*); 26 27 virtual ~SkPicturePlayback(); 28 29 void draw(SkCanvas& canvas); 30 31 void serialize(SkWStream*) const; 32 33 void dumpSize() const; 34 35 // Can be called in the middle of playback (the draw() call). WIll abort the 36 // drawing and return from draw() after the "current" op code is done 37 void abort(); 38 39private: 40 41 class TextContainer { 42 public: 43 size_t length() { return fByteLength; } 44 const void* text() { return (const void*) fText; } 45 size_t fByteLength; 46 const char* fText; 47 }; 48 49 const SkBitmap& getBitmap() { 50 int index = getInt(); 51 SkASSERT(index > 0); 52 return fBitmaps[index - 1]; 53 } 54 55 int getIndex() { return fReader.readInt(); } 56 int getInt() { return fReader.readInt(); } 57 58 const SkMatrix* getMatrix() { 59 int index = getInt(); 60 if (index == 0) { 61 return NULL; 62 } 63 SkASSERT(index > 0 && index <= fMatrixCount); 64 return &fMatrices[index - 1]; 65 } 66 67 const SkPath& getPath() { 68 return (*fPathHeap)[getInt() - 1]; 69 } 70 71 SkPicture& getPicture() { 72 int index = getInt(); 73 SkASSERT(index > 0 && index <= fPictureCount); 74 return *fPictureRefs[index - 1]; 75 } 76 77 SkShape* getShape() { 78 int index = getInt(); 79 SkASSERT(index > 0 && index <= fShapeCount); 80 return fShapes[index - 1]; 81 } 82 83 const SkPaint* getPaint() { 84 int index = getInt(); 85 if (index == 0) { 86 return NULL; 87 } 88 SkASSERT(index > 0 && index <= fPaintCount); 89 return &fPaints[index - 1]; 90 } 91 92 const SkRect* getRectPtr() { 93 if (fReader.readBool()) { 94 return fReader.skipRect(); 95 } else { 96 return NULL; 97 } 98 } 99 100 const SkIRect* getIRectPtr() { 101 if (fReader.readBool()) { 102 return (const SkIRect*)fReader.skip(sizeof(SkIRect)); 103 } else { 104 return NULL; 105 } 106 } 107 108 const SkRegion& getRegion() { 109 int index = getInt(); 110 SkASSERT(index > 0); 111 return fRegions[index - 1]; 112 } 113 114 SkScalar getScalar() { return fReader.readScalar(); } 115 116 void getText(TextContainer* text) { 117 size_t length = text->fByteLength = getInt(); 118 text->fText = (const char*)fReader.skip(length); 119 } 120 121 void init(); 122 123#ifdef SK_DEBUG_SIZE 124public: 125 int size(size_t* sizePtr); 126 int bitmaps(size_t* size); 127 int paints(size_t* size); 128 int paths(size_t* size); 129 int regions(size_t* size); 130#endif 131 132#ifdef SK_DEBUG_DUMP 133private: 134 void dumpBitmap(const SkBitmap& bitmap) const; 135 void dumpMatrix(const SkMatrix& matrix) const; 136 void dumpPaint(const SkPaint& paint) const; 137 void dumpPath(const SkPath& path) const; 138 void dumpPicture(const SkPicture& picture) const; 139 void dumpRegion(const SkRegion& region) const; 140 int dumpDrawType(char* bufferPtr, char* buffer, DrawType drawType); 141 int dumpInt(char* bufferPtr, char* buffer, char* name); 142 int dumpRect(char* bufferPtr, char* buffer, char* name); 143 int dumpPoint(char* bufferPtr, char* buffer, char* name); 144 void dumpPointArray(char** bufferPtrPtr, char* buffer, int count); 145 int dumpPtr(char* bufferPtr, char* buffer, char* name, void* ptr); 146 int dumpRectPtr(char* bufferPtr, char* buffer, char* name); 147 int dumpScalar(char* bufferPtr, char* buffer, char* name); 148 void dumpText(char** bufferPtrPtr, char* buffer); 149 void dumpStream(); 150 151public: 152 void dump() const; 153#endif 154 155private: 156 SkPathHeap* fPathHeap; // reference counted 157 SkBitmap* fBitmaps; 158 int fBitmapCount; 159 SkMatrix* fMatrices; 160 int fMatrixCount; 161 SkPaint* fPaints; 162 int fPaintCount; 163 SkRegion* fRegions; 164 int fRegionCount; 165 mutable SkFlattenableReadBuffer fReader; 166 167 SkPicture** fPictureRefs; 168 int fPictureCount; 169 SkShape** fShapes; 170 int fShapeCount; 171 172 SkRefCntPlayback fRCPlayback; 173 SkTypefacePlayback fTFPlayback; 174 SkFactoryPlayback* fFactoryPlayback; 175}; 176 177#endif 178