Home | History | Annotate | Download | only in core
      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