OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2012 Google Inc. | 2 * Copyright 2012 Google Inc. |
3 * | 3 * |
4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
6 */ | 6 */ |
7 | 7 |
8 #include "SkDebugCanvas.h" | 8 #include "SkDebugCanvas.h" |
9 #include "SkDevice.h" | 9 #include "SkDevice.h" |
10 #include "SkForceLinking.h" | 10 #include "SkForceLinking.h" |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 // RESTORE | 50 // RESTORE |
51 // where the saveLayer's color can be moved into the drawBitmapRect | 51 // where the saveLayer's color can be moved into the drawBitmapRect |
52 static bool check_0(SkDebugCanvas* canvas, int curCommand) { | 52 static bool check_0(SkDebugCanvas* canvas, int curCommand) { |
53 if (SAVE_LAYER != canvas->getDrawCommandAt(curCommand)->getType() || | 53 if (SAVE_LAYER != canvas->getDrawCommandAt(curCommand)->getType() || |
54 canvas->getSize() <= curCommand+2 || | 54 canvas->getSize() <= curCommand+2 || |
55 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+1)->getT
ype() || | 55 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+1)->getT
ype() || |
56 RESTORE != canvas->getDrawCommandAt(curCommand+2)->getType()) { | 56 RESTORE != canvas->getDrawCommandAt(curCommand+2)->getType()) { |
57 return false; | 57 return false; |
58 } | 58 } |
59 | 59 |
60 SaveLayer* saveLayer = (SaveLayer*) canvas->getDrawCommandAt(curCommand); | 60 SkSaveLayerCommand* saveLayer = |
61 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+1); | 61 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); |
| 62 SkDrawBitmapRectCommand* dbmr = |
| 63 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
62 | 64 |
63 const SkPaint* saveLayerPaint = saveLayer->paint(); | 65 const SkPaint* saveLayerPaint = saveLayer->paint(); |
64 SkPaint* dbmrPaint = dbmr->paint(); | 66 SkPaint* dbmrPaint = dbmr->paint(); |
65 | 67 |
66 // For this optimization we only fold the saveLayer and drawBitmapRect | 68 // For this optimization we only fold the saveLayer and drawBitmapRect |
67 // together if the saveLayer's draw is simple (i.e., no fancy effects) | 69 // together if the saveLayer's draw is simple (i.e., no fancy effects) |
68 // and the only difference in the colors is their alpha value | 70 // and the only difference in the colors is their alpha value |
69 SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaqu
e | 71 SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaqu
e |
70 SkColor dbmrColor = dbmrPaint->getColor() | 0xFF000000; // force opaqu
e | 72 SkColor dbmrColor = dbmrPaint->getColor() | 0xFF000000; // force opaqu
e |
71 | 73 |
72 // If either operation lacks a paint then the collapse is trivial | 74 // If either operation lacks a paint then the collapse is trivial |
73 return NULL == saveLayerPaint || | 75 return NULL == saveLayerPaint || |
74 NULL == dbmrPaint || | 76 NULL == dbmrPaint || |
75 (is_simple(*saveLayerPaint) && dbmrColor == layerColor); | 77 (is_simple(*saveLayerPaint) && dbmrColor == layerColor); |
76 } | 78 } |
77 | 79 |
78 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer | 80 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer |
79 // and restore | 81 // and restore |
80 static void apply_0(SkDebugCanvas* canvas, int curCommand) { | 82 static void apply_0(SkDebugCanvas* canvas, int curCommand) { |
81 SaveLayer* saveLayer = (SaveLayer*) canvas->getDrawCommandAt(curCommand); | 83 SkSaveLayerCommand* saveLayer = |
| 84 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); |
82 const SkPaint* saveLayerPaint = saveLayer->paint(); | 85 const SkPaint* saveLayerPaint = saveLayer->paint(); |
83 | 86 |
84 // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed | 87 // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed |
85 if (NULL != saveLayerPaint) { | 88 if (NULL != saveLayerPaint) { |
86 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCom
mand+1); | 89 SkDrawBitmapRectCommand* dbmr = |
| 90 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
87 SkPaint* dbmrPaint = dbmr->paint(); | 91 SkPaint* dbmrPaint = dbmr->paint(); |
88 | 92 |
89 if (NULL == dbmrPaint) { | 93 if (NULL == dbmrPaint) { |
90 // if the DBMR doesn't have a paint just use the saveLayer's | 94 // if the DBMR doesn't have a paint just use the saveLayer's |
91 dbmr->setPaint(*saveLayerPaint); | 95 dbmr->setPaint(*saveLayerPaint); |
92 } else if (NULL != saveLayerPaint) { | 96 } else if (NULL != saveLayerPaint) { |
93 // Both paints are present so their alphas need to be combined | 97 // Both paints are present so their alphas need to be combined |
94 SkColor color = saveLayerPaint->getColor(); | 98 SkColor color = saveLayerPaint->getColor(); |
95 int a0 = SkColorGetA(color); | 99 int a0 = SkColorGetA(color); |
96 | 100 |
(...skipping 24 matching lines...) Expand all Loading... |
121 if (SAVE_LAYER != canvas->getDrawCommandAt(curCommand)->getType() || | 125 if (SAVE_LAYER != canvas->getDrawCommandAt(curCommand)->getType() || |
122 canvas->getSize() <= curCommand+5 || | 126 canvas->getSize() <= curCommand+5 || |
123 SAVE != canvas->getDrawCommandAt(curCommand+1)->getType() || | 127 SAVE != canvas->getDrawCommandAt(curCommand+1)->getType() || |
124 CLIP_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || | 128 CLIP_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || |
125 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+3)->getT
ype() || | 129 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+3)->getT
ype() || |
126 RESTORE != canvas->getDrawCommandAt(curCommand+4)->getType() || | 130 RESTORE != canvas->getDrawCommandAt(curCommand+4)->getType() || |
127 RESTORE != canvas->getDrawCommandAt(curCommand+5)->getType()) { | 131 RESTORE != canvas->getDrawCommandAt(curCommand+5)->getType()) { |
128 return false; | 132 return false; |
129 } | 133 } |
130 | 134 |
131 SaveLayer* saveLayer = (SaveLayer*) canvas->getDrawCommandAt(curCommand); | 135 SkSaveLayerCommand* saveLayer = |
132 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+3); | 136 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); |
| 137 SkDrawBitmapRectCommand* dbmr = |
| 138 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+3); |
133 | 139 |
134 const SkPaint* saveLayerPaint = saveLayer->paint(); | 140 const SkPaint* saveLayerPaint = saveLayer->paint(); |
135 SkPaint* dbmrPaint = dbmr->paint(); | 141 SkPaint* dbmrPaint = dbmr->paint(); |
136 | 142 |
137 // For this optimization we only fold the saveLayer and drawBitmapRect | 143 // For this optimization we only fold the saveLayer and drawBitmapRect |
138 // together if the saveLayer's draw is simple (i.e., no fancy effects) and | 144 // together if the saveLayer's draw is simple (i.e., no fancy effects) and |
139 // and the only difference in the colors is that the saveLayer's can have | 145 // and the only difference in the colors is that the saveLayer's can have |
140 // an alpha while the drawBitmapRect's is opaque. | 146 // an alpha while the drawBitmapRect's is opaque. |
141 // TODO: it should be possible to fold them together even if they both | 147 // TODO: it should be possible to fold them together even if they both |
142 // have different non-255 alphas but this is low priority since we have | 148 // have different non-255 alphas but this is low priority since we have |
143 // never seen that case | 149 // never seen that case |
144 // If either operation lacks a paint then the collapse is trivial | 150 // If either operation lacks a paint then the collapse is trivial |
145 SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaqu
e | 151 SkColor layerColor = saveLayerPaint->getColor() | 0xFF000000; // force opaqu
e |
146 | 152 |
147 return NULL == saveLayerPaint || | 153 return NULL == saveLayerPaint || |
148 NULL == dbmrPaint || | 154 NULL == dbmrPaint || |
149 (is_simple(*saveLayerPaint) && dbmrPaint->getColor() == layerColor); | 155 (is_simple(*saveLayerPaint) && dbmrPaint->getColor() == layerColor); |
150 } | 156 } |
151 | 157 |
152 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer | 158 // Fold the saveLayer's alpha into the drawBitmapRect and remove the saveLayer |
153 // and restore | 159 // and restore |
154 static void apply_1(SkDebugCanvas* canvas, int curCommand) { | 160 static void apply_1(SkDebugCanvas* canvas, int curCommand) { |
155 SaveLayer* saveLayer = (SaveLayer*) canvas->getDrawCommandAt(curCommand); | 161 SkSaveLayerCommand* saveLayer = |
| 162 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand); |
156 const SkPaint* saveLayerPaint = saveLayer->paint(); | 163 const SkPaint* saveLayerPaint = saveLayer->paint(); |
157 | 164 |
158 // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed | 165 // if (NULL == saveLayerPaint) the dbmr's paint doesn't need to be changed |
159 if (NULL != saveLayerPaint) { | 166 if (NULL != saveLayerPaint) { |
160 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCom
mand+3); | 167 SkDrawBitmapRectCommand* dbmr = |
| 168 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+3); |
161 SkPaint* dbmrPaint = dbmr->paint(); | 169 SkPaint* dbmrPaint = dbmr->paint(); |
162 | 170 |
163 if (NULL == dbmrPaint) { | 171 if (NULL == dbmrPaint) { |
164 dbmr->setPaint(*saveLayerPaint); | 172 dbmr->setPaint(*saveLayerPaint); |
165 } else { | 173 } else { |
166 SkColor newColor = SkColorSetA(dbmrPaint->getColor(), | 174 SkColor newColor = SkColorSetA(dbmrPaint->getColor(), |
167 SkColorGetA(saveLayerPaint->getColor(
))); | 175 SkColorGetA(saveLayerPaint->getColor(
))); |
168 dbmrPaint->setColor(newColor); | 176 dbmrPaint->setColor(newColor); |
169 } | 177 } |
170 } | 178 } |
(...skipping 10 matching lines...) Expand all Loading... |
181 // where the rect is entirely within the clip and the clip is an intersect | 189 // where the rect is entirely within the clip and the clip is an intersect |
182 static bool check_2(SkDebugCanvas* canvas, int curCommand) { | 190 static bool check_2(SkDebugCanvas* canvas, int curCommand) { |
183 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || | 191 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
184 canvas->getSize() <= curCommand+4 || | 192 canvas->getSize() <= curCommand+4 || |
185 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || | 193 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
186 DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || | 194 DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || |
187 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { | 195 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
188 return false; | 196 return false; |
189 } | 197 } |
190 | 198 |
191 ClipRect* cr = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 199 SkClipRectCommand* cr = |
192 DrawRectC* dr = (DrawRectC*) canvas->getDrawCommandAt(curCommand+2); | 200 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 201 SkDrawRectCommand* dr = |
| 202 (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
193 | 203 |
194 if (SkRegion::kIntersect_Op != cr->op()) { | 204 if (SkRegion::kIntersect_Op != cr->op()) { |
195 return false; | 205 return false; |
196 } | 206 } |
197 | 207 |
198 return cr->rect().contains(dr->rect()); | 208 return cr->rect().contains(dr->rect()); |
199 } | 209 } |
200 | 210 |
201 // Remove everything but the drawRect | 211 // Remove everything but the drawRect |
202 static void apply_2(SkDebugCanvas* canvas, int curCommand) { | 212 static void apply_2(SkDebugCanvas* canvas, int curCommand) { |
(...skipping 11 matching lines...) Expand all Loading... |
214 // where the rect entirely encloses the clip | 224 // where the rect entirely encloses the clip |
215 static bool check_3(SkDebugCanvas* canvas, int curCommand) { | 225 static bool check_3(SkDebugCanvas* canvas, int curCommand) { |
216 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || | 226 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
217 canvas->getSize() <= curCommand+4 || | 227 canvas->getSize() <= curCommand+4 || |
218 CLIP_RRECT != canvas->getDrawCommandAt(curCommand+1)->getType() || | 228 CLIP_RRECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
219 DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || | 229 DRAW_RECT != canvas->getDrawCommandAt(curCommand+2)->getType() || |
220 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { | 230 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
221 return false; | 231 return false; |
222 } | 232 } |
223 | 233 |
224 ClipRRect* crr = (ClipRRect*) canvas->getDrawCommandAt(curCommand+1); | 234 SkClipRRectCommand* crr = |
225 DrawRectC* dr = (DrawRectC*) canvas->getDrawCommandAt(curCommand+2); | 235 (SkClipRRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 236 SkDrawRectCommand* dr = |
| 237 (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
226 | 238 |
227 if (SkRegion::kIntersect_Op != crr->op()) { | 239 if (SkRegion::kIntersect_Op != crr->op()) { |
228 return false; | 240 return false; |
229 } | 241 } |
230 | 242 |
231 return dr->rect().contains(crr->rrect().rect()); | 243 return dr->rect().contains(crr->rrect().rect()); |
232 } | 244 } |
233 | 245 |
234 // Replace everything with a drawRRect with the paint from the drawRect | 246 // Replace everything with a drawRRect with the paint from the drawRect |
235 // and the AA settings from the clipRRect | 247 // and the AA settings from the clipRRect |
236 static void apply_3(SkDebugCanvas* canvas, int curCommand) { | 248 static void apply_3(SkDebugCanvas* canvas, int curCommand) { |
237 | 249 |
238 canvas->deleteDrawCommandAt(curCommand+3); // restore | 250 canvas->deleteDrawCommandAt(curCommand+3); // restore |
239 | 251 |
240 ClipRRect* crr = (ClipRRect*) canvas->getDrawCommandAt(curCommand+1); | 252 SkClipRRectCommand* crr = |
241 DrawRectC* dr = (DrawRectC*) canvas->getDrawCommandAt(curCommand+2); | 253 (SkClipRRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 254 SkDrawRectCommand* dr = |
| 255 (SkDrawRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
242 | 256 |
243 // TODO: could skip paint re-creation if the AA settings already match | 257 // TODO: could skip paint re-creation if the AA settings already match |
244 SkPaint newPaint = dr->paint(); | 258 SkPaint newPaint = dr->paint(); |
245 newPaint.setAntiAlias(crr->doAA()); | 259 newPaint.setAntiAlias(crr->doAA()); |
246 DrawRRect* drr = new DrawRRect(crr->rrect(), newPaint); | 260 SkDrawRRectCommand* drr = new SkDrawRRectCommand(crr->rrect(), newPaint); |
247 canvas->setDrawCommandAt(curCommand+2, drr); | 261 canvas->setDrawCommandAt(curCommand+2, drr); |
248 | 262 |
249 canvas->deleteDrawCommandAt(curCommand+1); // clipRRect | 263 canvas->deleteDrawCommandAt(curCommand+1); // clipRRect |
250 canvas->deleteDrawCommandAt(curCommand); // save | 264 canvas->deleteDrawCommandAt(curCommand); // save |
251 } | 265 } |
252 | 266 |
253 // Check for: | 267 // Check for: |
254 // SAVE | 268 // SAVE |
255 // CLIP_RECT | 269 // CLIP_RECT |
256 // DRAW_BITMAP_RECT_TO_RECT | 270 // DRAW_BITMAP_RECT_TO_RECT |
257 // RESTORE | 271 // RESTORE |
258 // where the rect and drawBitmapRect dst exactly match | 272 // where the rect and drawBitmapRect dst exactly match |
259 static bool check_4(SkDebugCanvas* canvas, int curCommand) { | 273 static bool check_4(SkDebugCanvas* canvas, int curCommand) { |
260 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || | 274 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
261 canvas->getSize() <= curCommand+4 || | 275 canvas->getSize() <= curCommand+4 || |
262 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || | 276 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
263 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || | 277 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || |
264 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { | 278 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
265 return false; | 279 return false; |
266 } | 280 } |
267 | 281 |
268 ClipRect* cr = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 282 SkClipRectCommand* cr = |
269 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curComman
d+2); | 283 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 284 SkDrawBitmapRectCommand* dbmr = |
| 285 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
270 | 286 |
271 if (SkRegion::kIntersect_Op != cr->op()) { | 287 if (SkRegion::kIntersect_Op != cr->op()) { |
272 return false; | 288 return false; |
273 } | 289 } |
274 | 290 |
275 return dbmr->dstRect() == cr->rect(); | 291 return dbmr->dstRect() == cr->rect(); |
276 } | 292 } |
277 | 293 |
278 // Remove everything but the drawBitmapRect | 294 // Remove everything but the drawBitmapRect |
279 static void apply_4(SkDebugCanvas* canvas, int curCommand) { | 295 static void apply_4(SkDebugCanvas* canvas, int curCommand) { |
280 canvas->deleteDrawCommandAt(curCommand+3); // restore | 296 canvas->deleteDrawCommandAt(curCommand+3); // restore |
281 // drawBitmapRectToRect | 297 // drawBitmapRectToRect |
282 canvas->deleteDrawCommandAt(curCommand+1); // clipRect | 298 canvas->deleteDrawCommandAt(curCommand+1); // clipRect |
283 canvas->deleteDrawCommandAt(curCommand); // save | 299 canvas->deleteDrawCommandAt(curCommand); // save |
284 } | 300 } |
285 | 301 |
286 // Check for: | 302 // Check for: |
287 // TRANSLATE | 303 // TRANSLATE |
288 // where the translate is zero | 304 // where the translate is zero |
289 static bool check_5(SkDebugCanvas* canvas, int curCommand) { | 305 static bool check_5(SkDebugCanvas* canvas, int curCommand) { |
290 if (TRANSLATE != canvas->getDrawCommandAt(curCommand)->getType()) { | 306 if (TRANSLATE != canvas->getDrawCommandAt(curCommand)->getType()) { |
291 return false; | 307 return false; |
292 } | 308 } |
293 | 309 |
294 Translate* t = (Translate*) canvas->getDrawCommandAt(curCommand); | 310 SkTranslateCommand* t = |
| 311 (SkTranslateCommand*) canvas->getDrawCommandAt(curCommand); |
295 | 312 |
296 return 0 == t->x() && 0 == t->y(); | 313 return 0 == t->x() && 0 == t->y(); |
297 } | 314 } |
298 | 315 |
299 // Just remove the translate | 316 // Just remove the translate |
300 static void apply_5(SkDebugCanvas* canvas, int curCommand) { | 317 static void apply_5(SkDebugCanvas* canvas, int curCommand) { |
301 canvas->deleteDrawCommandAt(curCommand); // translate | 318 canvas->deleteDrawCommandAt(curCommand); // translate |
302 } | 319 } |
303 | 320 |
304 // Check for: | 321 // Check for: |
305 // SCALE | 322 // SCALE |
306 // where the scale is 1,1 | 323 // where the scale is 1,1 |
307 static bool check_6(SkDebugCanvas* canvas, int curCommand) { | 324 static bool check_6(SkDebugCanvas* canvas, int curCommand) { |
308 if (SCALE != canvas->getDrawCommandAt(curCommand)->getType()) { | 325 if (SCALE != canvas->getDrawCommandAt(curCommand)->getType()) { |
309 return false; | 326 return false; |
310 } | 327 } |
311 | 328 |
312 Scale* s = (Scale*) canvas->getDrawCommandAt(curCommand); | 329 SkScaleCommand* s = (SkScaleCommand*) canvas->getDrawCommandAt(curCommand); |
313 | 330 |
314 return SK_Scalar1 == s->x() && SK_Scalar1 == s->y(); | 331 return SK_Scalar1 == s->x() && SK_Scalar1 == s->y(); |
315 } | 332 } |
316 | 333 |
317 // Just remove the scale | 334 // Just remove the scale |
318 static void apply_6(SkDebugCanvas* canvas, int curCommand) { | 335 static void apply_6(SkDebugCanvas* canvas, int curCommand) { |
319 canvas->deleteDrawCommandAt(curCommand); // scale | 336 canvas->deleteDrawCommandAt(curCommand); // scale |
320 } | 337 } |
321 | 338 |
322 // Check for: | 339 // Check for: |
(...skipping 29 matching lines...) Expand all Loading... |
352 CLIP_RECT != canvas->getDrawCommandAt(curCommand+7)->getType() || | 369 CLIP_RECT != canvas->getDrawCommandAt(curCommand+7)->getType() || |
353 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+8)->getT
ype() || | 370 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+8)->getT
ype() || |
354 RESTORE != canvas->getDrawCommandAt(curCommand+9)->getType() || | 371 RESTORE != canvas->getDrawCommandAt(curCommand+9)->getType() || |
355 RESTORE != canvas->getDrawCommandAt(curCommand+10)->getType() || | 372 RESTORE != canvas->getDrawCommandAt(curCommand+10)->getType() || |
356 RESTORE != canvas->getDrawCommandAt(curCommand+11)->getType() || | 373 RESTORE != canvas->getDrawCommandAt(curCommand+11)->getType() || |
357 RESTORE != canvas->getDrawCommandAt(curCommand+12)->getType() || | 374 RESTORE != canvas->getDrawCommandAt(curCommand+12)->getType() || |
358 RESTORE != canvas->getDrawCommandAt(curCommand+13)->getType()) { | 375 RESTORE != canvas->getDrawCommandAt(curCommand+13)->getType()) { |
359 return false; | 376 return false; |
360 } | 377 } |
361 | 378 |
362 ClipRect* clip0 = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 379 SkClipRectCommand* clip0 = |
363 SaveLayer* saveLayer0 = (SaveLayer*) canvas->getDrawCommandAt(curCommand+2); | 380 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
364 ClipRect* clip1 = (ClipRect*) canvas->getDrawCommandAt(curCommand+4); | 381 SkSaveLayerCommand* saveLayer0 = |
365 SaveLayer* saveLayer1 = (SaveLayer*) canvas->getDrawCommandAt(curCommand+5); | 382 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+2); |
366 ClipRect* clip2 = (ClipRect*) canvas->getDrawCommandAt(curCommand+7); | 383 SkClipRectCommand* clip1 = |
367 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+8); | 384 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+4); |
| 385 SkSaveLayerCommand* saveLayer1 = |
| 386 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+5); |
| 387 SkClipRectCommand* clip2 = |
| 388 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+7); |
| 389 SkDrawBitmapRectCommand* dbmr = |
| 390 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+8); |
368 | 391 |
369 if (clip0->doAA() || clip1->doAA() || clip2->doAA()) { | 392 if (clip0->doAA() || clip1->doAA() || clip2->doAA()) { |
370 return false; | 393 return false; |
371 } | 394 } |
372 | 395 |
373 if (SkRegion::kIntersect_Op != clip0->op() || | 396 if (SkRegion::kIntersect_Op != clip0->op() || |
374 SkRegion::kIntersect_Op != clip1->op() || | 397 SkRegion::kIntersect_Op != clip1->op() || |
375 SkRegion::kIntersect_Op != clip2->op()) { | 398 SkRegion::kIntersect_Op != clip2->op()) { |
376 return false; | 399 return false; |
377 } | 400 } |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
426 } | 449 } |
427 } | 450 } |
428 | 451 |
429 return true; | 452 return true; |
430 } | 453 } |
431 | 454 |
432 // Reduce to a single drawBitmapRectToRect call by folding the clipRect's into | 455 // Reduce to a single drawBitmapRectToRect call by folding the clipRect's into |
433 // the src and dst Rects and the saveLayer paints into the drawBitmapRectToRect'
s | 456 // the src and dst Rects and the saveLayer paints into the drawBitmapRectToRect'
s |
434 // paint. | 457 // paint. |
435 static void apply_7(SkDebugCanvas* canvas, int curCommand) { | 458 static void apply_7(SkDebugCanvas* canvas, int curCommand) { |
436 SaveLayer* saveLayer0 = (SaveLayer*) canvas->getDrawCommandAt(curCommand+2); | 459 SkSaveLayerCommand* saveLayer0 = |
437 SaveLayer* saveLayer1 = (SaveLayer*) canvas->getDrawCommandAt(curCommand+5); | 460 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+2); |
438 ClipRect* clip2 = (ClipRect*) canvas->getDrawCommandAt(curCommand+7); | 461 SkSaveLayerCommand* saveLayer1 = |
439 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+8); | 462 (SkSaveLayerCommand*) canvas->getDrawCommandAt(curCommand+5); |
| 463 SkClipRectCommand* clip2 = |
| 464 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+7); |
| 465 SkDrawBitmapRectCommand* dbmr = |
| 466 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+8); |
440 | 467 |
441 SkScalar newSrcLeft = dbmr->srcRect()->fLeft + clip2->rect().fLeft - dbmr->d
stRect().fLeft; | 468 SkScalar newSrcLeft = dbmr->srcRect()->fLeft + clip2->rect().fLeft - dbmr->d
stRect().fLeft; |
442 SkScalar newSrcTop = dbmr->srcRect()->fTop + clip2->rect().fTop - dbmr->dstR
ect().fTop; | 469 SkScalar newSrcTop = dbmr->srcRect()->fTop + clip2->rect().fTop - dbmr->dstR
ect().fTop; |
443 | 470 |
444 SkRect newSrc = SkRect::MakeXYWH(newSrcLeft, newSrcTop, | 471 SkRect newSrc = SkRect::MakeXYWH(newSrcLeft, newSrcTop, |
445 clip2->rect().width(), clip2->rect().height
()); | 472 clip2->rect().width(), clip2->rect().height
()); |
446 | 473 |
447 dbmr->setSrcRect(newSrc); | 474 dbmr->setSrcRect(newSrc); |
448 dbmr->setDstRect(clip2->rect()); | 475 dbmr->setDstRect(clip2->rect()); |
449 | 476 |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
508 // the clip rect is BW and a subset of the drawBitmapRectToRect's dest rect | 535 // the clip rect is BW and a subset of the drawBitmapRectToRect's dest rect |
509 static bool check_8(SkDebugCanvas* canvas, int curCommand) { | 536 static bool check_8(SkDebugCanvas* canvas, int curCommand) { |
510 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || | 537 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
511 canvas->getSize() <= curCommand+4 || | 538 canvas->getSize() <= curCommand+4 || |
512 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || | 539 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
513 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || | 540 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || |
514 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { | 541 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
515 return false; | 542 return false; |
516 } | 543 } |
517 | 544 |
518 ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 545 SkClipRectCommand* clip = |
519 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+2); | 546 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 547 SkDrawBitmapRectCommand* dbmr = |
| 548 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
520 | 549 |
521 if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { | 550 if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { |
522 return false; | 551 return false; |
523 } | 552 } |
524 | 553 |
525 // The src->dest mapping needs to be 1-to-1 | 554 // The src->dest mapping needs to be 1-to-1 |
526 if (NULL == dbmr->srcRect()) { | 555 if (NULL == dbmr->srcRect()) { |
527 if (dbmr->bitmap().width() != dbmr->dstRect().width() || | 556 if (dbmr->bitmap().width() != dbmr->dstRect().width() || |
528 dbmr->bitmap().height() != dbmr->dstRect().height()) { | 557 dbmr->bitmap().height() != dbmr->dstRect().height()) { |
529 return false; | 558 return false; |
530 } | 559 } |
531 } else { | 560 } else { |
532 if (dbmr->srcRect()->width() != dbmr->dstRect().width() || | 561 if (dbmr->srcRect()->width() != dbmr->dstRect().width() || |
533 dbmr->srcRect()->height() != dbmr->dstRect().height()) { | 562 dbmr->srcRect()->height() != dbmr->dstRect().height()) { |
534 return false; | 563 return false; |
535 } | 564 } |
536 } | 565 } |
537 | 566 |
538 if (!dbmr->dstRect().contains(clip->rect())) { | 567 if (!dbmr->dstRect().contains(clip->rect())) { |
539 return false; | 568 return false; |
540 } | 569 } |
541 | 570 |
542 return true; | 571 return true; |
543 } | 572 } |
544 | 573 |
545 // Fold the clipRect into the drawBitmapRectToRect's src and dest rects | 574 // Fold the clipRect into the drawBitmapRectToRect's src and dest rects |
546 static void apply_8(SkDebugCanvas* canvas, int curCommand) { | 575 static void apply_8(SkDebugCanvas* canvas, int curCommand) { |
547 ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 576 SkClipRectCommand* clip = |
548 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+2); | 577 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 578 SkDrawBitmapRectCommand* dbmr = |
| 579 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
549 | 580 |
550 SkScalar newSrcLeft, newSrcTop; | 581 SkScalar newSrcLeft, newSrcTop; |
551 | 582 |
552 if (NULL != dbmr->srcRect()) { | 583 if (NULL != dbmr->srcRect()) { |
553 newSrcLeft = dbmr->srcRect()->fLeft + clip->rect().fLeft - dbmr->dstRect
().fLeft; | 584 newSrcLeft = dbmr->srcRect()->fLeft + clip->rect().fLeft - dbmr->dstRect
().fLeft; |
554 newSrcTop = dbmr->srcRect()->fTop + clip->rect().fTop - dbmr->dstRect()
.fTop; | 585 newSrcTop = dbmr->srcRect()->fTop + clip->rect().fTop - dbmr->dstRect()
.fTop; |
555 } else { | 586 } else { |
556 newSrcLeft = clip->rect().fLeft - dbmr->dstRect().fLeft; | 587 newSrcLeft = clip->rect().fLeft - dbmr->dstRect().fLeft; |
557 newSrcTop = clip->rect().fTop - dbmr->dstRect().fTop; | 588 newSrcTop = clip->rect().fTop - dbmr->dstRect().fTop; |
558 } | 589 } |
(...skipping 19 matching lines...) Expand all Loading... |
578 // clipRect is BW and encloses the DBMR2R's dest rect | 609 // clipRect is BW and encloses the DBMR2R's dest rect |
579 static bool check_9(SkDebugCanvas* canvas, int curCommand) { | 610 static bool check_9(SkDebugCanvas* canvas, int curCommand) { |
580 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || | 611 if (SAVE != canvas->getDrawCommandAt(curCommand)->getType() || |
581 canvas->getSize() <= curCommand+4 || | 612 canvas->getSize() <= curCommand+4 || |
582 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || | 613 CLIP_RECT != canvas->getDrawCommandAt(curCommand+1)->getType() || |
583 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || | 614 DRAW_BITMAP_RECT_TO_RECT != canvas->getDrawCommandAt(curCommand+2)->getT
ype() || |
584 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { | 615 RESTORE != canvas->getDrawCommandAt(curCommand+3)->getType()) { |
585 return false; | 616 return false; |
586 } | 617 } |
587 | 618 |
588 ClipRect* clip = (ClipRect*) canvas->getDrawCommandAt(curCommand+1); | 619 SkClipRectCommand* clip = |
589 DrawBitmapRect* dbmr = (DrawBitmapRect*) canvas->getDrawCommandAt(curCommand
+2); | 620 (SkClipRectCommand*) canvas->getDrawCommandAt(curCommand+1); |
| 621 SkDrawBitmapRectCommand* dbmr = |
| 622 (SkDrawBitmapRectCommand*) canvas->getDrawCommandAt(curCommand+2); |
590 | 623 |
591 if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { | 624 if (clip->doAA() || SkRegion::kIntersect_Op != clip->op()) { |
592 return false; | 625 return false; |
593 } | 626 } |
594 | 627 |
595 if (!clip->rect().contains(dbmr->dstRect())) { | 628 if (!clip->rect().contains(dbmr->dstRect())) { |
596 return false; | 629 return false; |
597 } | 630 } |
598 | 631 |
599 return true; | 632 return true; |
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
806 | 839 |
807 SkGraphics::Term(); | 840 SkGraphics::Term(); |
808 return 0; | 841 return 0; |
809 } | 842 } |
810 | 843 |
811 #if !defined SK_BUILD_FOR_IOS | 844 #if !defined SK_BUILD_FOR_IOS |
812 int main(int argc, char * const argv[]) { | 845 int main(int argc, char * const argv[]) { |
813 return tool_main(argc, (char**) argv); | 846 return tool_main(argc, (char**) argv); |
814 } | 847 } |
815 #endif | 848 #endif |
OLD | NEW |