• Home
  • History
  • Annotate
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_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      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_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_IMAGE_SET,
101  
102      SAVE_BEHIND,
103  
104      DRAW_EDGEAA_RECT,
105  
106      DRAW_BEHIND_PAINT,
107  
108      LAST_DRAWTYPE_ENUM = DRAW_BEHIND_PAINT,
109  };
110  
111  enum DrawVertexFlags {
112      DRAW_VERTICES_HAS_TEXS    = 0x01,
113      DRAW_VERTICES_HAS_COLORS  = 0x02,
114      DRAW_VERTICES_HAS_INDICES = 0x04,
115      DRAW_VERTICES_HAS_XFER    = 0x08,
116  };
117  
118  enum DrawAtlasFlags {
119      DRAW_ATLAS_HAS_COLORS   = 1 << 0,
120      DRAW_ATLAS_HAS_CULL     = 1 << 1,
121  };
122  
123  enum DrawTextRSXformFlags {
124      DRAW_TEXT_RSXFORM_HAS_CULL  = 1 << 0,
125  };
126  
127  enum SaveLayerRecFlatFlags {
128      SAVELAYERREC_HAS_BOUNDS     = 1 << 0,
129      SAVELAYERREC_HAS_PAINT      = 1 << 1,
130      SAVELAYERREC_HAS_BACKDROP   = 1 << 2,
131      SAVELAYERREC_HAS_FLAGS      = 1 << 3,
132      SAVELAYERREC_HAS_CLIPMASK   = 1 << 4,
133      SAVELAYERREC_HAS_CLIPMATRIX = 1 << 5,
134  };
135  
136  enum SaveBehindFlatFlags {
137      SAVEBEHIND_HAS_SUBSET = 1 << 0,
138  };
139  
140  ///////////////////////////////////////////////////////////////////////////////
141  // clipparams are packed in 5 bits
142  //  doAA:1 | clipOp:4
143  
ClipParams_pack(SkClipOp op,bool doAA)144  static inline uint32_t ClipParams_pack(SkClipOp op, bool doAA) {
145      unsigned doAABit = doAA ? 1 : 0;
146      return (doAABit << 4) | static_cast<int>(op);
147  }
148  
asValidEnum(SkReadBuffer * buffer,uint32_t candidate)149  template <typename T> T asValidEnum(SkReadBuffer* buffer, uint32_t candidate) {
150  
151      if (buffer->validate(candidate <= static_cast<uint32_t>(T::kMax_EnumValue))) {
152          return static_cast<T>(candidate);
153      }
154  
155      return T::kMax_EnumValue;
156  }
157  
ClipParams_unpackRegionOp(SkReadBuffer * buffer,uint32_t packed)158  static inline SkClipOp ClipParams_unpackRegionOp(SkReadBuffer* buffer, uint32_t packed) {
159      return asValidEnum<SkClipOp>(buffer, packed & 0xF);
160  }
161  
ClipParams_unpackDoAA(uint32_t packed)162  static inline bool ClipParams_unpackDoAA(uint32_t packed) {
163      return SkToBool((packed >> 4) & 1);
164  }
165  
166  ///////////////////////////////////////////////////////////////////////////////
167  
168  class SkTypefacePlayback {
169  public:
SkTypefacePlayback()170      SkTypefacePlayback() : fCount(0), fArray(nullptr) {}
171      ~SkTypefacePlayback() = default;
172  
173      void setCount(size_t count);
174  
count()175      size_t count() const { return fCount; }
176  
177      sk_sp<SkTypeface>& operator[](size_t index) {
178          SkASSERT(index < fCount);
179          return fArray[index];
180      }
181  
setupBuffer(SkReadBuffer & buffer)182      void setupBuffer(SkReadBuffer& buffer) const {
183          buffer.setTypefaceArray(fArray.get(), fCount);
184      }
185  
186  protected:
187      size_t fCount;
188      std::unique_ptr<sk_sp<SkTypeface>[]> fArray;
189  };
190  
191  class SkFactoryPlayback {
192  public:
SkFactoryPlayback(int count)193      SkFactoryPlayback(int count) : fCount(count) { fArray = new SkFlattenable::Factory[count]; }
194  
~SkFactoryPlayback()195      ~SkFactoryPlayback() { delete[] fArray; }
196  
base()197      SkFlattenable::Factory* base() const { return fArray; }
198  
setupBuffer(SkReadBuffer & buffer)199      void setupBuffer(SkReadBuffer& buffer) const {
200          buffer.setFactoryPlayback(fArray, fCount);
201      }
202  
203  private:
204      int fCount;
205      SkFlattenable::Factory* fArray;
206  };
207  
208  #endif
209