18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/*
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2007 The Android Open Source Project
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com *
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */
78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkPicture_DEFINED
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkPicture_DEFINED
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRefCnt.h"
12e8597a4dd07d78eb0e7a45d6502896c1b9a8bfebmsarett#include "SkRect.h"
139db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein#include "SkTypes.h"
148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
159db912c2ac2ab53bc24f2d50a3e5a80162051dccmtkleinclass SkBigPicture;
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkCanvas;
17a9ca05ca5e604b9ee18e9cce19b059085ca0e22creedclass SkData;
1860691a5127852631b03250f15fa6cda9a504befcMike Reedstruct SkDeserialProcs;
19a9ca05ca5e604b9ee18e9cce19b059085ca0e22creedclass SkImage;
20db539905bb3af7bd05839a7d2558e97d5cb51ca2robertphillipsclass SkPictureData;
21e8597a4dd07d78eb0e7a45d6502896c1b9a8bfebmsarettclass SkReadBuffer;
220c263fa9f80b9a20b6f6161a2e9a263c2c586a9bmtkleinclass SkRefCntSet;
2360691a5127852631b03250f15fa6cda9a504befcMike Reedstruct SkSerialProcs;
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkStream;
250c263fa9f80b9a20b6f6161a2e9a263c2c586a9bmtkleinclass SkTypefacePlayback;
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkWStream;
27e8597a4dd07d78eb0e7a45d6502896c1b9a8bfebmsarettclass SkWriteBuffer;
28f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.comstruct SkPictInfo;
29f1754ec69131801c1a6ed3c704501a9400bbf324scroggo@google.com
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkPicture
318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
329db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    An SkPicture records drawing commands made to a canvas to be played back at a later time.
339db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    This base class handles serialization and a few other miscellany.
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com*/
35fd6a07b1e835f692b7dcb837027db6d5cc253618mtkleinclass SK_API SkPicture : public SkRefCnt {
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic:
37f8d7d2731318cdf510ab68e6b3f5ec68ab22c8e2scroggo@google.com    /**
38594706566a62da1e00fa1bb678cc84c36464e811Mike Reed     *  Recreate a picture that was serialized into a stream or data.
398715d47e247bf890ee78af0774ae7e8698146b67msarett     */
40a091a4bd78011a266e7292a9b721750ff62423d3Mike Reed
4147fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs* = nullptr);
4247fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    static sk_sp<SkPicture> MakeFromData(const SkData* data, const SkDeserialProcs* = nullptr);
4347fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    static sk_sp<SkPicture> MakeFromData(const void* data, size_t size,
4447fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed                                         const SkDeserialProcs* = nullptr);
4560691a5127852631b03250f15fa6cda9a504befcMike Reed
465e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org    /**
475e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     *  Recreate a picture that was serialized into a buffer. If the creation requires bitmap
485e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     *  decoding, the decoder must be set on the SkReadBuffer parameter by calling
49fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     *  SkReadBuffer::setBitmapDecoder() before calling SkPicture::MakeFromBuffer().
505e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     *  @param SkReadBuffer Serialized picture data.
515e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     *  @return A new SkPicture representing the serialized data, or NULL if the buffer is
525e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     *          invalid.
535e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org     */
54ca2622ba051829fed5f30facd74c5b41cd4b931creed    static sk_sp<SkPicture> MakeFromBuffer(SkReadBuffer&);
555e0995e4b36178e1e4465a9f50114ed39f038c27commit-bot@chromium.org
56783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    /**
57783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  Subclasses of this can be passed to playback(). During the playback
58783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  of the picture, this callback will periodically be invoked. If its
59783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  abort() returns true, then picture playback will be interrupted.
60783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *
61783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  The resulting drawing is undefined, as there is no guarantee how often the
62783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  callback will be invoked. If the abort happens inside some level of nested
63783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  calls to save(), restore will automatically be called to return the state
64783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    *  to the same level it was before the playback call was made.
65783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    */
66783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    class SK_API AbortCallback {
67783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    public:
68783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips        AbortCallback() {}
69783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips        virtual ~AbortCallback() {}
70783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips        virtual bool abort() = 0;
71783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips    };
72783fe16b8ed1cd1cff34eacc33296874a32f293brobertphillips
73c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips    /** Replays the drawing commands on the specified canvas. Note that
74c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips        this has the effect of unfurling this picture into the destination
75c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips        canvas. Using the SkCanvas::drawPicture entry point gives the destination
76c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips        canvas the option of just taking a ref.
7774babdfce524f478b9177834fe51d0394e42de6areed@google.com        @param canvas the canvas receiving the drawing commands.
78c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips        @param callback a callback that allows interruption of playback
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
80a93a14a99816d25b773f0b12868143702baf44bfBen Wagner    virtual void playback(SkCanvas*, AbortCallback* = nullptr) const = 0;
8115877b6eae33a9282458bdb904a6d00440eca0ecmtklein
829db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    /** Return a cull rect for this picture.
839db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein        Ops recorded into this picture that attempt to draw outside the cull might not be drawn.
8472743b165424efc4ef6f6614add9033ea1ef31dbmtklein     */
859db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    virtual SkRect cullRect() const = 0;
869db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein
879db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    /** Returns a non-zero value unique among all pictures. */
88e35268ef4cdaa29600671cdf9d0ebb43b622d1a3mtklein    uint32_t uniqueID() const;
89d5500886a29a20733c559c0167a6ae9946704de2robertphillips@google.com
9047fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    sk_sp<SkData> serialize(const SkSerialProcs* = nullptr) const;
9147fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    void serialize(SkWStream*, const SkSerialProcs* = nullptr) const;
9247fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed
9388d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein    /**
94fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     * Return a placeholder SkPicture.
95fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     * This placeholder does not draw anything itself.  It has a distinct uniqueID()
96fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     * (just like all SkPictures) and will always be visible to SkSerialProcs.
97fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     * @param cull the placeholder's dimensions
98fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     */
99fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein    static sk_sp<SkPicture> MakePlaceholder(SkRect cull);
100fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein
101fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein    /**
10288d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     *  Serialize to a buffer.
10388d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     */
10488d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein    void flatten(SkWriteBuffer&) const;
10588d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein
10688d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein    /** Return the approximate number of operations in this picture.  This
10788d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     *  number may be greater or less than the number of SkCanvas calls
10888d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     *  recorded: some calls may be recorded as more than one operation, or some
10988d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     *  calls may be optimized away.
11088d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein     */
11188d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein    virtual int approximateOpCount() const = 0;
11288d90714fad0fed2739fb8c5f90fe814c8a274efMike Klein
1137557bbbe19b0d56484fe039171e4d97b75f209b3Mike Reed    /** Returns the approximate byte size of this picture, not including large ref'd objects. */
1147557bbbe19b0d56484fe039171e4d97b75f209b3Mike Reed    virtual size_t approximateBytesUsed() const = 0;
1157557bbbe19b0d56484fe039171e4d97b75f209b3Mike Reed
1169db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    // Returns NULL if this is not an SkBigPicture.
117a93a14a99816d25b773f0b12868143702baf44bfBen Wagner    virtual const SkBigPicture* asSkBigPicture() const { return nullptr; }
11804c96950554b4e416755c5bc23022674518a6e8bmtklein
1199db912c2ac2ab53bc24f2d50a3e5a80162051dccmtkleinprivate:
1209db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    // Subclass whitelist.
1219db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    SkPicture();
1229db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    friend class SkBigPicture;
1239db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    friend class SkEmptyPicture;
1249db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    template <typename> friend class SkMiniPicture;
12572743b165424efc4ef6f6614add9033ea1ef31dbmtklein
12647fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    void serialize(SkWStream*, const SkSerialProcs*, SkRefCntSet* typefaces) const;
12747fdf6c85ee8151c14529e5322d63636c36ecdb8Mike Reed    static sk_sp<SkPicture> MakeFromStream(SkStream*, const SkDeserialProcs*, SkTypefacePlayback*);
1280c263fa9f80b9a20b6f6161a2e9a263c2c586a9bmtklein    friend class SkPictureData;
1290c263fa9f80b9a20b6f6161a2e9a263c2c586a9bmtklein
130e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed    /** Return true if the SkStream/Buffer represents a serialized picture, and
131e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed     fills out SkPictInfo. After this function returns, the data source is not
132e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed     rewound so it will have to be manually reset before passing to
133fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     MakeFromStream or MakeFromBuffer. Note, MakeFromStream and
134fbe6620284a5df423f00ef5b935a24f0682cba29Mike Klein     MakeFromBuffer perform this check internally so these entry points are
135e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed     intended for stand alone tools.
136e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed     If false is returned, SkPictInfo is unmodified.
137e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed     */
138e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed    static bool StreamIsSKP(SkStream*, SkPictInfo*);
139e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed    static bool BufferIsSKP(SkReadBuffer*, SkPictInfo*);
140e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed    friend bool SkPicture_StreamIsSKP(SkStream*, SkPictInfo*);
141e7a58321bbbe094ca0f9b03e25843f7666d5c198Mike Reed
1429db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    friend struct SkPathCounter;
14372743b165424efc4ef6f6614add9033ea1ef31dbmtklein
144a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips    // V35: Store SkRect (rather then width & height) in header
145c5e15a1afab2621e860a251c3fcf5917867ad49freed    // V36: Remove (obsolete) alphatype from SkColorTable
1468eddfb50c0c9e4bcba6384a2ce39852b5fb5becbreed    // V37: Added shadow only option to SkDropShadowImageFilter (last version to record CLEAR)
147f3c78ccf5694d22d2e4a7061a80399a7e69b59dbjunov    // V38: Added PictureResolution option to SkPictureImageFilter
148f3c78ccf5694d22d2e4a7061a80399a7e69b59dbjunov    // V39: Added FilterLevel option to SkPictureImageFilter
1494a22a433bfb972dcd96f76e3d3b0613c26d8fc86senorblanco    // V40: Remove UniqueID serialization from SkImageFilter.
15025c40d25d75c8ee5d9632608ba09eb2c5fb765d2robertphillips    // V41: Added serialization of SkBitmapSource's filterQuality parameter
15176be9c8dc0e5306ef81c2987848088cdec7ccd3fmtklein    // V42: Added a bool to SkPictureShader serialization to indicate did-we-serialize-a-picture?
152871872f3f247f6b699617f6d9ef50ef5da6fbe74reed    // V43: Added DRAW_IMAGE and DRAW_IMAGE_RECT opt codes to serialized data
153f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    // V44: Move annotations from paint to drawAnnotation
1540576aa9c0722bba358a27f80cc134ea2cd4ca2c9mtklein    // V45: Add invNormRotation to SkLightingShader.
15545561a0b15fe045ba272c328684c3f7ae290785areed    // V46: Add drawTextRSXform
15627cdd947903a4262bb483e7d35153358f4541bf8robertphillips    // V47: Add occluder rect to SkBlurMaskFilter
1574f0a23a8d54f5eb0fdacfff7c109b9045b548978halcanary    // V48: Read and write extended SkTextBlobs.
158e25d71ccbcdb47c7ee7bdf13235066092ae11af3brianosman    // V49: Gradients serialized as SkColor4f + SkColorSpace
159374772bd61951f01bf84fe17bf53d8867681c9aereed    // V50: SkXfermode -> SkBlendMode
1607d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed    // V51: more SkXfermode -> SkBlendMode
1613a9a7a310c5cff72bc1c2388a496af1b82326355Florin Malita    // V52: Remove SkTextBlob::fRunCount
16253f77bd4fdd76525b66b7f26d1c5c550858120dfFlorin Malita    // V53: SaveLayerRec clip mask
16301b2b83aba10bc3767d660cd619c1da58b5eb0b5Mike Reed    // V54: ComposeShader can use a Mode or a Lerp
1640bdaf05fc17ebe5d4ad01d70c80df2425e83c737Mike Reed    // V55: Drop blendmode[] from MergeImageFilter
165da69944cbb9e561694716b8882d201d4f7f8790ewutao    // V56: Add TileMode in SkBlurImageFilter.
1665a9a981edf54d203e06adab0909da03343a1c596Florin Malita    // V57: Sweep tiling info.
1675f379a8b117f68b2087ab4b400b7d2f110f5600cFlorin Malita    // V58: No more 2pt conical flipping.
16877e487dfc005be66346ebf3e33d3ec394de4cc36Mike Reed    // V59: No more LocalSpace option on PictureImageFilter
169d1c65d6708de536a5971575809d7172fa4f54b37Mike Reed    // V60: Remove flags in picture header
170b1b80f7de4224c5083dfc1475e1988b2ce839a65Jim Van Verth    // V61: Change SkDrawPictureRec to take two colors rather than two alphas
171d281c9240c7bd51ce0c29c6d4de27819e359e1d1commit-bot@chromium.org
172e8d9614cd187c7a2aa474f9ca7aac208ded71400commit-bot@chromium.org    // Only SKPs within the min/current picture version range (inclusive) can be read.
173c5166a9dcbf2eeb95cb8e2918271132aa34bf5cdMike Reed    static const uint32_t     MIN_PICTURE_VERSION = 56;     // august 2017
174b1b80f7de4224c5083dfc1475e1988b2ce839a65Jim Van Verth    static const uint32_t CURRENT_PICTURE_VERSION = 61;
1759a5b570e5cbf907fabd69a5ffef94ef135e4066frobertphillips@google.com
1769e5f85e89d03a850d435fc951e74e9861a0c1bddcommit-bot@chromium.org    static bool IsValidPictInfo(const SkPictInfo& info);
17799e20891a080f39113bd7a5dc202730f2a13fa07robertphillips    static sk_sp<SkPicture> Forwardport(const SkPictInfo&,
17899e20891a080f39113bd7a5dc202730f2a13fa07robertphillips                                        const SkPictureData*,
179d921dbb9b88327eef7b1fbd42e9d88bace4a65ffreed                                        SkReadBuffer* buffer);
180b7ed856fadae52401d3bbcac22cfc3391780ace8reed
1819db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    SkPictInfo createHeader() const;
1829db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    SkPictureData* backport() const;
183c6ad9eefa0f8d0c2ede9884b446c65dde9b04dd1mtklein
1849db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    mutable uint32_t fUniqueID;
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif
188