#Topic Picture #Alias Pictures ## #Alias Picture_Reference ## #Class SkPicture #Code #Populate ## Picture records drawing commands made to Canvas. The command stream may be played in whole or in part at a later time. Picture is an abstract class. Picture may be generated by Picture_Recorder or Drawable, or from Picture previously saved to Data or Stream. Picture may contain any Canvas drawing command, as well as one or more Canvas_Matrix or Canvas_Clip. Picture has a cull Rect, which is used as a bounding box hint. To limit Picture bounds, use Canvas_Clip when recording or drawing Picture. # ------------------------------------------------------------------------------ #Class AbortCallback #Line # utility to stop picture playback ## #Code class AbortCallback { public: AbortCallback() {} virtual ~AbortCallback() {} virtual bool abort() = 0; }; ## AbortCallback is an abstract class. An implementation of AbortCallback may passed as a parameter to SkPicture::playback, to stop it before all drawing commands have been processed. If AbortCallback::abort returns true, SkPicture::playback is interrupted. # ------------------------------------------------------------------------------ #Method AbortCallback() #In Constructors #Line # defines default constructor ## #Populate #NoExample ## #SeeAlso playback #Method ## # ------------------------------------------------------------------------------ #Method virtual ~AbortCallback() #In Constructors #Line # defines default destructor ## #Populate #NoExample ## #SeeAlso playback #Method ## # ------------------------------------------------------------------------------ #Method virtual bool abort() = 0 #In Utility #Line # aborts playback by callback ## #Populate #NoExample ## #SeeAlso playback #Method ## #Example #Description JustOneDraw allows the black rectangle to draw but stops playback before the white rectangle appears. ## #Function class JustOneDraw : public SkPicture::AbortCallback { public: bool abort() override { return fCalls++ > 0; } private: int fCalls = 0; }; ## void draw(SkCanvas* canvas) { SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); JustOneDraw callback; picture->playback(canvas, &callback); } ## #Class AbortCallback ## # ------------------------------------------------------------------------------ #Method static sk_sp MakeFromStream(SkStream* stream, const SkDeserialProcs* procs = nullptr) #In Constructors #Line # constructs Picture from stream ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); SkDynamicMemoryWStream writableStream; picture->serialize(&writableStream); std::unique_ptr readableStream = writableStream.detachAsStream(); sk_sp copy = SkPicture::MakeFromStream(readableStream.get()); copy->playback(canvas); ## #SeeAlso MakeFromData SkPictureRecorder #Method ## # ------------------------------------------------------------------------------ #Method static sk_sp MakeFromData(const SkData* data, const SkDeserialProcs* procs = nullptr) #In Constructors #Line # constructs Picture from data ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); SkDynamicMemoryWStream writableStream; picture->serialize(&writableStream); sk_sp readableData = writableStream.detachAsData(); sk_sp copy = SkPicture::MakeFromData(readableData.get()); copy->playback(canvas); ## #SeeAlso MakeFromStream SkPictureRecorder #Method ## # ------------------------------------------------------------------------------ #Method static sk_sp MakeFromData(const void* data, size_t size, const SkDeserialProcs* procs = nullptr) #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); SkDynamicMemoryWStream writableStream; picture->serialize(&writableStream); sk_sp readableData = writableStream.detachAsData(); sk_sp copy = SkPicture::MakeFromData(readableData->data(), readableData->size()); copy->playback(canvas); ## #SeeAlso MakeFromStream SkPictureRecorder #Method ## # ------------------------------------------------------------------------------ #Method virtual void playback(SkCanvas* canvas, AbortCallback* callback = nullptr) const = 0 #In Action #Line # replays drawing commands on canvas ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); picture->playback(canvas); ## #SeeAlso SkCanvas::drawPicture #Method ## # ------------------------------------------------------------------------------ #Method virtual SkRect cullRect() const = 0 #In Property #Line # returns bounds used to record Picture ## #Populate #Example #Description Picture recorded bounds are smaller than contents; contents outside recorded bounds may be drawn, and are drawn in this example. ## SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({64, 64, 192, 192}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); picture->playback(canvas); paint.setBlendMode(SkBlendMode::kModulate); paint.setColor(0x40404040); canvas->drawRect(picture->cullRect(), paint); ## #SeeAlso SkCanvas::clipRect #Method ## # ------------------------------------------------------------------------------ #Method uint32_t uniqueID() const #In Property #Line # returns identifier for Picture ## #Populate #Example SkPictureRecorder recorder; recorder.beginRecording({0, 0, 0, 0}); sk_sp picture = recorder.finishRecordingAsPicture(); SkDebugf("empty picture id = %d\n", picture->uniqueID()); sk_sp placeholder = SkPicture::MakePlaceholder({0, 0, 0, 0}); SkDebugf("placeholder id = %d\n", placeholder->uniqueID()); #StdOut empty picture id = 1 placeholder id = 2 ## ## #SeeAlso SkRefCnt #Method ## # ------------------------------------------------------------------------------ #Method sk_sp serialize(const SkSerialProcs* procs = nullptr) const #In Utility #Line # writes Picture to Data ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); sk_sp readableData = picture->serialize(); sk_sp copy = SkPicture::MakeFromData(readableData->data(), readableData->size()); copy->playback(canvas); ## #SeeAlso MakeFromData SkData SkSerialProcs #Method ## # ------------------------------------------------------------------------------ #Method void serialize(SkWStream* stream, const SkSerialProcs* procs = nullptr) const #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); SkDynamicMemoryWStream writableStream; picture->serialize(&writableStream); sk_sp readableData = writableStream.detachAsData(); sk_sp copy = SkPicture::MakeFromData(readableData->data(), readableData->size()); copy->playback(canvas); ## #SeeAlso MakeFromStream SkWStream SkSerialProcs #Method ## # ------------------------------------------------------------------------------ #Method static sk_sp MakePlaceholder(SkRect cull) #In Constructors #Line # constructs placeholder with unique identifier ## #Populate #Example #Function class MyCanvas : public SkCanvas { public: MyCanvas(SkCanvas* c) : canvas(c) {} void onDrawPicture(const SkPicture* picture, const SkMatrix* , const SkPaint* ) override { const SkRect rect = picture->cullRect(); SkPaint redPaint; redPaint.setColor(SK_ColorRED); canvas->drawRect(rect, redPaint); } SkCanvas* canvas; }; ## SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); sk_sp placeholder = SkPicture::MakePlaceholder({10, 40, 80, 110}); pictureCanvas->drawPicture(placeholder); sk_sp picture = recorder.finishRecordingAsPicture(); MyCanvas myCanvas(canvas); myCanvas.drawPicture(picture); ## #SeeAlso MakeFromStream MakeFromData uniqueID #Method ## # ------------------------------------------------------------------------------ #Method virtual int approximateOpCount() const = 0 #In Property #Line # returns approximate operation count ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); picture->playback(canvas); std::string opCount = "approximate op count: " + std::to_string(picture->approximateOpCount()); canvas->drawString(opCount.c_str(), 50, 220, SkPaint()); ## #SeeAlso approximateBytesUsed #Method ## # ------------------------------------------------------------------------------ #Method virtual size_t approximateBytesUsed() const = 0 #In Property #Line # returns approximate size ## #Populate #Example SkPictureRecorder recorder; SkCanvas* pictureCanvas = recorder.beginRecording({0, 0, 256, 256}); SkPaint paint; pictureCanvas->drawRect(SkRect::MakeWH(200, 200), paint); paint.setColor(SK_ColorWHITE); pictureCanvas->drawRect(SkRect::MakeLTRB(20, 20, 180, 180), paint); sk_sp picture = recorder.finishRecordingAsPicture(); picture->playback(canvas); std::string opCount = "approximate bytes used: " + std::to_string(picture->approximateBytesUsed()); canvas->drawString(opCount.c_str(), 20, 220, SkPaint()); ## #SeeAlso approximateOpCount #Method ## #Class SkPicture ## #Topic Picture ##