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