| 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" |
| 11 | 11 |
| 12 #define WARN(msg) \ | 12 #define WARN(msg) \ |
| 13 SkDebugf("%s:%d: %s\n", __FILE__, __LINE__, msg); | 13 SkDebugf("%s:%d: %s\n", __FILE__, __LINE__, msg); |
| 14 | 14 |
| 15 namespace { | |
| 16 | |
| 17 // Do the commands in 'input' match the supplied pattern? Note: this is a pretty | 15 // Do the commands in 'input' match the supplied pattern? Note: this is a pretty |
| 18 // heavy-weight operation since we are drawing the picture into a debug canvas | 16 // heavy-weight operation since we are drawing the picture into a debug canvas |
| 19 // to extract the commands. | 17 // to extract the commands. |
| 20 bool check_pattern(SkPicture& input, const SkTDArray<DrawType> &pattern) { | 18 static bool check_pattern(SkPicture& input, const SkTDArray<DrawType> &pattern)
{ |
| 21 SkDebugCanvas debugCanvas(input.width(), input.height()); | 19 SkDebugCanvas debugCanvas(input.width(), input.height()); |
| 22 debugCanvas.setBounds(input.width(), input.height()); | 20 debugCanvas.setBounds(input.width(), input.height()); |
| 23 input.draw(&debugCanvas); | 21 input.draw(&debugCanvas); |
| 24 | 22 |
| 25 if (pattern.count() != debugCanvas.getSize()) { | 23 if (pattern.count() != debugCanvas.getSize()) { |
| 26 return false; | 24 return false; |
| 27 } | 25 } |
| 28 | 26 |
| 29 for (int i = 0; i < pattern.count(); ++i) { | 27 for (int i = 0; i < pattern.count(); ++i) { |
| 30 if (pattern[i] != debugCanvas.getDrawCommandAt(i)->getType()) { | 28 if (pattern[i] != debugCanvas.getDrawCommandAt(i)->getType()) { |
| 31 return false; | 29 return false; |
| 32 } | 30 } |
| 33 } | 31 } |
| 34 | 32 |
| 35 return true; | 33 return true; |
| 36 } | 34 } |
| 37 | 35 |
| 38 // construct the pattern removed by the SkPictureRecord::remove_save_layer1 | 36 // construct the pattern removed by the SkPictureRecord::remove_save_layer1 |
| 39 // optimization, i.e.: | 37 // optimization, i.e.: |
| 40 // SAVE_LAYER | 38 // SAVE_LAYER |
| 41 // DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_REC
T | 39 // DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_REC
T |
| 42 // RESTORE | 40 // RESTORE |
| 43 // | 41 // |
| 44 // saveLayerHasPaint - control if the saveLayer has a paint (the optimization | 42 // saveLayerHasPaint - control if the saveLayer has a paint (the optimization |
| 45 // takes a different path if this is false) | 43 // takes a different path if this is false) |
| 46 // dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization | 44 // dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization |
| 47 // takes a different path if this is false) | 45 // takes a different path if this is false) |
| 48 // colorsMatch - control if the saveLayer and dbmr2r paint colors | 46 // colorsMatch - control if the saveLayer and dbmr2r paint colors |
| 49 // match (the optimization will fail if they do not) | 47 // match (the optimization will fail if they do not) |
| 50 SkPicture* create_save_layer_opt_1(SkTDArray<DrawType> *preOptPattern, | 48 static SkPicture* create_save_layer_opt_1(SkTDArray<DrawType>* preOptPattern, |
| 51 SkTDArray<DrawType> *postOptPattern, | 49 SkTDArray<DrawType>* postOptPattern, |
| 52 const SkBitmap& checkerBoard, | 50 const SkBitmap& checkerBoard, |
| 53 bool saveLayerHasPaint, | 51 bool saveLayerHasPaint, |
| 54 bool dbmr2rHasPaint, | 52 bool dbmr2rHasPaint, |
| 55 bool colorsMatch) { | 53 bool colorsMatch) { |
| 56 // Create the pattern that should trigger the optimization | 54 // Create the pattern that should trigger the optimization |
| 57 preOptPattern->setCount(5); | 55 preOptPattern->setCount(5); |
| 58 (*preOptPattern)[0] = SAVE; | 56 (*preOptPattern)[0] = SAVE; |
| 59 (*preOptPattern)[1] = SAVE_LAYER; | 57 (*preOptPattern)[1] = SAVE_LAYER; |
| 60 (*preOptPattern)[2] = DRAW_BITMAP_RECT_TO_RECT; | 58 (*preOptPattern)[2] = DRAW_BITMAP_RECT_TO_RECT; |
| 61 (*preOptPattern)[3] = RESTORE; | 59 (*preOptPattern)[3] = RESTORE; |
| 62 (*preOptPattern)[4] = RESTORE; | 60 (*preOptPattern)[4] = RESTORE; |
| 63 | 61 |
| 64 if (colorsMatch) { | 62 if (colorsMatch) { |
| 65 // Create the pattern that should appear after the optimization | 63 // Create the pattern that should appear after the optimization |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 113 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); | 111 canvas->drawBitmapRectToRect(checkerBoard, NULL, rect, NULL); |
| 114 } | 112 } |
| 115 canvas->restore(); | 113 canvas->restore(); |
| 116 | 114 |
| 117 result->endRecording(); | 115 result->endRecording(); |
| 118 | 116 |
| 119 return result; | 117 return result; |
| 120 } | 118 } |
| 121 | 119 |
| 122 // straight-ahead version that is seen in the skps | 120 // straight-ahead version that is seen in the skps |
| 123 SkPicture* create_save_layer_opt_1_v1(SkTDArray<DrawType> *preOptPattern, | 121 static SkPicture* create_save_layer_opt_1_v1(SkTDArray<DrawType>* preOptPattern, |
| 124 SkTDArray<DrawType> *postOptPattern, | 122 SkTDArray<DrawType>* postOptPattern
, |
| 125 const SkBitmap& checkerBoard) { | 123 const SkBitmap& checkerBoard) { |
| 126 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, | 124 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
| 127 true, // saveLayer has a paint | 125 true, // saveLayer has a paint |
| 128 true, // dbmr2r has a paint | 126 true, // dbmr2r has a paint |
| 129 true); // and the colors match | 127 true); // and the colors match |
| 130 } | 128 } |
| 131 | 129 |
| 132 // alternate version that should still succeed | 130 // alternate version that should still succeed |
| 133 SkPicture* create_save_layer_opt_1_v2(SkTDArray<DrawType> *preOptPattern, | 131 static SkPicture* create_save_layer_opt_1_v2(SkTDArray<DrawType>* preOptPattern, |
| 134 SkTDArray<DrawType> *postOptPattern, | 132 SkTDArray<DrawType>* postOptPattern
, |
| 135 const SkBitmap& checkerBoard) { | 133 const SkBitmap& checkerBoard) { |
| 136 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, | 134 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
| 137 false, // saveLayer doesn't have a paint! | 135 false, // saveLayer doesn't have a paint! |
| 138 true, // dbmr2r has a paint | 136 true, // dbmr2r has a paint |
| 139 true); // color matching not really applicab
le | 137 true); // color matching not really applicab
le |
| 140 } | 138 } |
| 141 | 139 |
| 142 // alternate version that should still succeed | 140 // alternate version that should still succeed |
| 143 SkPicture* create_save_layer_opt_1_v3(SkTDArray<DrawType> *preOptPattern, | 141 static SkPicture* create_save_layer_opt_1_v3(SkTDArray<DrawType>* preOptPattern, |
| 144 SkTDArray<DrawType> *postOptPattern, | 142 SkTDArray<DrawType>* postOptPattern
, |
| 145 const SkBitmap& checkerBoard) { | 143 const SkBitmap& checkerBoard) { |
| 146 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, | 144 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
| 147 true, // saveLayer has a paint | 145 true, // saveLayer has a paint |
| 148 false, // dbmr2r doesn't have a paint! | 146 false, // dbmr2r doesn't have a paint! |
| 149 true); // color matching not really applicab
le | 147 true); // color matching not really applicab
le |
| 150 } | 148 } |
| 151 | 149 |
| 152 // version in which the optimization fails b.c. the colors don't match | 150 // version in which the optimization fails b.c. the colors don't match |
| 153 SkPicture* create_save_layer_opt_1_v4(SkTDArray<DrawType> *preOptPattern, | 151 static SkPicture* create_save_layer_opt_1_v4(SkTDArray<DrawType>* preOptPattern, |
| 154 SkTDArray<DrawType> *postOptPattern, | 152 SkTDArray<DrawType>* postOptPattern
, |
| 155 const SkBitmap& checkerBoard) { | 153 const SkBitmap& checkerBoard) { |
| 156 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, | 154 return create_save_layer_opt_1(preOptPattern, postOptPattern, checkerBoard, |
| 157 true, // saveLayer has a paint | 155 true, // saveLayer has a paint |
| 158 true, // dbmr2r has a paint | 156 true, // dbmr2r has a paint |
| 159 false); // and the colors don't match! | 157 false); // and the colors don't match! |
| 160 } | 158 } |
| 161 | 159 |
| 162 // construct the pattern removed by the SkPictureRecord::remove_save_layer2 | 160 // construct the pattern removed by the SkPictureRecord::remove_save_layer2 |
| 163 // optimization, i.e.: | 161 // optimization, i.e.: |
| 164 // SAVE_LAYER (with NULL == bounds) | 162 // SAVE_LAYER (with NULL == bounds) |
| 165 // SAVE | 163 // SAVE |
| 166 // CLIP_RECT | 164 // CLIP_RECT |
| 167 // DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_R
ECT | 165 // DRAW_BITMAP|DRAW_BITMAP_MATRIX|DRAW_BITMAP_NINE|DRAW_BITMAP_RECT_TO_R
ECT |
| 168 // RESTORE | 166 // RESTORE |
| 169 // RESTORE | 167 // RESTORE |
| 170 // | 168 // |
| 171 // saveLayerHasPaint - control if the saveLayer has a paint (the optimization | 169 // saveLayerHasPaint - control if the saveLayer has a paint (the optimization |
| 172 // takes a different path if this is false) | 170 // takes a different path if this is false) |
| 173 // dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization | 171 // dbmr2rHasPaint - control if the dbmr2r has a paint (the optimization |
| 174 // takes a different path if this is false) | 172 // takes a different path if this is false) |
| 175 // colorsMatch - control if the saveLayer and dbmr2r paint colors | 173 // colorsMatch - control if the saveLayer and dbmr2r paint colors |
| 176 // match (the optimization will fail if they do not) | 174 // match (the optimization will fail if they do not) |
| 177 SkPicture* create_save_layer_opt_2(SkTDArray<DrawType> *preOptPattern, | 175 static SkPicture* create_save_layer_opt_2(SkTDArray<DrawType>* preOptPattern, |
| 178 SkTDArray<DrawType> *postOptPattern, | 176 SkTDArray<DrawType>* postOptPattern, |
| 179 const SkBitmap& checkerBoard, | 177 const SkBitmap& checkerBoard, |
| 180 bool saveLayerHasPaint, | 178 bool saveLayerHasPaint, |
| 181 bool dbmr2rHasPaint, | 179 bool dbmr2rHasPaint, |
| 182 bool colorsMatch) { | 180 bool colorsMatch) { |
| 183 // Create the pattern that should trigger the optimization | 181 // Create the pattern that should trigger the optimization |
| 184 preOptPattern->setCount(8); | 182 preOptPattern->setCount(8); |
| 185 (*preOptPattern)[0] = SAVE; | 183 (*preOptPattern)[0] = SAVE; |
| 186 (*preOptPattern)[1] = SAVE_LAYER; | 184 (*preOptPattern)[1] = SAVE_LAYER; |
| 187 (*preOptPattern)[2] = SAVE; | 185 (*preOptPattern)[2] = SAVE; |
| 188 (*preOptPattern)[3] = CLIP_RECT; | 186 (*preOptPattern)[3] = CLIP_RECT; |
| 189 (*preOptPattern)[4] = DRAW_BITMAP_RECT_TO_RECT; | 187 (*preOptPattern)[4] = DRAW_BITMAP_RECT_TO_RECT; |
| 190 (*preOptPattern)[5] = RESTORE; | 188 (*preOptPattern)[5] = RESTORE; |
| 191 (*preOptPattern)[6] = RESTORE; | 189 (*preOptPattern)[6] = RESTORE; |
| 192 (*preOptPattern)[7] = RESTORE; | 190 (*preOptPattern)[7] = RESTORE; |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 253 } | 251 } |
| 254 canvas->restore(); | 252 canvas->restore(); |
| 255 canvas->restore(); | 253 canvas->restore(); |
| 256 | 254 |
| 257 result->endRecording(); | 255 result->endRecording(); |
| 258 | 256 |
| 259 return result; | 257 return result; |
| 260 } | 258 } |
| 261 | 259 |
| 262 // straight-ahead version that is seen in the skps | 260 // straight-ahead version that is seen in the skps |
| 263 SkPicture* create_save_layer_opt_2_v1(SkTDArray<DrawType> *preOptPattern, | 261 static SkPicture* create_save_layer_opt_2_v1(SkTDArray<DrawType>* preOptPattern, |
| 264 SkTDArray<DrawType> *postOptPattern, | 262 SkTDArray<DrawType>* postOptPattern
, |
| 265 const SkBitmap& checkerBoard) { | 263 const SkBitmap& checkerBoard) { |
| 266 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, | 264 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
| 267 true, // saveLayer has a paint | 265 true, // saveLayer has a paint |
| 268 true, // dbmr2r has a paint | 266 true, // dbmr2r has a paint |
| 269 true); // and the colors match | 267 true); // and the colors match |
| 270 } | 268 } |
| 271 | 269 |
| 272 // alternate version that should still succeed | 270 // alternate version that should still succeed |
| 273 SkPicture* create_save_layer_opt_2_v2(SkTDArray<DrawType> *preOptPattern, | 271 static SkPicture* create_save_layer_opt_2_v2(SkTDArray<DrawType>* preOptPattern, |
| 274 SkTDArray<DrawType> *postOptPattern, | 272 SkTDArray<DrawType>* postOptPattern
, |
| 275 const SkBitmap& checkerBoard) { | 273 const SkBitmap& checkerBoard) { |
| 276 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, | 274 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
| 277 false, // saveLayer doesn't have a paint! | 275 false, // saveLayer doesn't have a paint! |
| 278 true, // dbmr2r has a paint | 276 true, // dbmr2r has a paint |
| 279 true); // color matching not really applicab
le | 277 true); // color matching not really applicab
le |
| 280 } | 278 } |
| 281 | 279 |
| 282 // alternate version that should still succeed | 280 // alternate version that should still succeed |
| 283 SkPicture* create_save_layer_opt_2_v3(SkTDArray<DrawType> *preOptPattern, | 281 static SkPicture* create_save_layer_opt_2_v3(SkTDArray<DrawType>* preOptPattern, |
| 284 SkTDArray<DrawType> *postOptPattern, | 282 SkTDArray<DrawType>* postOptPattern
, |
| 285 const SkBitmap& checkerBoard) { | 283 const SkBitmap& checkerBoard) { |
| 286 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, | 284 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
| 287 true, // saveLayer has a paint | 285 true, // saveLayer has a paint |
| 288 false, // dbmr2r doesn't have a paint! | 286 false, // dbmr2r doesn't have a paint! |
| 289 true); // color matching not really applicab
le | 287 true); // color matching not really applicab
le |
| 290 } | 288 } |
| 291 | 289 |
| 292 // version in which the optimization fails b.c. the colors don't match | 290 // version in which the optimization fails b.c. the colors don't match |
| 293 SkPicture* create_save_layer_opt_2_v4(SkTDArray<DrawType> *preOptPattern, | 291 static SkPicture* create_save_layer_opt_2_v4(SkTDArray<DrawType>* preOptPattern, |
| 294 SkTDArray<DrawType> *postOptPattern, | 292 SkTDArray<DrawType>* postOptPattern
, |
| 295 const SkBitmap& checkerBoard) { | 293 const SkBitmap& checkerBoard) { |
| 296 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, | 294 return create_save_layer_opt_2(preOptPattern, postOptPattern, checkerBoard, |
| 297 true, // saveLayer has a paint | 295 true, // saveLayer has a paint |
| 298 true, // dbmr2r has a paint | 296 true, // dbmr2r has a paint |
| 299 false); // and the colors don't match! | 297 false); // and the colors don't match! |
| 300 } | 298 } |
| 301 | 299 |
| 302 }; | |
| 303 | |
| 304 | |
| 305 // As our .skp optimizations get folded into the captured skps our code will | 300 // As our .skp optimizations get folded into the captured skps our code will |
| 306 // no longer be locally exercised. This GM manually constructs the patterns | 301 // no longer be locally exercised. This GM manually constructs the patterns |
| 307 // our optimizations will remove to test them. It acts as both a GM and a unit | 302 // our optimizations will remove to test them. It acts as both a GM and a unit |
| 308 // test | 303 // test |
| 309 class OptimizationsGM : public skiagm::GM { | 304 class OptimizationsGM : public skiagm::GM { |
| 310 public: | 305 public: |
| 311 OptimizationsGM() { | 306 OptimizationsGM() { |
| 312 this->makeCheckerboard(); | 307 this->makeCheckerboard(); |
| 313 } | 308 } |
| 314 | 309 |
| (...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 411 } | 406 } |
| 412 | 407 |
| 413 SkBitmap fCheckerboard; | 408 SkBitmap fCheckerboard; |
| 414 | 409 |
| 415 typedef skiagm::GM INHERITED; | 410 typedef skiagm::GM INHERITED; |
| 416 }; | 411 }; |
| 417 | 412 |
| 418 ////////////////////////////////////////////////////////////////////////////// | 413 ////////////////////////////////////////////////////////////////////////////// |
| 419 | 414 |
| 420 DEF_GM( return new OptimizationsGM; ) | 415 DEF_GM( return new OptimizationsGM; ) |
| OLD | NEW |