blob: f5f98f2bdf7ab6ee0b58d5ad3f6c9cf4b6cd6dd6 [file] [log] [blame]
epoger@google.comec3ed6a2011-07-28 14:26:00 +00001
reed@google.combb6992a2011-04-26 17:41:56 +00002/*
epoger@google.comec3ed6a2011-07-28 14:26:00 +00003 * 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.
reed@google.combb6992a2011-04-26 17:41:56 +00007 */
8
9
epoger@google.comec3ed6a2011-07-28 14:26:00 +000010
reed@google.combb6992a2011-04-26 17:41:56 +000011#ifndef SkGPipePriv_DEFINED
12#define SkGPipePriv_DEFINED
13
14#include "SkTypes.h"
15
16#define UNIMPLEMENTED
17
reed@google.comb55d1182011-05-11 00:42:04 +000018// these must be contiguous, 0...N-1
19enum PaintFlats {
20 kColorFilter_PaintFlat,
reed@google.com0faac1e2011-05-11 05:58:58 +000021 kDrawLooper_PaintFlat,
reed@google.comb55d1182011-05-11 00:42:04 +000022 kMaskFilter_PaintFlat,
23 kPathEffect_PaintFlat,
24 kRasterizer_PaintFlat,
25 kShader_PaintFlat,
scroggo@google.com16d1d0b2012-05-02 19:09:40 +000026 kImageFilter_PaintFlat,
reed@google.comb55d1182011-05-11 00:42:04 +000027 kXfermode_PaintFlat,
epoger@google.comb58772f2013-03-08 09:09:10 +000028 kAnnotation_PaintFlat,
reed@google.comb55d1182011-05-11 00:42:04 +000029
epoger@google.comb58772f2013-03-08 09:09:10 +000030 kLast_PaintFlat = kAnnotation_PaintFlat
reed@google.comb55d1182011-05-11 00:42:04 +000031};
32#define kCount_PaintFlats (kLast_PaintFlat + 1)
33
reed@google.combb6992a2011-04-26 17:41:56 +000034enum DrawOps {
reed@google.comacd471f2011-05-03 21:26:46 +000035 kSkip_DrawOp, // skip an addition N bytes (N == data)
36
reed@google.combb6992a2011-04-26 17:41:56 +000037 // these match Canvas apis
38 kClipPath_DrawOp,
39 kClipRegion_DrawOp,
40 kClipRect_DrawOp,
reed@google.com4ed0fb72012-12-12 20:48:18 +000041 kClipRRect_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000042 kConcat_DrawOp,
43 kDrawBitmap_DrawOp,
44 kDrawBitmapMatrix_DrawOp,
scroggo@google.com16d1d0b2012-05-02 19:09:40 +000045 kDrawBitmapNine_DrawOp,
reed@google.com71121732012-09-18 15:14:33 +000046 kDrawBitmapRectToRect_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000047 kDrawClear_DrawOp,
48 kDrawData_DrawOp,
reed@google.com4ed0fb72012-12-12 20:48:18 +000049 kDrawOval_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000050 kDrawPaint_DrawOp,
51 kDrawPath_DrawOp,
52 kDrawPicture_DrawOp,
53 kDrawPoints_DrawOp,
54 kDrawPosText_DrawOp,
55 kDrawPosTextH_DrawOp,
56 kDrawRect_DrawOp,
reed@google.com4ed0fb72012-12-12 20:48:18 +000057 kDrawRRect_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000058 kDrawSprite_DrawOp,
59 kDrawText_DrawOp,
60 kDrawTextOnPath_DrawOp,
61 kDrawVertices_DrawOp,
62 kRestore_DrawOp,
63 kRotate_DrawOp,
64 kSave_DrawOp,
65 kSaveLayer_DrawOp,
66 kScale_DrawOp,
67 kSetMatrix_DrawOp,
68 kSkew_DrawOp,
69 kTranslate_DrawOp,
70
reed@google.combb6992a2011-04-26 17:41:56 +000071 kPaintOp_DrawOp,
scroggo@google.com3cb969f2012-07-27 20:39:19 +000072 kSetTypeface_DrawOp,
reed@google.combb6793b2011-05-05 15:18:15 +000073
reed@google.combb6793b2011-05-05 15:18:15 +000074 kDef_Typeface_DrawOp,
reed@google.com0faac1e2011-05-11 05:58:58 +000075 kDef_Flattenable_DrawOp,
scroggo@google.com16d1d0b2012-05-02 19:09:40 +000076 kDef_Bitmap_DrawOp,
scroggo@google.com0c3e5fe2012-08-01 19:34:20 +000077 kDef_Factory_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000078
79 // these are signals to playback, not drawing verbs
scroggo@google.com565254b2012-06-28 15:41:32 +000080 kReportFlags_DrawOp,
scroggo@google.comd9d29672012-08-14 17:21:34 +000081 kShareBitmapHeap_DrawOp,
reed@google.combb6992a2011-04-26 17:41:56 +000082 kDone_DrawOp,
83};
84
85/**
86 * DrawOp packs into a 32bit int as follows
87 *
88 * DrawOp:8 - Flags:4 - Data:20
89 *
90 * Flags and Data are called out separately, so we can reuse Data between
91 * different Ops that might have different Flags. e.g. Data might be a Paint
92 * index for both drawRect (no flags) and saveLayer (does have flags).
93 *
94 * All Ops that take a SkPaint use their Data field to store the index to
95 * the paint (previously defined with kPaintOp_DrawOp).
96 */
97
98#define DRAWOPS_OP_BITS 8
99#define DRAWOPS_FLAG_BITS 4
100#define DRAWOPS_DATA_BITS 20
101
102#define DRAWOPS_OP_MASK ((1 << DRAWOPS_OP_BITS) - 1)
103#define DRAWOPS_FLAG_MASK ((1 << DRAWOPS_FLAG_BITS) - 1)
104#define DRAWOPS_DATA_MASK ((1 << DRAWOPS_DATA_BITS) - 1)
105
caryclark@google.com920901d2012-06-06 12:04:11 +0000106static inline unsigned DrawOp_unpackOp(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000107 return (op32 >> (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS));
108}
109
caryclark@google.com920901d2012-06-06 12:04:11 +0000110static inline unsigned DrawOp_unpackFlags(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000111 return (op32 >> DRAWOPS_DATA_BITS) & DRAWOPS_FLAG_MASK;
112}
113
caryclark@google.com920901d2012-06-06 12:04:11 +0000114static inline unsigned DrawOp_unpackData(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000115 return op32 & DRAWOPS_DATA_MASK;
116}
117
caryclark@google.com920901d2012-06-06 12:04:11 +0000118static inline uint32_t DrawOp_packOpFlagData(DrawOps op, unsigned flags, unsigned data) {
reed@google.combb6992a2011-04-26 17:41:56 +0000119 SkASSERT(0 == (op & ~DRAWOPS_OP_MASK));
120 SkASSERT(0 == (flags & ~DRAWOPS_FLAG_MASK));
121 SkASSERT(0 == (data & ~DRAWOPS_DATA_MASK));
122
reed@google.com67908f22011-06-27 14:47:50 +0000123 return (op << (DRAWOPS_FLAG_BITS + DRAWOPS_DATA_BITS)) |
reed@google.combb6992a2011-04-26 17:41:56 +0000124 (flags << DRAWOPS_DATA_BITS) |
125 data;
126}
127
128/** DrawOp specific flag bits
129 */
130
131enum {
132 kSaveLayer_HasBounds_DrawOpFlag = 1 << 0,
133 kSaveLayer_HasPaint_DrawOpFlag = 1 << 1,
134};
135enum {
136 kClear_HasColor_DrawOpFlag = 1 << 0
137};
138enum {
139 kDrawTextOnPath_HasMatrix_DrawOpFlag = 1 << 0
140};
141enum {
142 kDrawVertices_HasTexs_DrawOpFlag = 1 << 0,
143 kDrawVertices_HasColors_DrawOpFlag = 1 << 1,
144 kDrawVertices_HasIndices_DrawOpFlag = 1 << 2,
145};
scroggo@google.com58be6822012-07-30 14:40:01 +0000146enum {
scroggo@google.com460a23e2012-08-16 17:56:49 +0000147 kDrawBitmap_HasPaint_DrawOpFlag = 1 << 0,
scroggo@google.com58be6822012-07-30 14:40:01 +0000148 // Specific to drawBitmapRect, but needs to be different from HasPaint,
149 // which is used for all drawBitmap calls, so include it here.
scroggo@google.com460a23e2012-08-16 17:56:49 +0000150 kDrawBitmap_HasSrcRect_DrawOpFlag = 1 << 1,
scroggo@google.com58be6822012-07-30 14:40:01 +0000151};
scroggo@google.com460a23e2012-08-16 17:56:49 +0000152enum {
153 kClip_HasAntiAlias_DrawOpFlag = 1 << 0,
154};
reed@google.combb6992a2011-04-26 17:41:56 +0000155///////////////////////////////////////////////////////////////////////////////
156
scroggo@google.com284bf502012-07-17 16:10:34 +0000157class BitmapInfo : SkNoncopyable {
158public:
159 BitmapInfo(SkBitmap* bitmap, uint32_t genID, int toBeDrawnCount)
160 : fBitmap(bitmap)
161 , fGenID(genID)
scroggo@google.com15011ee2012-07-26 20:03:32 +0000162 , fBytesAllocated(0)
scroggo@google.com284bf502012-07-17 16:10:34 +0000163 , fMoreRecentlyUsed(NULL)
164 , fLessRecentlyUsed(NULL)
165 , fToBeDrawnCount(toBeDrawnCount)
166 {}
167
168 ~BitmapInfo() {
169 SkASSERT(0 == fToBeDrawnCount);
170 SkDELETE(fBitmap);
171 }
172
173 void addDraws(int drawsToAdd) {
174 if (0 == fToBeDrawnCount) {
175 // The readers will only ever decrement the count, so once the
176 // count is zero, the writer will be the only one modifying it,
177 // so it does not need to be an atomic operation.
178 fToBeDrawnCount = drawsToAdd;
179 } else {
180 sk_atomic_add(&fToBeDrawnCount, drawsToAdd);
181 }
182 }
183
184 void decDraws() {
185 sk_atomic_dec(&fToBeDrawnCount);
186 }
187
188 int drawCount() const {
189 return fToBeDrawnCount;
190 }
191
192 SkBitmap* fBitmap;
193 // Store the generation ID of the original bitmap, since copying does
194 // not copy this field, so fBitmap's generation ID will not be useful
195 // for comparing.
scroggo@google.com15011ee2012-07-26 20:03:32 +0000196 // FIXME: Is it reasonable to make copying a bitmap/pixelref copy the
197 // generation ID?
scroggo@google.com284bf502012-07-17 16:10:34 +0000198 uint32_t fGenID;
scroggo@google.com15011ee2012-07-26 20:03:32 +0000199 // Keep track of the bytes allocated for this bitmap. When replacing the
200 // bitmap or removing this BitmapInfo we know how much memory has been
201 // reclaimed.
202 size_t fBytesAllocated;
scroggo@google.com284bf502012-07-17 16:10:34 +0000203 // TODO: Generalize the LRU caching mechanism
204 BitmapInfo* fMoreRecentlyUsed;
205 BitmapInfo* fLessRecentlyUsed;
206private:
207 int fToBeDrawnCount;
208};
209
scroggo@google.com565254b2012-06-28 15:41:32 +0000210static inline bool shouldFlattenBitmaps(uint32_t flags) {
scroggo@google.com3cb969f2012-07-27 20:39:19 +0000211 return SkToBool(flags & SkGPipeWriter::kCrossProcess_Flag
212 && !(flags & SkGPipeWriter::kSharedAddressSpace_Flag));
scroggo@google.com565254b2012-06-28 15:41:32 +0000213}
214
215///////////////////////////////////////////////////////////////////////////////
216
reed@google.combb6992a2011-04-26 17:41:56 +0000217enum PaintOps {
218 kReset_PaintOp, // no arg
rmistry@google.comd6176b02012-08-23 18:14:13 +0000219
reed@google.combb6992a2011-04-26 17:41:56 +0000220 kFlags_PaintOp, // arg inline
221 kColor_PaintOp, // arg 32
222 kStyle_PaintOp, // arg inline
223 kJoin_PaintOp, // arg inline
224 kCap_PaintOp, // arg inline
225 kWidth_PaintOp, // arg scalar
226 kMiter_PaintOp,// arg scalar
rmistry@google.comd6176b02012-08-23 18:14:13 +0000227
reed@google.combb6992a2011-04-26 17:41:56 +0000228 kEncoding_PaintOp, // arg inline - text
229 kHinting_PaintOp, // arg inline - text
230 kAlign_PaintOp, // arg inline - text
231 kTextSize_PaintOp, // arg scalar - text
232 kTextScaleX_PaintOp,// arg scalar - text
233 kTextSkewX_PaintOp, // arg scalar - text
reed@google.comf5842f72011-05-04 18:30:04 +0000234 kTypeface_PaintOp, // arg inline (index) - text
235
reed@google.comb55d1182011-05-11 00:42:04 +0000236 kFlatIndex_PaintOp, // flags=paintflat, data=index
reed@google.combb6992a2011-04-26 17:41:56 +0000237};
238
239#define PAINTOPS_OP_BITS 8
240#define PAINTOPS_FLAG_BITS 4
241#define PAINTOPS_DATA_BITS 20
242
243#define PAINTOPS_OP_MASK ((1 << PAINTOPS_OP_BITS) - 1)
244#define PAINTOPS_FLAG_MASK ((1 << PAINTOPS_FLAG_BITS) - 1)
245#define PAINTOPS_DATA_MASK ((1 << PAINTOPS_DATA_BITS) - 1)
246
caryclark@google.com920901d2012-06-06 12:04:11 +0000247static inline unsigned PaintOp_unpackOp(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000248 return (op32 >> (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS));
249}
250
caryclark@google.com920901d2012-06-06 12:04:11 +0000251static inline unsigned PaintOp_unpackFlags(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000252 return (op32 >> PAINTOPS_DATA_BITS) & PAINTOPS_FLAG_MASK;
253}
254
caryclark@google.com920901d2012-06-06 12:04:11 +0000255static inline unsigned PaintOp_unpackData(uint32_t op32) {
reed@google.combb6992a2011-04-26 17:41:56 +0000256 return op32 & PAINTOPS_DATA_MASK;
257}
258
caryclark@google.com920901d2012-06-06 12:04:11 +0000259static inline uint32_t PaintOp_packOp(PaintOps op) {
reed@google.combb6992a2011-04-26 17:41:56 +0000260 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
rmistry@google.comd6176b02012-08-23 18:14:13 +0000261
reed@google.com67908f22011-06-27 14:47:50 +0000262 return op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS);
reed@google.combb6992a2011-04-26 17:41:56 +0000263}
264
caryclark@google.com920901d2012-06-06 12:04:11 +0000265static inline uint32_t PaintOp_packOpData(PaintOps op, unsigned data) {
reed@google.combb6992a2011-04-26 17:41:56 +0000266 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
267 SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
rmistry@google.comd6176b02012-08-23 18:14:13 +0000268
reed@google.com67908f22011-06-27 14:47:50 +0000269 return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) | data;
reed@google.combb6992a2011-04-26 17:41:56 +0000270}
271
caryclark@google.com920901d2012-06-06 12:04:11 +0000272static inline uint32_t PaintOp_packOpFlagData(PaintOps op, unsigned flags, unsigned data) {
reed@google.combb6992a2011-04-26 17:41:56 +0000273 SkASSERT(0 == (op & ~PAINTOPS_OP_MASK));
274 SkASSERT(0 == (flags & ~PAINTOPS_FLAG_MASK));
275 SkASSERT(0 == (data & ~PAINTOPS_DATA_MASK));
rmistry@google.comd6176b02012-08-23 18:14:13 +0000276
reed@google.com67908f22011-06-27 14:47:50 +0000277 return (op << (PAINTOPS_FLAG_BITS + PAINTOPS_DATA_BITS)) |
reed@google.combb6992a2011-04-26 17:41:56 +0000278 (flags << PAINTOPS_DATA_BITS) |
279 data;
280}
281
reed@google.combb6992a2011-04-26 17:41:56 +0000282#endif