blob: 16c892669ae0b8af89f8c5ee4ab0f16db71c4a30 [file] [log] [blame]
Cary Clark224c7002018-06-27 11:00:21 -04001#Topic Picture
2#Alias Pictures ##
3#Alias Picture_Reference ##
4
5#Class SkPicture
6
Cary Clark61313f32018-10-08 14:57:48 -04007#Code
8#Populate
9##
10
Cary Clarkf9603982018-07-17 08:20:27 -040011Picture 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.
Cary Clark224c7002018-06-27 11:00:21 -040021
Cary Clark224c7002018-06-27 11:00:21 -040022# ------------------------------------------------------------------------------
23
24#Class AbortCallback
Cary Clark80247e52018-07-11 16:18:41 -040025#Line # utility to stop picture playback ##
Cary Clark224c7002018-06-27 11:00:21 -040026
27#Code
Cary Clark80247e52018-07-11 16:18:41 -040028 class AbortCallback {
29 public:
30 AbortCallback() {}
31 virtual ~AbortCallback() {}
32 virtual bool abort() = 0;
33 };
Cary Clark224c7002018-06-27 11:00:21 -040034##
35
Cary Clarkf9603982018-07-17 08:20:27 -040036AbortCallback 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.
Cary Clark224c7002018-06-27 11:00:21 -040041
42# ------------------------------------------------------------------------------
43
44#Method AbortCallback()
Cary Clark61313f32018-10-08 14:57:48 -040045#In Constructors
Cary Clark80247e52018-07-11 16:18:41 -040046#Line # defines default constructor ##
Cary Clark09d80c02018-10-31 12:14:03 -040047#Populate
Cary Clark224c7002018-06-27 11:00:21 -040048
Cary Clark80247e52018-07-11 16:18:41 -040049#NoExample
Cary Clark224c7002018-06-27 11:00:21 -040050##
51
Cary Clark80247e52018-07-11 16:18:41 -040052#SeeAlso playback
Cary Clark224c7002018-06-27 11:00:21 -040053
54#Method ##
55
56# ------------------------------------------------------------------------------
57
58#Method virtual ~AbortCallback()
Cary Clark61313f32018-10-08 14:57:48 -040059#In Constructors
Cary Clark80247e52018-07-11 16:18:41 -040060#Line # defines default destructor ##
Cary Clark09d80c02018-10-31 12:14:03 -040061#Populate
Cary Clark224c7002018-06-27 11:00:21 -040062
Cary Clark80247e52018-07-11 16:18:41 -040063#NoExample
Cary Clark224c7002018-06-27 11:00:21 -040064##
65
Cary Clark80247e52018-07-11 16:18:41 -040066#SeeAlso playback
Cary Clark224c7002018-06-27 11:00:21 -040067
68#Method ##
69
70# ------------------------------------------------------------------------------
71
72#Method virtual bool abort() = 0
Cary Clark80247e52018-07-11 16:18:41 -040073#In Utility
74#Line # aborts playback by callback ##
Cary Clark09d80c02018-10-31 12:14:03 -040075#Populate
Cary Clark80247e52018-07-11 16:18:41 -040076
77#NoExample
Cary Clark224c7002018-06-27 11:00:21 -040078##
79
Cary Clark80247e52018-07-11 16:18:41 -040080#SeeAlso playback
Cary Clark224c7002018-06-27 11:00:21 -040081
82#Method ##
83
Cary Clark80247e52018-07-11 16:18:41 -040084#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
Cary Clark224c7002018-06-27 11:00:21 -0400112#Class AbortCallback ##
113
114# ------------------------------------------------------------------------------
115
116#Method static sk_sp<SkPicture> MakeFromStream(SkStream* stream,
117 const SkDeserialProcs* procs = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400118#In Constructors
Cary Clark80247e52018-07-11 16:18:41 -0400119#Line # constructs Picture from stream ##
Cary Clark09d80c02018-10-31 12:14:03 -0400120#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400121
122#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400123 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());
Cary Clark80247e52018-07-11 16:18:41 -0400134 copy->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400135##
136
Cary Clark80247e52018-07-11 16:18:41 -0400137#SeeAlso MakeFromData SkPictureRecorder
Cary Clark224c7002018-06-27 11:00:21 -0400138
139#Method ##
140
141# ------------------------------------------------------------------------------
142
143#Method static sk_sp<SkPicture> MakeFromData(const SkData* data,
144 const SkDeserialProcs* procs = nullptr)
Cary Clark61313f32018-10-08 14:57:48 -0400145#In Constructors
Cary Clark80247e52018-07-11 16:18:41 -0400146#Line # constructs Picture from data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400147#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400148
149#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400150 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());
Cary Clark80247e52018-07-11 16:18:41 -0400161 copy->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400162##
163
Cary Clark80247e52018-07-11 16:18:41 -0400164#SeeAlso MakeFromStream SkPictureRecorder
Cary Clark224c7002018-06-27 11:00:21 -0400165
166#Method ##
167
168# ------------------------------------------------------------------------------
169
170#Method static sk_sp<SkPicture> MakeFromData(const void* data, size_t size,
171 const SkDeserialProcs* procs = nullptr)
Cary Clark09d80c02018-10-31 12:14:03 -0400172#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400173
174#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400175 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());
Cary Clark80247e52018-07-11 16:18:41 -0400186 copy->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400187##
188
Cary Clark80247e52018-07-11 16:18:41 -0400189#SeeAlso MakeFromStream SkPictureRecorder
Cary Clark224c7002018-06-27 11:00:21 -0400190
191#Method ##
192
193# ------------------------------------------------------------------------------
194
195#Method virtual void playback(SkCanvas* canvas, AbortCallback* callback = nullptr) const = 0
Cary Clark80247e52018-07-11 16:18:41 -0400196#In Action
197#Line # replays drawing commands on canvas ##
Cary Clark09d80c02018-10-31 12:14:03 -0400198#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400199
200#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400201 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();
Cary Clark80247e52018-07-11 16:18:41 -0400208 picture->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400209##
210
Cary Clark80247e52018-07-11 16:18:41 -0400211#SeeAlso SkCanvas::drawPicture
Cary Clark224c7002018-06-27 11:00:21 -0400212
213#Method ##
214
215# ------------------------------------------------------------------------------
216
217#Method virtual SkRect cullRect() const = 0
Cary Clark80247e52018-07-11 16:18:41 -0400218#In Property
219#Line # returns bounds used to record Picture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400220#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400221
222#Example
Cary Clark80247e52018-07-11 16:18:41 -0400223#Description
224Picture recorded bounds are smaller than contents; contents outside recorded
225bounds may be drawn, and are drawn in this example.
226##
Cary Clark09d80c02018-10-31 12:14:03 -0400227 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);
Cary Clark80247e52018-07-11 16:18:41 -0400237 canvas->drawRect(picture->cullRect(), paint);
Cary Clark224c7002018-06-27 11:00:21 -0400238##
239
Cary Clark80247e52018-07-11 16:18:41 -0400240#SeeAlso SkCanvas::clipRect
Cary Clark224c7002018-06-27 11:00:21 -0400241
242#Method ##
243
244# ------------------------------------------------------------------------------
245
246#Method uint32_t uniqueID() const
Cary Clark80247e52018-07-11 16:18:41 -0400247#In Property
248#Line # returns identifier for Picture ##
Cary Clark09d80c02018-10-31 12:14:03 -0400249#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400250
251#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400252 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});
Cary Clark80247e52018-07-11 16:18:41 -0400257 SkDebugf("placeholder id = %d\n", placeholder->uniqueID());
258#StdOut
Cary Clark09d80c02018-10-31 12:14:03 -0400259empty picture id = 1
Cary Clark80247e52018-07-11 16:18:41 -0400260placeholder id = 2
261##
Cary Clark224c7002018-06-27 11:00:21 -0400262##
263
Cary Clark80247e52018-07-11 16:18:41 -0400264#SeeAlso SkRefCnt
Cary Clark224c7002018-06-27 11:00:21 -0400265
266#Method ##
267
268# ------------------------------------------------------------------------------
269
270#Method sk_sp<SkData> serialize(const SkSerialProcs* procs = nullptr) const
Cary Clark80247e52018-07-11 16:18:41 -0400271#In Utility
Cary Clarkd2ca79c2018-08-10 13:09:13 -0400272#Line # writes Picture to Data ##
Cary Clark09d80c02018-10-31 12:14:03 -0400273#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400274
275#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400276 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());
Cary Clark80247e52018-07-11 16:18:41 -0400285 copy->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400286##
287
Cary Clark80247e52018-07-11 16:18:41 -0400288#SeeAlso MakeFromData SkData SkSerialProcs
Cary Clark224c7002018-06-27 11:00:21 -0400289
290#Method ##
291
292# ------------------------------------------------------------------------------
293
294#Method void serialize(SkWStream* stream, const SkSerialProcs* procs = nullptr) const
Cary Clark09d80c02018-10-31 12:14:03 -0400295#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400296
297#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400298 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());
Cary Clark80247e52018-07-11 16:18:41 -0400309 copy->playback(canvas);
Cary Clark224c7002018-06-27 11:00:21 -0400310##
311
Cary Clark80247e52018-07-11 16:18:41 -0400312#SeeAlso MakeFromStream SkWStream SkSerialProcs
Cary Clark224c7002018-06-27 11:00:21 -0400313
314#Method ##
315
316# ------------------------------------------------------------------------------
317
318#Method static sk_sp<SkPicture> MakePlaceholder(SkRect cull)
Cary Clark61313f32018-10-08 14:57:48 -0400319#In Constructors
Cary Clark80247e52018-07-11 16:18:41 -0400320#Line # constructs placeholder with unique identifier ##
Cary Clark09d80c02018-10-31 12:14:03 -0400321#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400322
323#Example
Cary Clarkf9603982018-07-17 08:20:27 -0400324#Function
325class MyCanvas : public SkCanvas {
326public:
327 MyCanvas(SkCanvas* c) : canvas(c) {}
Cary Clark09d80c02018-10-31 12:14:03 -0400328 void onDrawPicture(const SkPicture* picture, const SkMatrix* ,
329 const SkPaint* ) override {
Cary Clarkf9603982018-07-17 08:20:27 -0400330 const SkRect rect = picture->cullRect();
331 SkPaint redPaint;
332 redPaint.setColor(SK_ColorRED);
333 canvas->drawRect(rect, redPaint);
334 }
335
Cary Clark09d80c02018-10-31 12:14:03 -0400336 SkCanvas* canvas;
Cary Clarkf9603982018-07-17 08:20:27 -0400337};
Cary Clark80247e52018-07-11 16:18:41 -0400338##
Cary Clark09d80c02018-10-31 12:14:03 -0400339SkPictureRecorder 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);
Cary Clark224c7002018-06-27 11:00:21 -0400346##
347
Cary Clarkf9603982018-07-17 08:20:27 -0400348#SeeAlso MakeFromStream MakeFromData uniqueID
Cary Clark224c7002018-06-27 11:00:21 -0400349
350#Method ##
351
352# ------------------------------------------------------------------------------
353
354#Method virtual int approximateOpCount() const = 0
Cary Clark80247e52018-07-11 16:18:41 -0400355#In Property
356#Line # returns approximate operation count ##
Cary Clark09d80c02018-10-31 12:14:03 -0400357#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400358
359#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400360 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();
Cary Clark80247e52018-07-11 16:18:41 -0400367 picture->playback(canvas);
368 std::string opCount = "approximate op count: " + std::to_string(picture->approximateOpCount());
369 canvas->drawString(opCount.c_str(), 50, 220, SkPaint());
Cary Clark224c7002018-06-27 11:00:21 -0400370##
371
Cary Clark80247e52018-07-11 16:18:41 -0400372#SeeAlso approximateBytesUsed
Cary Clark224c7002018-06-27 11:00:21 -0400373
374#Method ##
375
376# ------------------------------------------------------------------------------
377
378#Method virtual size_t approximateBytesUsed() const = 0
Cary Clark80247e52018-07-11 16:18:41 -0400379#In Property
380#Line # returns approximate size ##
Cary Clark09d80c02018-10-31 12:14:03 -0400381#Populate
Cary Clark224c7002018-06-27 11:00:21 -0400382
383#Example
Cary Clark09d80c02018-10-31 12:14:03 -0400384 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();
Cary Clark80247e52018-07-11 16:18:41 -0400391 picture->playback(canvas);
392 std::string opCount = "approximate bytes used: " + std::to_string(picture->approximateBytesUsed());
393 canvas->drawString(opCount.c_str(), 20, 220, SkPaint());
Cary Clark224c7002018-06-27 11:00:21 -0400394##
395
Cary Clark80247e52018-07-11 16:18:41 -0400396#SeeAlso approximateOpCount
Cary Clark224c7002018-06-27 11:00:21 -0400397
398#Method ##
399
400#Class SkPicture ##
401
402#Topic Picture ##