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 "SkCanvas.h" 11 #include "SkChecksum.h" 12 #include "SkReadBuffer.h" 13 #include "SkWriteBuffer.h" 14 #include "SkPaint.h" 15 #include "SkPicture.h" 16 #include "SkPtrRecorder.h" 17 #include "SkTDynamicHash.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, 34 DRAW_BITMAP_MATRIX, // deprecated, M41 was last Chromium version to write this to an .skp 35 DRAW_BITMAP_NINE, 36 DRAW_BITMAP_RECT, 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, 45 DRAW_POS_TEXT_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT 46 DRAW_POS_TEXT_H, 47 DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H 48 DRAW_RECT, 49 DRAW_RRECT, 50 DRAW_SPRITE, 51 DRAW_TEXT, 52 DRAW_TEXT_ON_PATH, 53 DRAW_TEXT_TOP_BOTTOM, // fast variant of DRAW_TEXT 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 BEGIN_COMMENT_GROUP_obsolete, 65 COMMENT_obsolete, 66 END_COMMENT_GROUP_obsolete, 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, 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 LAST_DRAWTYPE_ENUM = FLUSH 101 }; 102 103 // In the 'match' method, this constant will match any flavor of DRAW_BITMAP* 104 static const int kDRAW_BITMAP_FLAVOR = LAST_DRAWTYPE_ENUM+1; 105 106 enum DrawVertexFlags { 107 DRAW_VERTICES_HAS_TEXS = 0x01, 108 DRAW_VERTICES_HAS_COLORS = 0x02, 109 DRAW_VERTICES_HAS_INDICES = 0x04, 110 DRAW_VERTICES_HAS_XFER = 0x08, 111 }; 112 113 enum DrawAtlasFlags { 114 DRAW_ATLAS_HAS_COLORS = 1 << 0, 115 DRAW_ATLAS_HAS_CULL = 1 << 1, 116 }; 117 118 enum DrawTextRSXformFlags { 119 DRAW_TEXT_RSXFORM_HAS_CULL = 1 << 0, 120 }; 121 122 enum SaveLayerRecFlatFlags { 123 SAVELAYERREC_HAS_BOUNDS = 1 << 0, 124 SAVELAYERREC_HAS_PAINT = 1 << 1, 125 SAVELAYERREC_HAS_BACKDROP = 1 << 2, 126 SAVELAYERREC_HAS_FLAGS = 1 << 3, 127 SAVELAYERREC_HAS_CLIPMASK = 1 << 4, 128 SAVELAYERREC_HAS_CLIPMATRIX = 1 << 5, 129 }; 130 131 /////////////////////////////////////////////////////////////////////////////// 132 // clipparams are packed in 5 bits 133 // doAA:1 | clipOp:4 134 135 static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) { 136 unsigned doAABit = doAA ? 1 : 0; 137 return (doAABit << 4) | static_cast<int>(op); 138 } 139 140 template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) { 141 142 if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) { 143 return static_cast<T>(candidate); 144 } 145 146 return T::kMax_EnumValue; 147 } 148 149 static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) { 150 return asValidEnum<SkClipOp>(buffer, packed & 0xF); 151 } 152 153 static inline bool ClipParams_unpackDoAA(uint32_t packed) { 154 return SkToBool((packed >> 4) & 1); 155 } 156 157 /////////////////////////////////////////////////////////////////////////////// 158 159 class SkTypefacePlayback { 160 public: 161 SkTypefacePlayback(); 162 virtual ~SkTypefacePlayback(); 163 164 int count() const { return fCount; } 165 166 void reset(const SkRefCntSet*); 167 168 void setCount(int count); 169 SkRefCnt* set(int index, SkRefCnt*); 170 171 void setupBuffer(SkReadBuffer& buffer) const { 172 buffer.setTypefaceArray((SkTypeface**)fArray, fCount); 173 } 174 175 protected: 176 int fCount; 177 SkRefCnt** fArray; 178 }; 179 180 class SkFactoryPlayback { 181 public: 182 SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; } 183 184 ~SkFactoryPlayback() { delete[] fArray; } 185 186 SkFlattenable::Factory* base() const { return fArray; } 187 188 void setupBuffer(SkReadBuffer& buffer) const { 189 buffer.setFactoryPlayback(fArray, fCount); 190 } 191 192 private: 193 int fCount; 194 SkFlattenable::Factory* fArray; 195 }; 196 197 #endif 198