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