| 1 | /* | 
|---|
| 2 | * Copyright 2011 Google Inc. | 
|---|
| 3 | * | 
|---|
| 4 | * Use of this source code is governed by a BSD-style license that can be | 
|---|
| 5 | * found in the LICENSE file. | 
|---|
| 6 | */ | 
|---|
| 7 | #ifndef SkPictureFlat_DEFINED | 
|---|
| 8 | #define SkPictureFlat_DEFINED | 
|---|
| 9 |  | 
|---|
| 10 | #include "include/core/SkCanvas.h" | 
|---|
| 11 | #include "include/core/SkPaint.h" | 
|---|
| 12 | #include "include/core/SkPicture.h" | 
|---|
| 13 | #include "include/private/SkChecksum.h" | 
|---|
| 14 | #include "src/core/SkPtrRecorder.h" | 
|---|
| 15 | #include "src/core/SkReadBuffer.h" | 
|---|
| 16 | #include "src/core/SkTDynamicHash.h" | 
|---|
| 17 | #include "src/core/SkWriteBuffer.h" | 
|---|
| 18 |  | 
|---|
| 19 | /* | 
|---|
| 20 | * Note: While adding new DrawTypes, it is necessary to add to the end of this list | 
|---|
| 21 | *       and update LAST_DRAWTYPE_ENUM to avoid having the code read older skps wrong. | 
|---|
| 22 | *       (which can cause segfaults) | 
|---|
| 23 | * | 
|---|
| 24 | *       Reordering can be done during version updates. | 
|---|
| 25 | */ | 
|---|
| 26 | enum DrawType { | 
|---|
| 27 | UNUSED, | 
|---|
| 28 | CLIP_PATH, | 
|---|
| 29 | CLIP_REGION, | 
|---|
| 30 | CLIP_RECT, | 
|---|
| 31 | CLIP_RRECT, | 
|---|
| 32 | CONCAT, | 
|---|
| 33 | DRAW_BITMAP_RETIRED_2016_REMOVED_2018, | 
|---|
| 34 | DRAW_BITMAP_MATRIX_RETIRED_2016_REMOVED_2018, | 
|---|
| 35 | DRAW_BITMAP_NINE_RETIRED_2016_REMOVED_2018, | 
|---|
| 36 | DRAW_BITMAP_RECT_RETIRED_2016_REMOVED_2018, | 
|---|
| 37 | DRAW_CLEAR, | 
|---|
| 38 | DRAW_DATA, | 
|---|
| 39 | DRAW_OVAL, | 
|---|
| 40 | DRAW_PAINT, | 
|---|
| 41 | DRAW_PATH, | 
|---|
| 42 | DRAW_PICTURE, | 
|---|
| 43 | DRAW_POINTS, | 
|---|
| 44 | DRAW_POS_TEXT_REMOVED_1_2019, | 
|---|
| 45 | DRAW_POS_TEXT_TOP_BOTTOM_REMOVED_1_2019, | 
|---|
| 46 | DRAW_POS_TEXT_H_REMOVED_1_2019, | 
|---|
| 47 | DRAW_POS_TEXT_H_TOP_BOTTOM_REMOVED_1_2019, | 
|---|
| 48 | DRAW_RECT, | 
|---|
| 49 | DRAW_RRECT, | 
|---|
| 50 | DRAW_SPRITE_RETIRED_2015_REMOVED_2018, | 
|---|
| 51 | DRAW_TEXT_REMOVED_1_2019, | 
|---|
| 52 | DRAW_TEXT_ON_PATH_RETIRED_08_2018_REMOVED_10_2018, | 
|---|
| 53 | DRAW_TEXT_TOP_BOTTOM_REMOVED_1_2019, | 
|---|
| 54 | DRAW_VERTICES_RETIRED_03_2017_REMOVED_01_2018, | 
|---|
| 55 | RESTORE, | 
|---|
| 56 | ROTATE, | 
|---|
| 57 | SAVE, | 
|---|
| 58 | SAVE_LAYER_SAVEFLAGS_DEPRECATED, | 
|---|
| 59 | SCALE, | 
|---|
| 60 | SET_MATRIX, | 
|---|
| 61 | SKEW, | 
|---|
| 62 | TRANSLATE, | 
|---|
| 63 | NOOP, | 
|---|
| 64 | , | 
|---|
| 65 | , | 
|---|
| 66 | , | 
|---|
| 67 |  | 
|---|
| 68 | // new ops -- feel free to re-alphabetize on next version bump | 
|---|
| 69 | DRAW_DRRECT, | 
|---|
| 70 | PUSH_CULL,  // deprecated, M41 was last Chromium version to write this to an .skp | 
|---|
| 71 | POP_CULL,   // deprecated, M41 was last Chromium version to write this to an .skp | 
|---|
| 72 |  | 
|---|
| 73 | DRAW_PATCH, // could not add in aphabetical order | 
|---|
| 74 | DRAW_PICTURE_MATRIX_PAINT, | 
|---|
| 75 | DRAW_TEXT_BLOB, | 
|---|
| 76 | DRAW_IMAGE, | 
|---|
| 77 | DRAW_IMAGE_RECT_STRICT_obsolete, | 
|---|
| 78 | DRAW_ATLAS, | 
|---|
| 79 | DRAW_IMAGE_NINE, | 
|---|
| 80 | DRAW_IMAGE_RECT, | 
|---|
| 81 |  | 
|---|
| 82 | SAVE_LAYER_SAVELAYERFLAGS_DEPRECATED_JAN_2016_REMOVED_01_2018, | 
|---|
| 83 | SAVE_LAYER_SAVELAYERREC, | 
|---|
| 84 |  | 
|---|
| 85 | DRAW_ANNOTATION, | 
|---|
| 86 | DRAW_DRAWABLE, | 
|---|
| 87 | DRAW_DRAWABLE_MATRIX, | 
|---|
| 88 | DRAW_TEXT_RSXFORM_DEPRECATED_DEC_2018, | 
|---|
| 89 |  | 
|---|
| 90 | TRANSLATE_Z, // deprecated (M60) | 
|---|
| 91 |  | 
|---|
| 92 | DRAW_SHADOW_REC, | 
|---|
| 93 | DRAW_IMAGE_LATTICE, | 
|---|
| 94 | DRAW_ARC, | 
|---|
| 95 | DRAW_REGION, | 
|---|
| 96 | DRAW_VERTICES_OBJECT, | 
|---|
| 97 |  | 
|---|
| 98 | FLUSH, | 
|---|
| 99 |  | 
|---|
| 100 | DRAW_EDGEAA_IMAGE_SET, | 
|---|
| 101 |  | 
|---|
| 102 | SAVE_BEHIND, | 
|---|
| 103 |  | 
|---|
| 104 | DRAW_EDGEAA_QUAD, | 
|---|
| 105 |  | 
|---|
| 106 | DRAW_BEHIND_PAINT, | 
|---|
| 107 | CONCAT44, | 
|---|
| 108 | CLIP_SHADER_IN_PAINT, | 
|---|
| 109 | MARK_CTM, | 
|---|
| 110 |  | 
|---|
| 111 | LAST_DRAWTYPE_ENUM = MARK_CTM, | 
|---|
| 112 | }; | 
|---|
| 113 |  | 
|---|
| 114 | enum DrawVertexFlags { | 
|---|
| 115 | DRAW_VERTICES_HAS_TEXS    = 0x01, | 
|---|
| 116 | DRAW_VERTICES_HAS_COLORS  = 0x02, | 
|---|
| 117 | DRAW_VERTICES_HAS_INDICES = 0x04, | 
|---|
| 118 | DRAW_VERTICES_HAS_XFER    = 0x08, | 
|---|
| 119 | }; | 
|---|
| 120 |  | 
|---|
| 121 | enum DrawAtlasFlags { | 
|---|
| 122 | DRAW_ATLAS_HAS_COLORS   = 1 << 0, | 
|---|
| 123 | DRAW_ATLAS_HAS_CULL     = 1 << 1, | 
|---|
| 124 | }; | 
|---|
| 125 |  | 
|---|
| 126 | enum DrawTextRSXformFlags { | 
|---|
| 127 | DRAW_TEXT_RSXFORM_HAS_CULL  = 1 << 0, | 
|---|
| 128 | }; | 
|---|
| 129 |  | 
|---|
| 130 | enum SaveLayerRecFlatFlags { | 
|---|
| 131 | SAVELAYERREC_HAS_BOUNDS     = 1 << 0, | 
|---|
| 132 | SAVELAYERREC_HAS_PAINT      = 1 << 1, | 
|---|
| 133 | SAVELAYERREC_HAS_BACKDROP   = 1 << 2, | 
|---|
| 134 | SAVELAYERREC_HAS_FLAGS      = 1 << 3, | 
|---|
| 135 | SAVELAYERREC_HAS_CLIPMASK_OBSOLETE   = 1 << 4,  // 6/13/2020 | 
|---|
| 136 | SAVELAYERREC_HAS_CLIPMATRIX_OBSOLETE = 1 << 5,  // 6/13/2020 | 
|---|
| 137 | }; | 
|---|
| 138 |  | 
|---|
| 139 | enum SaveBehindFlatFlags { | 
|---|
| 140 | SAVEBEHIND_HAS_SUBSET = 1 << 0, | 
|---|
| 141 | }; | 
|---|
| 142 |  | 
|---|
| 143 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 144 | // clipparams are packed in 5 bits | 
|---|
| 145 | //  doAA:1 | clipOp:4 | 
|---|
| 146 |  | 
|---|
| 147 | static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) { | 
|---|
| 148 | unsigned doAABit = doAA ? 1 : 0; | 
|---|
| 149 | return (doAABit << 4) | static_cast<int>(op); | 
|---|
| 150 | } | 
|---|
| 151 |  | 
|---|
| 152 | template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) { | 
|---|
| 153 |  | 
|---|
| 154 | if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) { | 
|---|
| 155 | return static_cast<T>(candidate); | 
|---|
| 156 | } | 
|---|
| 157 |  | 
|---|
| 158 | return T::kMax_EnumValue; | 
|---|
| 159 | } | 
|---|
| 160 |  | 
|---|
| 161 | static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) { | 
|---|
| 162 | return asValidEnum<SkClipOp>(buffer, packed & 0xF); | 
|---|
| 163 | } | 
|---|
| 164 |  | 
|---|
| 165 | static inline bool ClipParams_unpackDoAA(uint32_t packed) { | 
|---|
| 166 | return SkToBool((packed >> 4) & 1); | 
|---|
| 167 | } | 
|---|
| 168 |  | 
|---|
| 169 | /////////////////////////////////////////////////////////////////////////////// | 
|---|
| 170 |  | 
|---|
| 171 | class SkTypefacePlayback { | 
|---|
| 172 | public: | 
|---|
| 173 | SkTypefacePlayback() : fCount(0), fArray(nullptr) {} | 
|---|
| 174 | ~SkTypefacePlayback() = default; | 
|---|
| 175 |  | 
|---|
| 176 | void setCount(size_t count); | 
|---|
| 177 |  | 
|---|
| 178 | size_t count() const { return fCount; } | 
|---|
| 179 |  | 
|---|
| 180 | sk_sp<SkTypeface>& operator[](size_t index) { | 
|---|
| 181 | SkASSERT(index < fCount); | 
|---|
| 182 | return fArray[index]; | 
|---|
| 183 | } | 
|---|
| 184 |  | 
|---|
| 185 | void setupBuffer(SkReadBuffer& buffer) const { | 
|---|
| 186 | buffer.setTypefaceArray(fArray.get(), fCount); | 
|---|
| 187 | } | 
|---|
| 188 |  | 
|---|
| 189 | protected: | 
|---|
| 190 | size_t fCount; | 
|---|
| 191 | std::unique_ptr<sk_sp<SkTypeface>[]> fArray; | 
|---|
| 192 | }; | 
|---|
| 193 |  | 
|---|
| 194 | class SkFactoryPlayback { | 
|---|
| 195 | public: | 
|---|
| 196 | SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; } | 
|---|
| 197 |  | 
|---|
| 198 | ~SkFactoryPlayback() { delete[] fArray; } | 
|---|
| 199 |  | 
|---|
| 200 | SkFlattenable::Factory* base() const { return fArray; } | 
|---|
| 201 |  | 
|---|
| 202 | void setupBuffer(SkReadBuffer& buffer) const { | 
|---|
| 203 | buffer.setFactoryPlayback(fArray, fCount); | 
|---|
| 204 | } | 
|---|
| 205 |  | 
|---|
| 206 | private: | 
|---|
| 207 | int fCount; | 
|---|
| 208 | SkFlattenable::Factory* fArray; | 
|---|
| 209 | }; | 
|---|
| 210 |  | 
|---|
| 211 | #endif | 
|---|
| 212 |  | 
|---|