| /* | 
 |  * Copyright 2011 Google Inc. | 
 |  * | 
 |  * Use of this source code is governed by a BSD-style license that can be | 
 |  * found in the LICENSE file. | 
 |  */ | 
 | #ifndef SkPictureFlat_DEFINED | 
 | #define SkPictureFlat_DEFINED | 
 |  | 
 | #include "SkCanvas.h" | 
 | #include "SkChecksum.h" | 
 | #include "SkReadBuffer.h" | 
 | #include "SkWriteBuffer.h" | 
 | #include "SkPaint.h" | 
 | #include "SkPicture.h" | 
 | #include "SkPtrRecorder.h" | 
 | #include "SkTDynamicHash.h" | 
 |  | 
 | /* | 
 |  * Note: While adding new DrawTypes, it is necessary to add to the end of this list | 
 |  *       and update LAST_DRAWTYPE_ENUM to avoid having the code read older skps wrong. | 
 |  *       (which can cause segfaults) | 
 |  * | 
 |  *       Reordering can be done during version updates. | 
 |  */ | 
 | enum DrawType { | 
 |     UNUSED, | 
 |     CLIP_PATH, | 
 |     CLIP_REGION, | 
 |     CLIP_RECT, | 
 |     CLIP_RRECT, | 
 |     CONCAT, | 
 |     DRAW_BITMAP_RETIRED_2016_REMOVED_2018, | 
 |     DRAW_BITMAP_MATRIX_RETIRED_2016_REMOVED_2018, | 
 |     DRAW_BITMAP_NINE_RETIRED_2016_REMOVED_2018, | 
 |     DRAW_BITMAP_RECT_RETIRED_2016_REMOVED_2018, | 
 |     DRAW_CLEAR, | 
 |     DRAW_DATA, | 
 |     DRAW_OVAL, | 
 |     DRAW_PAINT, | 
 |     DRAW_PATH, | 
 |     DRAW_PICTURE, | 
 |     DRAW_POINTS, | 
 |     DRAW_POS_TEXT, | 
 |     DRAW_POS_TEXT_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT | 
 |     DRAW_POS_TEXT_H, | 
 |     DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H | 
 |     DRAW_RECT, | 
 |     DRAW_RRECT, | 
 |     DRAW_SPRITE_RETIRED_2015_REMOVED_2018, | 
 |     DRAW_TEXT, | 
 |     DRAW_TEXT_ON_PATH_RETIRED_08_2018, | 
 |     DRAW_TEXT_TOP_BOTTOM,   // fast variant of DRAW_TEXT | 
 |     DRAW_VERTICES_RETIRED_03_2017_REMOVED_01_2018, | 
 |     RESTORE, | 
 |     ROTATE, | 
 |     SAVE, | 
 |     SAVE_LAYER_SAVEFLAGS_DEPRECATED, | 
 |     SCALE, | 
 |     SET_MATRIX, | 
 |     SKEW, | 
 |     TRANSLATE, | 
 |     NOOP, | 
 |     BEGIN_COMMENT_GROUP_obsolete, | 
 |     COMMENT_obsolete, | 
 |     END_COMMENT_GROUP_obsolete, | 
 |  | 
 |     // new ops -- feel free to re-alphabetize on next version bump | 
 |     DRAW_DRRECT, | 
 |     PUSH_CULL,  // deprecated, M41 was last Chromium version to write this to an .skp | 
 |     POP_CULL,   // deprecated, M41 was last Chromium version to write this to an .skp | 
 |  | 
 |     DRAW_PATCH, // could not add in aphabetical order | 
 |     DRAW_PICTURE_MATRIX_PAINT, | 
 |     DRAW_TEXT_BLOB, | 
 |     DRAW_IMAGE, | 
 |     DRAW_IMAGE_RECT_STRICT_obsolete, | 
 |     DRAW_ATLAS, | 
 |     DRAW_IMAGE_NINE, | 
 |     DRAW_IMAGE_RECT, | 
 |  | 
 |     SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016_REMOVED_01_2018, | 
 |     SAVE_LAYER_SAVELAYERREC, | 
 |  | 
 |     DRAW_ANNOTATION, | 
 |     DRAW_DRAWABLE, | 
 |     DRAW_DRAWABLE_MATRIX, | 
 |     DRAW_TEXT_RSXFORM, | 
 |  | 
 |     TRANSLATE_Z, // deprecated (M60) | 
 |  | 
 |     DRAW_SHADOW_REC, | 
 |     DRAW_IMAGE_LATTICE, | 
 |     DRAW_ARC, | 
 |     DRAW_REGION, | 
 |     DRAW_VERTICES_OBJECT, | 
 |  | 
 |     FLUSH, | 
 |  | 
 |     LAST_DRAWTYPE_ENUM = FLUSH | 
 | }; | 
 |  | 
 | enum DrawVertexFlags { | 
 |     DRAW_VERTICES_HAS_TEXS    = 0x01, | 
 |     DRAW_VERTICES_HAS_COLORS  = 0x02, | 
 |     DRAW_VERTICES_HAS_INDICES = 0x04, | 
 |     DRAW_VERTICES_HAS_XFER    = 0x08, | 
 | }; | 
 |  | 
 | enum DrawAtlasFlags { | 
 |     DRAW_ATLAS_HAS_COLORS   = 1 << 0, | 
 |     DRAW_ATLAS_HAS_CULL     = 1 << 1, | 
 | }; | 
 |  | 
 | enum DrawTextRSXformFlags { | 
 |     DRAW_TEXT_RSXFORM_HAS_CULL  = 1 << 0, | 
 | }; | 
 |  | 
 | enum SaveLayerRecFlatFlags { | 
 |     SAVELAYERREC_HAS_BOUNDS     = 1 << 0, | 
 |     SAVELAYERREC_HAS_PAINT      = 1 << 1, | 
 |     SAVELAYERREC_HAS_BACKDROP   = 1 << 2, | 
 |     SAVELAYERREC_HAS_FLAGS      = 1 << 3, | 
 |     SAVELAYERREC_HAS_CLIPMASK   = 1 << 4, | 
 |     SAVELAYERREC_HAS_CLIPMATRIX = 1 << 5, | 
 | }; | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 | // clipparams are packed in 5 bits | 
 | //  doAA:1 | clipOp:4 | 
 |  | 
 | static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) { | 
 |     unsigned doAABit = doAA ? 1 : 0; | 
 |     return (doAABit << 4) | static_cast<int>(op); | 
 | } | 
 |  | 
 | template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) { | 
 |  | 
 |     if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) { | 
 |         return static_cast<T>(candidate); | 
 |     } | 
 |  | 
 |     return T::kMax_EnumValue; | 
 | } | 
 |  | 
 | static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) { | 
 |     return asValidEnum<SkClipOp>(buffer, packed & 0xF); | 
 | } | 
 |  | 
 | static inline bool ClipParams_unpackDoAA(uint32_t packed) { | 
 |     return SkToBool((packed >> 4) & 1); | 
 | } | 
 |  | 
 | /////////////////////////////////////////////////////////////////////////////// | 
 |  | 
 | class SkTypefacePlayback { | 
 | public: | 
 |     SkTypefacePlayback() : fCount(0), fArray(nullptr) {} | 
 |     ~SkTypefacePlayback(); | 
 |  | 
 |     void setCount(size_t count); | 
 |  | 
 |     size_t count() const { return fCount; } | 
 |  | 
 |     sk_sp<SkTypeface>& operator[](size_t index) { | 
 |         SkASSERT(index < fCount); | 
 |         return fArray[index]; | 
 |     } | 
 |  | 
 |     void setupBuffer(SkReadBuffer& buffer) const { | 
 |         buffer.setTypefaceArray(fArray.get(), fCount); | 
 |     } | 
 |  | 
 | protected: | 
 |     size_t fCount; | 
 |     std::unique_ptr<sk_sp<SkTypeface>[]> fArray; | 
 | }; | 
 |  | 
 | class SkFactoryPlayback { | 
 | public: | 
 |     SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; } | 
 |  | 
 |     ~SkFactoryPlayback() { delete[] fArray; } | 
 |  | 
 |     SkFlattenable::Factory* base() const { return fArray; } | 
 |  | 
 |     void setupBuffer(SkReadBuffer& buffer) const { | 
 |         buffer.setFactoryPlayback(fArray, fCount); | 
 |     } | 
 |  | 
 | private: | 
 |     int fCount; | 
 |     SkFlattenable::Factory* fArray; | 
 | }; | 
 |  | 
 | #endif |