• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
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  */
8 #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 
22 #ifdef SK_BUILD_FOR_ANDROID
23 #include "SkThread.h"
24 #endif
25 
26 class SkPictureRecord;
27 class SkStream;
28 class SkWStream;
29 
30 class SkPicturePlayback {
31 public:
32     SkPicturePlayback();
33     SkPicturePlayback(const SkPicturePlayback& src);
34     explicit SkPicturePlayback(const SkPictureRecord& record);
35     explicit SkPicturePlayback(SkStream*, uint32_t pictureVersion = PICTURE_VERSION_JB);
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 
49 private:
50 
51     class TextContainer {
52     public:
length()53         size_t length() { return fByteLength; }
text()54         const void* text() { return (const void*) fText; }
55         size_t fByteLength;
56         const char* fText;
57     };
58 
getBitmap()59     const SkBitmap& getBitmap() {
60         int index = getInt();
61         SkASSERT(index > 0);
62         return fBitmaps[index - 1];
63     }
64 
getIndex()65     int getIndex() { return fReader.readInt(); }
getInt()66     int getInt() { return fReader.readInt(); }
67 
getMatrix()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 
getPath()77     const SkPath& getPath() {
78         return (*fPathHeap)[getInt() - 1];
79     }
80 
getPicture()81     SkPicture& getPicture() {
82         int index = getInt();
83         SkASSERT(index > 0 && index <= fPictureCount);
84         return *fPictureRefs[index - 1];
85     }
86 
getPaint()87     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 
getRectPtr()96     const SkRect* getRectPtr() {
97         if (fReader.readBool()) {
98             return &fReader.skipT<SkRect>();
99         } else {
100             return NULL;
101         }
102     }
103 
getIRectPtr()104     const SkIRect* getIRectPtr() {
105         if (fReader.readBool()) {
106             return &fReader.skipT<SkIRect>();
107         } else {
108             return NULL;
109         }
110     }
111 
getRegion()112     const SkRegion& getRegion() {
113         int index = getInt();
114         SkASSERT(index > 0);
115         return fRegions[index - 1];
116     }
117 
getScalar()118     SkScalar getScalar() { return fReader.readScalar(); }
119 
getText(TextContainer * text)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
128 public:
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
137 private:
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 
155 public:
156     void dump() const;
157 #endif
158 
159 private:
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;
173 
174     SkRefCntPlayback fRCPlayback;
175     SkTypefacePlayback fTFPlayback;
176     SkFactoryPlayback*   fFactoryPlayback;
177 #ifdef SK_BUILD_FOR_ANDROID
178     SkMutex fDrawMutex;
179 #endif
180 };
181 
182 #endif
183