| #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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| JustOneDraw callback; |
| picture->playback(canvas, &callback); |
| } |
| |
| ## |
| |
| #Class AbortCallback ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #Method static sk_sp<SkPicture> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| SkDynamicMemoryWStream writableStream; |
| picture->serialize(&writableStream); |
| std::unique_ptr<SkStreamAsset> readableStream = writableStream.detachAsStream(); |
| sk_sp<SkPicture> copy = SkPicture::MakeFromStream(readableStream.get()); |
| copy->playback(canvas); |
| ## |
| |
| #SeeAlso MakeFromData SkPictureRecorder |
| |
| #Method ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #Method static sk_sp<SkPicture> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| SkDynamicMemoryWStream writableStream; |
| picture->serialize(&writableStream); |
| sk_sp<SkData> readableData = writableStream.detachAsData(); |
| sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData.get()); |
| copy->playback(canvas); |
| ## |
| |
| #SeeAlso MakeFromStream SkPictureRecorder |
| |
| #Method ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #Method static sk_sp<SkPicture> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| SkDynamicMemoryWStream writableStream; |
| picture->serialize(&writableStream); |
| sk_sp<SkData> readableData = writableStream.detachAsData(); |
| sk_sp<SkPicture> 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<SkPicture> 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<SkPicture> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| SkDebugf("empty picture id = %d\n", picture->uniqueID()); |
| sk_sp<SkPicture> 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<SkData> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| sk_sp<SkData> readableData = picture->serialize(); |
| sk_sp<SkPicture> 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<SkPicture> picture = recorder.finishRecordingAsPicture(); |
| SkDynamicMemoryWStream writableStream; |
| picture->serialize(&writableStream); |
| sk_sp<SkData> readableData = writableStream.detachAsData(); |
| sk_sp<SkPicture> copy = SkPicture::MakeFromData(readableData->data(), readableData->size()); |
| copy->playback(canvas); |
| ## |
| |
| #SeeAlso MakeFromStream SkWStream SkSerialProcs |
| |
| #Method ## |
| |
| # ------------------------------------------------------------------------------ |
| |
| #Method static sk_sp<SkPicture> 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<SkPicture> placeholder = SkPicture::MakePlaceholder({10, 40, 80, 110}); |
| pictureCanvas->drawPicture(placeholder); |
| sk_sp<SkPicture> 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<SkPicture> 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<SkPicture> 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 ## |