1 2 /* 3 * Copyright 2011 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 10 11 #ifndef SkGPipePriv_DEFINED 12 #define SkGPipePriv_DEFINED 13 14 #include "SkTypes.h" 15 16 #define UNIMPLEMENTED 17 18 // these must be contiguous, 0...N-1 19 enum PaintFlats { 20 kColorFilter_PaintFlat, 21 kDrawLooper_PaintFlat, 22 kMaskFilter_PaintFlat, 23 kPathEffect_PaintFlat, 24 kRasterizer_PaintFlat, 25 kShader_PaintFlat, 26 kImageFilter_PaintFlat, 27 kXfermode_PaintFlat, 28 29 kLast_PaintFlat = kXfermode_PaintFlat 30 }; 31 #define kCount_PaintFlats (kLast_PaintFlat + 1) 32 33 enum DrawOps { 34 kSkip_DrawOp, // skip an addition N bytes (N == data) 35 36 // these match Canvas apis 37 kClipPath_DrawOp, 38 kClipRegion_DrawOp, 39 kClipRect_DrawOp, 40 kClipRRect_DrawOp, 41 kConcat_DrawOp, 42 kDrawBitmap_DrawOp, 43 kDrawBitmapMatrix_DrawOp, 44 kDrawBitmapNine_DrawOp, 45 kDrawBitmapRectToRect_DrawOp, 46 kDrawClear_DrawOp, 47 kDrawData_DrawOp, 48 kDrawOval_DrawOp, 49 kDrawPaint_DrawOp, 50 kDrawPath_DrawOp, 51 kDrawPicture_DrawOp, 52 kDrawPoints_DrawOp, 53 kDrawPosText_DrawOp, 54 kDrawPosTextH_DrawOp, 55 kDrawRect_DrawOp, 56 kDrawRRect_DrawOp, 57 kDrawSprite_DrawOp, 58 kDrawText_DrawOp, 59 kDrawTextOnPath_DrawOp, 60 kDrawVertices_DrawOp, 61 kRestore_DrawOp, 62 kRotate_DrawOp, 63 kSave_DrawOp, 64 kSaveLayer_DrawOp, 65 kScale_DrawOp, 66 kSetMatrix_DrawOp, 67 kSkew_DrawOp, 68 kTranslate_DrawOp, 69 70 kPaintOp_DrawOp, 71 kSetTypeface_DrawOp, 72 73 kDef_Typeface_DrawOp, 74 kDef_Flattenable_DrawOp, 75 kDef_Bitmap_DrawOp, 76 kDef_Factory_DrawOp, 77 78 // these are signals to playback, not drawing verbs 79 kReportFlags_DrawOp, 80 kShareBitmapHeap_DrawOp, 81 kDone_DrawOp, 82 }; 83 84 /** 85 * DrawOp packs into a 32bit int as follows 86 * 87 * DrawOp:8 - Flags:4 - Data:20 88 * 89 * Flags and Data are called out separately, so we can reuse Data between 90 * different Ops that might have different Flags. e.g. Data might be a Paint 91 * index for both drawRect (no flags) and saveLayer (does have flags). 92 * 93 * All Ops that take a SkPaint use their Data field to store the index to 94 * the paint (previously defined with kPaintOp_DrawOp). 95 */ 96 97 #define DRAWOPS_OP_BITS 8 98 #define DRAWOPS_FLAG_BITS 4 99 #define DRAWOPS_DATA_BITS 20 100 101 #define DRAWOPS_OP_MASK ((1 << DRAWOPS_OP_BITS) - 1) 102 #define DRAWOPS_FLAG_MASK ((1 << DRAWOPS_FLAG_BITS) - 1) 103 #define DRAWOPS_DATA_MASK ((1 << DRAWOPS_DATA_BITS) - 1) 104 105 static inline unsigned DrawOp_unpackOp(uint32_t op32) { 106 return (op32 >> (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)); 107 } 108 109 static inline unsigned DrawOp_unpackFlags(uint32_t op32) { 110 return (op32 >> DRAWOPS_DATA_BITS) & DRAWOPS_FLAG_MASK; 111 } 112 113 static inline unsigned DrawOp_unpackData(uint32_t op32) { 114 return op32 & DRAWOPS_DATA_MASK; 115 } 116 117 static inline uint32_t DrawOp_packOpFlagData(DrawOps op, unsigned flags, unsigned data) { 118 SkASSERT(0 == (op & ~DRAWOPS_OP_MASK)); 119 SkASSERT(0 == (flags & ~DRAWOPS_FLAG_MASK)); 120 SkASSERT(0 == (data & ~DRAWOPS_DATA_MASK)); 121 122 return (op << (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)) | 123 (flags << DRAWOPS_DATA_BITS) | 124 data; 125 } 126 127 /** DrawOp specific flag bits 128 */ 129 130 enum { 131 kSaveLayer_HasBounds_DrawOpFlag = 1 << 0, 132 kSaveLayer_HasPaint_DrawOpFlag = 1 << 1, 133 }; 134 enum { 135 kClear_HasColor_DrawOpFlag = 1 << 0 136 }; 137 enum { 138 kDrawTextOnPath_HasMatrix_DrawOpFlag = 1 << 0 139 }; 140 enum { 141 kDrawVertices_HasTexs_DrawOpFlag = 1 << 0, 142 kDrawVertices_HasColors_DrawOpFlag = 1 << 1, 143 kDrawVertices_HasIndices_DrawOpFlag = 1 << 2, 144 }; 145 enum { 146 kDrawBitmap_HasPaint_DrawOpFlag = 1 << 0, 147 // Specific to drawBitmapRect, but needs to be different from HasPaint, 148 // which is used for all drawBitmap calls, so include it here. 149 kDrawBitmap_HasSrcRect_DrawOpFlag = 1 << 1, 150 }; 151 enum { 152 kClip_HasAntiAlias_DrawOpFlag = 1 << 0, 153 }; 154 /////////////////////////////////////////////////////////////////////////////// 155 156 class BitmapInfo : SkNoncopyable { 157 public: 158 BitmapInfo(SkBitmap* bitmap, uint32_t genID, int toBeDrawnCount) 159 : fBitmap(bitmap) 160 , fGenID(genID) 161 , fBytesAllocated(0) 162 , fMoreRecentlyUsed(NULL) 163 , fLessRecentlyUsed(NULL) 164 , fToBeDrawnCount(toBeDrawnCount) 165 {} 166 167 ~BitmapInfo() { 168 SkASSERT(0 == fToBeDrawnCount); 169 SkDELETE(fBitmap); 170 } 171 172 void addDraws(int drawsToAdd) { 173 if (0 == fToBeDrawnCount) { 174 // The readers will only ever decrement the count, so once the 175 // count is zero, the writer will be the only one modifying it, 176 // so it does not need to be an atomic operation. 177 fToBeDrawnCount = drawsToAdd; 178 } else { 179 sk_atomic_add(&fToBeDrawnCount, drawsToAdd); 180 } 181 } 182 183 void decDraws() { 184 sk_atomic_dec(&fToBeDrawnCount); 185 } 186 187 int drawCount() const { 188 return fToBeDrawnCount; 189 } 190 191 SkBitmap* fBitmap; 192 // Store the generation ID of the original bitmap, since copying does 193 // not copy this field, so fBitmap's generation ID will not be useful 194 // for comparing. 195 // FIXME: Is it reasonable to make copying a bitmap/pixelref copy the 196 // generation ID? 197 uint32_t fGenID; 198 // Keep track of the bytes allocated for this bitmap. When replacing the 199 // bitmap or removing this BitmapInfo we know how much memory has been 200 // reclaimed. 201 size_t fBytesAllocated; 202 // TODO: Generalize the LRU caching mechanism 203 BitmapInfo* fMoreRecentlyUsed; 204 BitmapInfo* fLessRecentlyUsed; 205 private: 206 int fToBeDrawnCount; 207 }; 208 209 static inline bool shouldFlattenBitmaps(uint32_t flags) { 210 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag 211 && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag)); 212 } 213 214 /////////////////////////////////////////////////////////////////////////////// 215 216 enum PaintOps { 217 kReset_PaintOp, // no arg 218 219 kFlags_PaintOp, // arg inline 220 kColor_PaintOp, // arg 32 221 kStyle_PaintOp, // arg inline 222 kJoin_PaintOp, // arg inline 223 kCap_PaintOp, // arg inline 224 kWidth_PaintOp, // arg scalar 225 kMiter_PaintOp,// arg scalar 226 227 kEncoding_PaintOp, // arg inline - text 228 kHinting_PaintOp, // arg inline - text 229 kAlign_PaintOp, // arg inline - text 230 kTextSize_PaintOp, // arg scalar - text 231 kTextScaleX_PaintOp,// arg scalar - text 232 kTextSkewX_PaintOp, // arg scalar - text 233 kTypeface_PaintOp, // arg inline (index) - text 234 235 kFlatIndex_PaintOp, // flags=paintflat, data=index 236 }; 237 238 #define PAINTOPS_OP_BITS 8 239 #define PAINTOPS_FLAG_BITS 4 240 #define PAINTOPS_DATA_BITS 20 241 242 #define PAINTOPS_OP_MASK ((1 << PAINTOPS_OP_BITS) - 1) 243 #define PAINTOPS_FLAG_MASK ((1 << PAINTOPS_FLAG_BITS) - 1) 244 #define PAINTOPS_DATA_MASK ((1 << PAINTOPS_DATA_BITS) - 1) 245 246 static inline unsigned PaintOp_unpackOp(uint32_t op32) { 247 return (op32 >> (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)); 248 } 249 250 static inline unsigned PaintOp_unpackFlags(uint32_t op32) { 251 return (op32 >> PAINTOPS_DATA_BITS) & PAINTOPS_FLAG_MASK; 252 } 253 254 static inline unsigned PaintOp_unpackData(uint32_t op32) { 255 return op32 & PAINTOPS_DATA_MASK; 256 } 257 258 static inline uint32_t PaintOp_packOp(PaintOps op) { 259 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 260 261 return op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS); 262 } 263 264 static inline uint32_t PaintOp_packOpData(PaintOps op, unsigned data) { 265 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 266 SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK)); 267 268 return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | data; 269 } 270 271 static inline uint32_t PaintOp_packOpFlagData(PaintOps op, unsigned flags, unsigned data) { 272 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 273 SkASSERT(0 == (flags & ~PAINTOPS_FLAG_MASK)); 274 SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK)); 275 276 return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | 277 (flags << PAINTOPS_DATA_BITS) | 278 data; 279 } 280 281 #endif 282