1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/skia/trunk/src/pipe/SkGPipePriv.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,287 @@ 1.4 + 1.5 +/* 1.6 + * Copyright 2011 Google Inc. 1.7 + * 1.8 + * Use of this source code is governed by a BSD-style license that can be 1.9 + * found in the LICENSE file. 1.10 + */ 1.11 + 1.12 + 1.13 + 1.14 +#ifndef SkGPipePriv_DEFINED 1.15 +#define SkGPipePriv_DEFINED 1.16 + 1.17 +#include "SkTypes.h" 1.18 + 1.19 +#define UNIMPLEMENTED 1.20 + 1.21 +// these must be contiguous, 0...N-1 1.22 +enum PaintFlats { 1.23 + kColorFilter_PaintFlat, 1.24 + kDrawLooper_PaintFlat, 1.25 + kImageFilter_PaintFlat, 1.26 + kMaskFilter_PaintFlat, 1.27 + kPathEffect_PaintFlat, 1.28 + kRasterizer_PaintFlat, 1.29 + kShader_PaintFlat, 1.30 + kXfermode_PaintFlat, 1.31 + 1.32 + kLast_PaintFlat = kXfermode_PaintFlat 1.33 +}; 1.34 +#define kCount_PaintFlats (kLast_PaintFlat + 1) 1.35 + 1.36 +enum DrawOps { 1.37 + kSkip_DrawOp, // skip an addition N bytes (N == data) 1.38 + 1.39 + // these match Canvas apis 1.40 + kClipPath_DrawOp, 1.41 + kClipRegion_DrawOp, 1.42 + kClipRect_DrawOp, 1.43 + kClipRRect_DrawOp, 1.44 + kConcat_DrawOp, 1.45 + kDrawBitmap_DrawOp, 1.46 + kDrawBitmapMatrix_DrawOp, 1.47 + kDrawBitmapNine_DrawOp, 1.48 + kDrawBitmapRectToRect_DrawOp, 1.49 + kDrawClear_DrawOp, 1.50 + kDrawData_DrawOp, 1.51 + kDrawDRRect_DrawOp, 1.52 + kDrawOval_DrawOp, 1.53 + kDrawPaint_DrawOp, 1.54 + kDrawPath_DrawOp, 1.55 + kDrawPicture_DrawOp, 1.56 + kDrawPoints_DrawOp, 1.57 + kDrawPosText_DrawOp, 1.58 + kDrawPosTextH_DrawOp, 1.59 + kDrawRect_DrawOp, 1.60 + kDrawRRect_DrawOp, 1.61 + kDrawSprite_DrawOp, 1.62 + kDrawText_DrawOp, 1.63 + kDrawTextOnPath_DrawOp, 1.64 + kDrawVertices_DrawOp, 1.65 + kRestore_DrawOp, 1.66 + kRotate_DrawOp, 1.67 + kSave_DrawOp, 1.68 + kSaveLayer_DrawOp, 1.69 + kScale_DrawOp, 1.70 + kSetMatrix_DrawOp, 1.71 + kSkew_DrawOp, 1.72 + kTranslate_DrawOp, 1.73 + 1.74 + kPaintOp_DrawOp, 1.75 + kSetTypeface_DrawOp, 1.76 + kSetAnnotation_DrawOp, 1.77 + 1.78 + kDef_Typeface_DrawOp, 1.79 + kDef_Flattenable_DrawOp, 1.80 + kDef_Bitmap_DrawOp, 1.81 + kDef_Factory_DrawOp, 1.82 + 1.83 + // these are signals to playback, not drawing verbs 1.84 + kReportFlags_DrawOp, 1.85 + kShareBitmapHeap_DrawOp, 1.86 + kDone_DrawOp, 1.87 +}; 1.88 + 1.89 +/** 1.90 + * DrawOp packs into a 32bit int as follows 1.91 + * 1.92 + * DrawOp:8 - Flags:4 - Data:20 1.93 + * 1.94 + * Flags and Data are called out separately, so we can reuse Data between 1.95 + * different Ops that might have different Flags. e.g. Data might be a Paint 1.96 + * index for both drawRect (no flags) and saveLayer (does have flags). 1.97 + * 1.98 + * All Ops that take a SkPaint use their Data field to store the index to 1.99 + * the paint (previously defined with kPaintOp_DrawOp). 1.100 + */ 1.101 + 1.102 +#define DRAWOPS_OP_BITS 8 1.103 +#define DRAWOPS_FLAG_BITS 4 1.104 +#define DRAWOPS_DATA_BITS 20 1.105 + 1.106 +#define DRAWOPS_OP_MASK ((1 << DRAWOPS_OP_BITS) - 1) 1.107 +#define DRAWOPS_FLAG_MASK ((1 << DRAWOPS_FLAG_BITS) - 1) 1.108 +#define DRAWOPS_DATA_MASK ((1 << DRAWOPS_DATA_BITS) - 1) 1.109 + 1.110 +static inline unsigned DrawOp_unpackOp(uint32_t op32) { 1.111 + return (op32 >> (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)); 1.112 +} 1.113 + 1.114 +static inline unsigned DrawOp_unpackFlags(uint32_t op32) { 1.115 + return (op32 >> DRAWOPS_DATA_BITS) & DRAWOPS_FLAG_MASK; 1.116 +} 1.117 + 1.118 +static inline unsigned DrawOp_unpackData(uint32_t op32) { 1.119 + return op32 & DRAWOPS_DATA_MASK; 1.120 +} 1.121 + 1.122 +static inline uint32_t DrawOp_packOpFlagData(DrawOps op, unsigned flags, unsigned data) { 1.123 + SkASSERT(0 == (op & ~DRAWOPS_OP_MASK)); 1.124 + SkASSERT(0 == (flags & ~DRAWOPS_FLAG_MASK)); 1.125 + SkASSERT(0 == (data & ~DRAWOPS_DATA_MASK)); 1.126 + 1.127 + return (op << (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)) | 1.128 + (flags << DRAWOPS_DATA_BITS) | 1.129 + data; 1.130 +} 1.131 + 1.132 +/** DrawOp specific flag bits 1.133 + */ 1.134 + 1.135 +enum { 1.136 + kSaveLayer_HasBounds_DrawOpFlag = 1 << 0, 1.137 + kSaveLayer_HasPaint_DrawOpFlag = 1 << 1, 1.138 +}; 1.139 +enum { 1.140 + kClear_HasColor_DrawOpFlag = 1 << 0 1.141 +}; 1.142 +enum { 1.143 + kDrawTextOnPath_HasMatrix_DrawOpFlag = 1 << 0 1.144 +}; 1.145 +enum { 1.146 + kDrawVertices_HasTexs_DrawOpFlag = 1 << 0, 1.147 + kDrawVertices_HasColors_DrawOpFlag = 1 << 1, 1.148 + kDrawVertices_HasIndices_DrawOpFlag = 1 << 2, 1.149 + kDrawVertices_HasXfermode_DrawOpFlag = 1 << 3, 1.150 +}; 1.151 +enum { 1.152 + kDrawBitmap_HasPaint_DrawOpFlag = 1 << 0, 1.153 + // Specific to drawBitmapRect, but needs to be different from HasPaint, 1.154 + // which is used for all drawBitmap calls, so include it here. 1.155 + kDrawBitmap_HasSrcRect_DrawOpFlag = 1 << 1, 1.156 + // SkCanvas::DrawBitmapRectFlags::kBleed_DrawBitmapRectFlag is 1.157 + // converted into and out of this flag to save space 1.158 + kDrawBitmap_Bleed_DrawOpFlag = 1 << 2, 1.159 +}; 1.160 +enum { 1.161 + kClip_HasAntiAlias_DrawOpFlag = 1 << 0, 1.162 +}; 1.163 +/////////////////////////////////////////////////////////////////////////////// 1.164 + 1.165 +class BitmapInfo : SkNoncopyable { 1.166 +public: 1.167 + BitmapInfo(SkBitmap* bitmap, uint32_t genID, int toBeDrawnCount) 1.168 + : fBitmap(bitmap) 1.169 + , fGenID(genID) 1.170 + , fBytesAllocated(0) 1.171 + , fMoreRecentlyUsed(NULL) 1.172 + , fLessRecentlyUsed(NULL) 1.173 + , fToBeDrawnCount(toBeDrawnCount) 1.174 + {} 1.175 + 1.176 + ~BitmapInfo() { 1.177 + SkASSERT(0 == fToBeDrawnCount); 1.178 + SkDELETE(fBitmap); 1.179 + } 1.180 + 1.181 + void addDraws(int drawsToAdd) { 1.182 + if (0 == fToBeDrawnCount) { 1.183 + // The readers will only ever decrement the count, so once the 1.184 + // count is zero, the writer will be the only one modifying it, 1.185 + // so it does not need to be an atomic operation. 1.186 + fToBeDrawnCount = drawsToAdd; 1.187 + } else { 1.188 + sk_atomic_add(&fToBeDrawnCount, drawsToAdd); 1.189 + } 1.190 + } 1.191 + 1.192 + void decDraws() { 1.193 + sk_atomic_dec(&fToBeDrawnCount); 1.194 + } 1.195 + 1.196 + int drawCount() const { 1.197 + return fToBeDrawnCount; 1.198 + } 1.199 + 1.200 + SkBitmap* fBitmap; 1.201 + // Store the generation ID of the original bitmap, since copying does 1.202 + // not copy this field, so fBitmap's generation ID will not be useful 1.203 + // for comparing. 1.204 + // FIXME: Is it reasonable to make copying a bitmap/pixelref copy the 1.205 + // generation ID? 1.206 + uint32_t fGenID; 1.207 + // Keep track of the bytes allocated for this bitmap. When replacing the 1.208 + // bitmap or removing this BitmapInfo we know how much memory has been 1.209 + // reclaimed. 1.210 + size_t fBytesAllocated; 1.211 + // TODO: Generalize the LRU caching mechanism 1.212 + BitmapInfo* fMoreRecentlyUsed; 1.213 + BitmapInfo* fLessRecentlyUsed; 1.214 +private: 1.215 + int fToBeDrawnCount; 1.216 +}; 1.217 + 1.218 +static inline bool shouldFlattenBitmaps(uint32_t flags) { 1.219 + return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag 1.220 + && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag)); 1.221 +} 1.222 + 1.223 +/////////////////////////////////////////////////////////////////////////////// 1.224 + 1.225 +enum PaintOps { 1.226 + kReset_PaintOp, // no arg 1.227 + 1.228 + kFlags_PaintOp, // arg inline 1.229 + kColor_PaintOp, // arg 32 1.230 + kStyle_PaintOp, // arg inline 1.231 + kJoin_PaintOp, // arg inline 1.232 + kCap_PaintOp, // arg inline 1.233 + kWidth_PaintOp, // arg scalar 1.234 + kMiter_PaintOp, // arg scalar 1.235 + 1.236 + kEncoding_PaintOp, // arg inline - text 1.237 + kHinting_PaintOp, // arg inline - text 1.238 + kAlign_PaintOp, // arg inline - text 1.239 + kTextSize_PaintOp, // arg scalar - text 1.240 + kTextScaleX_PaintOp,// arg scalar - text 1.241 + kTextSkewX_PaintOp, // arg scalar - text 1.242 + kTypeface_PaintOp, // arg inline (index) - text 1.243 + 1.244 + kFlatIndex_PaintOp, // flags=paintflat, data=index 1.245 +}; 1.246 + 1.247 +#define PAINTOPS_OP_BITS 8 1.248 +#define PAINTOPS_FLAG_BITS 4 1.249 +#define PAINTOPS_DATA_BITS 20 1.250 + 1.251 +#define PAINTOPS_OP_MASK ((1 << PAINTOPS_OP_BITS) - 1) 1.252 +#define PAINTOPS_FLAG_MASK ((1 << PAINTOPS_FLAG_BITS) - 1) 1.253 +#define PAINTOPS_DATA_MASK ((1 << PAINTOPS_DATA_BITS) - 1) 1.254 + 1.255 +static inline unsigned PaintOp_unpackOp(uint32_t op32) { 1.256 + return (op32 >> (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)); 1.257 +} 1.258 + 1.259 +static inline unsigned PaintOp_unpackFlags(uint32_t op32) { 1.260 + return (op32 >> PAINTOPS_DATA_BITS) & PAINTOPS_FLAG_MASK; 1.261 +} 1.262 + 1.263 +static inline unsigned PaintOp_unpackData(uint32_t op32) { 1.264 + return op32 & PAINTOPS_DATA_MASK; 1.265 +} 1.266 + 1.267 +static inline uint32_t PaintOp_packOp(PaintOps op) { 1.268 + SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 1.269 + 1.270 + return op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS); 1.271 +} 1.272 + 1.273 +static inline uint32_t PaintOp_packOpData(PaintOps op, unsigned data) { 1.274 + SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 1.275 + SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK)); 1.276 + 1.277 + return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | data; 1.278 +} 1.279 + 1.280 +static inline uint32_t PaintOp_packOpFlagData(PaintOps op, unsigned flags, unsigned data) { 1.281 + SkASSERT(0 == (op & ~PAINTOPS_OP_MASK)); 1.282 + SkASSERT(0 == (flags & ~PAINTOPS_FLAG_MASK)); 1.283 + SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK)); 1.284 + 1.285 + return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | 1.286 + (flags << PAINTOPS_DATA_BITS) | 1.287 + data; 1.288 +} 1.289 + 1.290 +#endif