OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2013 Google Inc. | 2 * Copyright 2013 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 "gm.h" | 8 #include "gm.h" |
9 #include "SkDebugCanvas.h" | 9 #include "SkDebugCanvas.h" |
10 #include "SkPictureFlat.h" | 10 #include "SkPictureFlat.h" |
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
72 postOptPattern->setCount(7); | 72 postOptPattern->setCount(7); |
73 (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw | 73 (*postOptPattern)[0] = SAVE; // extra save/restore added by extra draw |
74 (*postOptPattern)[1] = SAVE; | 74 (*postOptPattern)[1] = SAVE; |
75 (*postOptPattern)[2] = SAVE_LAYER; | 75 (*postOptPattern)[2] = SAVE_LAYER; |
76 (*postOptPattern)[3] = DRAW_BITMAP_RECT_TO_RECT; | 76 (*postOptPattern)[3] = DRAW_BITMAP_RECT_TO_RECT; |
77 (*postOptPattern)[4] = RESTORE; | 77 (*postOptPattern)[4] = RESTORE; |
78 (*postOptPattern)[5] = RESTORE; | 78 (*postOptPattern)[5] = RESTORE; |
79 (*postOptPattern)[6] = RESTORE; | 79 (*postOptPattern)[6] = RESTORE; |
80 } | 80 } |
81 | 81 |
82 SkPicture* result = new SkPicture; | 82 SkPictureRecorder recorder; |
83 | 83 |
| 84 SkCanvas* canvas = recorder.beginRecording(100, 100); |
84 // have to disable the optimizations while generating the picture | 85 // have to disable the optimizations while generating the picture |
85 SkCanvas* canvas = result->beginRecording(100, 100); | 86 recorder.internalOnly_EnableOpts(false); |
86 result->internalOnly_EnableOpts(false); | |
87 | 87 |
88 SkPaint saveLayerPaint; | 88 SkPaint saveLayerPaint; |
89 saveLayerPaint.setColor(0xCC000000); | 89 saveLayerPaint.setColor(0xCC000000); |
90 | 90 |
91 // saveLayer's 'bounds' parameter must be NULL for this optimization | 91 // saveLayer's 'bounds' parameter must be NULL for this optimization |
92 if (saveLayerHasPaint) { | 92 if (saveLayerHasPaint) { |
93 canvas->saveLayer(NULL, &saveLayerPaint); | 93 canvas->saveLayer(NULL, &saveLayerPaint); |
94 } else { | 94 } else { |
95 canvas->saveLayer(NULL, NULL); | 95 canvas->saveLayer(NULL, NULL); |
96 } | 96 } |
97 | 97 |
98 SkRect rect = { 10, 10, 90, 90 }; | 98 SkRect rect = { 10, 10, 90, 90 }; |
99 | 99 |
100 // The dbmr2r's paint must be opaque | 100 // The dbmr2r's paint must be opaque |
101 SkPaint dbmr2rPaint; | 101 SkPaint dbmr2rPaint; |
102 if (colorsMatch) { | 102 if (colorsMatch) { |
103 dbmr2rPaint.setColor(0xFF000000); | 103 dbmr2rPaint.setColor(0xFF000000); |
104 } else { | 104 } else { |
105 dbmr2rPaint.setColor(0xFFFF0000); | 105 dbmr2rPaint.setColor(0xFFFF0000); |
106 } | 106 } |
107 | 107 |
108 if (dbmr2rHasPaint) { | 108 if (dbmr2rHasPaint) { |
109 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); | 109 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); |
110 } else { | 110 } else { |
111 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); | 111 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); |
112 } | 112 } |
113 canvas->restore(); | 113 canvas->restore(); |
114 | 114 |
115 result->endRecording(); | 115 return recorder.endRecording(); |
116 | |
117 return result; | |
118 } | 116 } |
119 | 117 |
120 // straight-ahead version that is seen in the skps | 118 // straight-ahead version that is seen in the skps |
121 static SkPicture* create_save_layer_opt_1_v1(SkTDArray<DrawType>* preOptPattern, | 119 static SkPicture* create_save_layer_opt_1_v1(SkTDArray<DrawType>* preOptPattern, |
122 SkTDArray<DrawType>* postOptPattern
, | 120 SkTDArray<DrawType>* postOptPattern
, |
123 const SkBitmap& checkerBoard) { | 121 const SkBitmap& checkerBoard) { |
124 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, | 122 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
125 true, // saveLayer has a paint | 123 true, // saveLayer has a paint |
126 true, // dbmr2r has a paint | 124 true, // dbmr2r has a paint |
127 true); // and the colors match | 125 true); // and the colors match |
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 (*postOptPattern)[2] = SAVE_LAYER; | 206 (*postOptPattern)[2] = SAVE_LAYER; |
209 (*postOptPattern)[3] = SAVE; | 207 (*postOptPattern)[3] = SAVE; |
210 (*postOptPattern)[4] = CLIP_RECT; | 208 (*postOptPattern)[4] = CLIP_RECT; |
211 (*postOptPattern)[5] = DRAW_BITMAP_RECT_TO_RECT; | 209 (*postOptPattern)[5] = DRAW_BITMAP_RECT_TO_RECT; |
212 (*postOptPattern)[6] = RESTORE; | 210 (*postOptPattern)[6] = RESTORE; |
213 (*postOptPattern)[7] = RESTORE; | 211 (*postOptPattern)[7] = RESTORE; |
214 (*postOptPattern)[8] = RESTORE; | 212 (*postOptPattern)[8] = RESTORE; |
215 (*postOptPattern)[9] = RESTORE; | 213 (*postOptPattern)[9] = RESTORE; |
216 } | 214 } |
217 | 215 |
218 SkPicture* result = new SkPicture; | 216 SkPictureRecorder recorder; |
219 | 217 |
| 218 SkCanvas* canvas = recorder.beginRecording(100, 100); |
220 // have to disable the optimizations while generating the picture | 219 // have to disable the optimizations while generating the picture |
221 SkCanvas* canvas = result->beginRecording(100, 100); | 220 recorder.internalOnly_EnableOpts(false); |
222 result->internalOnly_EnableOpts(false); | |
223 | 221 |
224 SkPaint saveLayerPaint; | 222 SkPaint saveLayerPaint; |
225 saveLayerPaint.setColor(0xCC000000); | 223 saveLayerPaint.setColor(0xCC000000); |
226 | 224 |
227 // saveLayer's 'bounds' parameter must be NULL for this optimization | 225 // saveLayer's 'bounds' parameter must be NULL for this optimization |
228 if (saveLayerHasPaint) { | 226 if (saveLayerHasPaint) { |
229 canvas->saveLayer(NULL, &saveLayerPaint); | 227 canvas->saveLayer(NULL, &saveLayerPaint); |
230 } else { | 228 } else { |
231 canvas->saveLayer(NULL, NULL); | 229 canvas->saveLayer(NULL, NULL); |
232 } | 230 } |
(...skipping 12 matching lines...) Expand all Loading... |
245 } | 243 } |
246 | 244 |
247 if (dbmr2rHasPaint) { | 245 if (dbmr2rHasPaint) { |
248 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); | 246 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, &dbmr2rPaint); |
249 } else { | 247 } else { |
250 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); | 248 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); |
251 } | 249 } |
252 canvas->restore(); | 250 canvas->restore(); |
253 canvas->restore(); | 251 canvas->restore(); |
254 | 252 |
255 result->endRecording(); | 253 return recorder.endRecording(); |
256 | |
257 return result; | |
258 } | 254 } |
259 | 255 |
260 // straight-ahead version that is seen in the skps | 256 // straight-ahead version that is seen in the skps |
261 static SkPicture* create_save_layer_opt_2_v1(SkTDArray<DrawType>* preOptPattern, | 257 static SkPicture* create_save_layer_opt_2_v1(SkTDArray<DrawType>* preOptPattern, |
262 SkTDArray<DrawType>* postOptPattern
, | 258 SkTDArray<DrawType>* postOptPattern
, |
263 const SkBitmap& checkerBoard) { | 259 const SkBitmap& checkerBoard) { |
264 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, | 260 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
265 true, // saveLayer has a paint | 261 true, // saveLayer has a paint |
266 true, // dbmr2r has a paint | 262 true, // dbmr2r has a paint |
267 true); // and the colors match | 263 true); // and the colors match |
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
353 SkASSERT(0); | 349 SkASSERT(0); |
354 } | 350 } |
355 | 351 |
356 canvas->save(); | 352 canvas->save(); |
357 canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); | 353 canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); |
358 pre->draw(canvas); | 354 pre->draw(canvas); |
359 xPos += pre->width(); | 355 xPos += pre->width(); |
360 canvas->restore(); | 356 canvas->restore(); |
361 | 357 |
362 // re-render the 'pre' picture and thus 'apply' the optimization | 358 // re-render the 'pre' picture and thus 'apply' the optimization |
363 SkAutoTUnref<SkPicture> post(new SkPicture); | 359 SkPictureRecorder recorder; |
364 | 360 |
365 SkCanvas* recordCanvas = post->beginRecording(pre->width(), pre->hei
ght()); | 361 SkCanvas* recordCanvas = recorder.beginRecording(pre->width(), pre->
height()); |
366 | 362 |
367 pre->draw(recordCanvas); | 363 pre->draw(recordCanvas); |
368 | 364 |
369 post->endRecording(); | 365 SkAutoTUnref<SkPicture> post(recorder.endRecording()); |
370 | 366 |
371 if (!(check_pattern(*post, postPattern))) { | 367 if (!(check_pattern(*post, postPattern))) { |
372 WARN("Post optimization pattern mismatch"); | 368 WARN("Post optimization pattern mismatch"); |
373 SkASSERT(0); | 369 SkASSERT(0); |
374 } | 370 } |
375 | 371 |
376 canvas->save(); | 372 canvas->save(); |
377 canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); | 373 canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); |
378 post->draw(canvas); | 374 post->draw(canvas); |
379 xPos += post->width(); | 375 xPos += post->width(); |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
411 } | 407 } |
412 | 408 |
413 SkBitmap fCheckerboard; | 409 SkBitmap fCheckerboard; |
414 | 410 |
415 typedef skiagm::GM INHERITED; | 411 typedef skiagm::GM INHERITED; |
416 }; | 412 }; |
417 | 413 |
418 ////////////////////////////////////////////////////////////////////////////// | 414 ////////////////////////////////////////////////////////////////////////////// |
419 | 415 |
420 DEF_GM( return new OptimizationsGM; ) | 416 DEF_GM( return new OptimizationsGM; ) |
OLD | NEW |