• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#Topic Picture
2#Alias Pictures ##
3#Alias Picture_Reference ##
4
5#Class SkPicture
6
7#Code
8#Populate
9##
10
11Picture records drawing commands made to Canvas. The command stream may be
12played in whole or in part at a later time.
13
14Picture is an abstract class. Picture may be generated by Picture_Recorder
15or Drawable, or from Picture previously saved to Data or Stream.
16
17Picture may contain any Canvas drawing command, as well as one or more
18Canvas_Matrix or Canvas_Clip. Picture has a cull Rect, which is used as
19a bounding box hint. To limit Picture bounds, use Canvas_Clip when
20recording or drawing Picture.
21
22# ------------------------------------------------------------------------------
23
24#Class AbortCallback
25#Line # utility to stop picture playback ##
26
27#Code
28    class AbortCallback {
29    public:
30        AbortCallback() {}
31        virtual ~AbortCallback() {}
32        virtual bool abort() = 0;
33    };
34##
35
36AbortCallback is an abstract class. An implementation of AbortCallback may
37passed as a parameter to SkPicture::playback, to stop it before all drawing
38commands have been processed.
39
40If AbortCallback::abort returns true, SkPicture::playback is interrupted.
41
42# ------------------------------------------------------------------------------
43
44#Method AbortCallback()
45#In Constructors
46#Line # defines default constructor ##
47#Populate
48
49#NoExample
50##
51
52#SeeAlso playback
53
54#Method ##
55
56# ------------------------------------------------------------------------------
57
58#Method virtual ~AbortCallback()
59#In Constructors
60#Line # defines default destructor ##
61#Populate
62
63#NoExample
64##
65
66#SeeAlso playback
67
68#Method ##
69
70# ------------------------------------------------------------------------------
71
72#Method virtual bool abort() = 0
73#In Utility
74#Line # aborts playback by callback ##
75#Populate
76
77#NoExample
78##
79
80#SeeAlso playback
81
82#Method ##
83
84#Example
85#Description
86JustOneDraw allows the black rectangle to draw but stops playback before the
87white rectangle appears.
88##
89#Function
90class JustOneDraw : public SkPicture::AbortCallback {
91public:
92    bool abort() override { return fCalls++ > 0; }
93private:
94    int fCalls = 0;
95};
96##
97
98void draw(SkCanvas* canvas) {
99    SkPictureRecorder recorder;
100    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
101    SkPaint paint;
102    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
103    paint.setColor(SK_ColorWHITE);
104    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
105    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
106    JustOneDraw callback;
107    picture->playback(canvas, &callback);
108}
109
110##
111
112#Class AbortCallback ##
113
114# ------------------------------------------------------------------------------
115
116#Method static sk_sp<SkPicture> MakeFromStream(SkStream* stream,
117                                           const SkDeserialProcs* procs = nullptr)
118#In Constructors
119#Line # constructs Picture from stream ##
120#Populate
121
122#Example
123    SkPictureRecorder recorder;
124    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
125    SkPaint paint;
126    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
127    paint.setColor(SK_ColorWHITE);
128    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
129    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
130    SkDynamicMemoryWStream writableStream;
131    picture->serialize(&writableStream);
132    std::unique_ptr<SkStreamAsset> readableStream = writableStream.detachAsStream();
133    sk_sp<SkPicture> copy = SkPicture::MakeFromStream(readableStream.get());
134    copy->playback(canvas);
135##
136
137#SeeAlso MakeFromData SkPictureRecorder
138
139#Method ##
140
141# ------------------------------------------------------------------------------
142
143#Method static sk_sp<SkPicture> MakeFromData(const SkData* data,
144                                         const SkDeserialProcs* procs = nullptr)
145#In Constructors
146#Line # constructs Picture from data ##
147#Populate
148
149#Example
150    SkPictureRecorder recorder;
151    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
152    SkPaint paint;
153    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
154    paint.setColor(SK_ColorWHITE);
155    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
156    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
157    SkDynamicMemoryWStream writableStream;
158    picture->serialize(&writableStream);
159    sk_sp<SkData> readableData = writableStream.detachAsData();
160    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData.get());
161    copy->playback(canvas);
162##
163
164#SeeAlso MakeFromStream SkPictureRecorder
165
166#Method ##
167
168# ------------------------------------------------------------------------------
169
170#Method static sk_sp<SkPicture> MakeFromData(const void* data, size_t size,
171                                         const SkDeserialProcs* procs = nullptr)
172#Populate
173
174#Example
175    SkPictureRecorder recorder;
176    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
177    SkPaint paint;
178    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
179    paint.setColor(SK_ColorWHITE);
180    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
181    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
182    SkDynamicMemoryWStream writableStream;
183    picture->serialize(&writableStream);
184    sk_sp<SkData> readableData = writableStream.detachAsData();
185    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
186    copy->playback(canvas);
187##
188
189#SeeAlso MakeFromStream SkPictureRecorder
190
191#Method ##
192
193# ------------------------------------------------------------------------------
194
195#Method virtual void playback(SkCanvas* canvas, AbortCallback* callback = nullptr) const = 0
196#In Action
197#Line # replays drawing commands on canvas ##
198#Populate
199
200#Example
201    SkPictureRecorder recorder;
202    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
203    SkPaint paint;
204    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
205    paint.setColor(SK_ColorWHITE);
206    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
207    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
208    picture->playback(canvas);
209##
210
211#SeeAlso SkCanvas::drawPicture
212
213#Method ##
214
215# ------------------------------------------------------------------------------
216
217#Method virtual SkRect cullRect() const = 0
218#In Property
219#Line # returns bounds used to record Picture ##
220#Populate
221
222#Example
223#Description
224Picture recorded bounds are smaller than contents; contents outside recorded
225bounds may be drawn, and are drawn in this example.
226##
227    SkPictureRecorder recorder;
228    SkCanvas* pictureCanvas = recorder.beginRecording({64, 64, 192, 192});
229    SkPaint paint;
230    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
231    paint.setColor(SK_ColorWHITE);
232    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
233    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
234    picture->playback(canvas);
235    paint.setBlendMode(SkBlendMode::kModulate);
236    paint.setColor(0x40404040);
237    canvas->drawRect(picture->cullRect(), paint);
238##
239
240#SeeAlso SkCanvas::clipRect
241
242#Method ##
243
244# ------------------------------------------------------------------------------
245
246#Method uint32_t uniqueID() const
247#In Property
248#Line # returns identifier for Picture ##
249#Populate
250
251#Example
252    SkPictureRecorder recorder;
253    recorder.beginRecording({0, 0, 0, 0});
254    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
255    SkDebugf("empty picture id = %d\n", picture->uniqueID());
256    sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({0, 0, 0, 0});
257    SkDebugf("placeholder id = %d\n", placeholder->uniqueID());
258#StdOut
259empty picture id = 1
260placeholder id = 2
261##
262##
263
264#SeeAlso SkRefCnt
265
266#Method ##
267
268# ------------------------------------------------------------------------------
269
270#Method sk_sp<SkData> serialize(const SkSerialProcs* procs = nullptr) const
271#In Utility
272#Line # writes Picture to Data ##
273#Populate
274
275#Example
276    SkPictureRecorder recorder;
277    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
278    SkPaint paint;
279    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
280    paint.setColor(SK_ColorWHITE);
281    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
282    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
283    sk_sp<SkData> readableData = picture->serialize();
284    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
285    copy->playback(canvas);
286##
287
288#SeeAlso MakeFromData SkData SkSerialProcs
289
290#Method ##
291
292# ------------------------------------------------------------------------------
293
294#Method void serialize(SkWStream* stream, const SkSerialProcs* procs = nullptr) const
295#Populate
296
297#Example
298    SkPictureRecorder recorder;
299    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
300    SkPaint paint;
301    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
302    paint.setColor(SK_ColorWHITE);
303    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
304    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
305    SkDynamicMemoryWStream writableStream;
306    picture->serialize(&writableStream);
307    sk_sp<SkData> readableData = writableStream.detachAsData();
308    sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size());
309    copy->playback(canvas);
310##
311
312#SeeAlso MakeFromStream SkWStream SkSerialProcs
313
314#Method ##
315
316# ------------------------------------------------------------------------------
317
318#Method static sk_sp<SkPicture> MakePlaceholder(SkRect cull)
319#In Constructors
320#Line # constructs placeholder with unique identifier ##
321#Populate
322
323#Example
324#Function
325class MyCanvas : public SkCanvas {
326public:
327    MyCanvas(SkCanvas* c) : canvas(c) {}
328        void onDrawPicture(const SkPicture* picture, const SkMatrix* ,
329                               const SkPaint* ) override {
330        const SkRect rect = picture->cullRect();
331        SkPaint redPaint;
332        redPaint.setColor(SK_ColorRED);
333        canvas->drawRect(rect, redPaint);
334   }
335
336   SkCanvas* canvas;
337};
338##
339SkPictureRecorder recorder;
340SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
341sk_sp<SkPicture> placeholder = SkPicture::MakePlaceholder({10, 40, 80, 110});
342pictureCanvas->drawPicture(placeholder);
343sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
344MyCanvas myCanvas(canvas);
345myCanvas.drawPicture(picture);
346##
347
348#SeeAlso MakeFromStream MakeFromData uniqueID
349
350#Method ##
351
352# ------------------------------------------------------------------------------
353
354#Method virtual int approximateOpCount() const = 0
355#In Property
356#Line # returns approximate operation count ##
357#Populate
358
359#Example
360    SkPictureRecorder recorder;
361    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
362    SkPaint paint;
363    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
364    paint.setColor(SK_ColorWHITE);
365    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
366    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
367    picture->playback(canvas);
368    std::string opCount = "approximate op count: " + std::to_string(picture->approximateOpCount());
369    canvas->drawString(opCount.c_str(), 50, 220, SkPaint());
370##
371
372#SeeAlso approximateBytesUsed
373
374#Method ##
375
376# ------------------------------------------------------------------------------
377
378#Method virtual size_t approximateBytesUsed() const = 0
379#In Property
380#Line # returns approximate size ##
381#Populate
382
383#Example
384    SkPictureRecorder recorder;
385    SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256});
386    SkPaint paint;
387    pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint);
388    paint.setColor(SK_ColorWHITE);
389    pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint);
390    sk_sp<SkPicture> picture = recorder.finishRecordingAsPicture();
391    picture->playback(canvas);
392    std::string opCount = "approximate bytes used: " + std::to_string(picture->approximateBytesUsed());
393    canvas->drawString(opCount.c_str(), 20, 220, SkPaint());
394##
395
396#SeeAlso approximateOpCount
397
398#Method ##
399
400#Class SkPicture ##
401
402#Topic Picture ##
403