| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 Google Inc. | 2 * Copyright 2014 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 "Test.h" | 8 #include "Test.h" |
| 9 #include "SkCanvas.h" | 9 #include "SkCanvas.h" |
| 10 #include "SkDebugCanvas.h" | 10 #include "SkDebugCanvas.h" |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 122 kRect_DrawOpType, | 122 kRect_DrawOpType, |
| 123 kRRect_DrawOpType, | 123 kRRect_DrawOpType, |
| 124 #if 0 | 124 #if 0 |
| 125 kSprite_DrawOpType, | 125 kSprite_DrawOpType, |
| 126 kText_DrawOpType, | 126 kText_DrawOpType, |
| 127 kTextOnPath_DrawOpType, | 127 kTextOnPath_DrawOpType, |
| 128 kTextTopBottom_DrawOpType, | 128 kTextTopBottom_DrawOpType, |
| 129 kDrawVertices_DrawOpType, | 129 kDrawVertices_DrawOpType, |
| 130 #endif | 130 #endif |
| 131 | 131 |
| 132 kLastNonSaveLayer_DrawOpType = kRect_DrawOpType, | 132 kLast_DrawOpType = kRect_DrawOpType |
| 133 | |
| 134 // saveLayer's have to handled apart from the other draw operations | |
| 135 // since they also alter the save/restore structure. | |
| 136 kSaveLayer_DrawOpType, | |
| 137 }; | 133 }; |
| 138 | 134 |
| 139 static const int kNonSaveLayerDrawOpTypeCount = kLastNonSaveLayer_DrawOpType + 1
; | 135 static const int kDrawOpTypeCount = kLast_DrawOpType + 1; |
| 140 | 136 |
| 141 typedef void (*PFEmitMC)(SkCanvas* canvas, MatType mat, ClipType clip, | 137 typedef void (*PFEmitMC)(SkCanvas* canvas, MatType mat, ClipType clip, |
| 142 DrawOpType draw, SkTDArray<DrawType>* expected, | 138 DrawOpType draw, SkTDArray<DrawType>* expected, |
| 143 int accumulatedClips); | 139 int accumulatedClips); |
| 144 typedef void (*PFEmitBody)(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, | 140 typedef void (*PFEmitBody)(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, |
| 145 ClipType clip, DrawOpType draw, | 141 ClipType clip, DrawOpType draw, |
| 146 SkTDArray<DrawType>* expected, int accumulatedClips); | 142 SkTDArray<DrawType>* expected, int accumulatedClips); |
| 147 typedef void (*PFEmitStruct)(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, | 143 typedef void (*PFEmitStruct)(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, |
| 148 ClipType clip, PFEmitBody emitBody, DrawOpType draw
, | 144 ClipType clip, PFEmitBody emitBody, DrawOpType draw
, |
| 149 SkTDArray<DrawType>* expected); | 145 SkTDArray<DrawType>* expected); |
| (...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 318 | 314 |
| 319 ////////////////////////////////////////////////////////////////////////////// | 315 ////////////////////////////////////////////////////////////////////////////// |
| 320 | 316 |
| 321 // Emit: | 317 // Emit: |
| 322 // clip | 318 // clip |
| 323 // matrix | 319 // matrix |
| 324 // Simple case - the clip isn't effect by the matrix | 320 // Simple case - the clip isn't effect by the matrix |
| 325 static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip, | 321 static void emit_clip_and_mat(SkCanvas* canvas, MatType mat, ClipType clip, |
| 326 DrawOpType draw, SkTDArray<DrawType>* expected, | 322 DrawOpType draw, SkTDArray<DrawType>* expected, |
| 327 int accumulatedClips) { | 323 int accumulatedClips) { |
| 328 emit_clip(canvas, clip); | |
| 329 emit_mat(canvas, mat); | |
| 330 | |
| 331 if (kNone_DrawOpType == draw) { | 324 if (kNone_DrawOpType == draw) { |
| 332 return; | 325 return; |
| 333 } | 326 } |
| 334 | 327 |
| 328 emit_clip(canvas, clip); |
| 329 emit_mat(canvas, mat); |
| 330 |
| 335 for (int i = 0; i < accumulatedClips; ++i) { | 331 for (int i = 0; i < accumulatedClips; ++i) { |
| 336 add_clip(clip, mat, expected); | 332 add_clip(clip, mat, expected); |
| 337 } | 333 } |
| 338 add_mat(mat, expected); | 334 add_mat(mat, expected); |
| 339 } | 335 } |
| 340 | 336 |
| 341 // Emit: | 337 // Emit: |
| 342 // matrix | 338 // matrix |
| 343 // clip | 339 // clip |
| 344 // Emitting the matrix first is more challenging since the matrix has to be | 340 // Emitting the matrix first is more challenging since the matrix has to be |
| 345 // pushed across (i.e., applied to) the clip. | 341 // pushed across (i.e., applied to) the clip. |
| 346 static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip, | 342 static void emit_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType clip, |
| 347 DrawOpType draw, SkTDArray<DrawType>* expected, | 343 DrawOpType draw, SkTDArray<DrawType>* expected, |
| 348 int accumulatedClips) { | 344 int accumulatedClips) { |
| 349 emit_mat(canvas, mat); | |
| 350 emit_clip(canvas, clip); | |
| 351 | |
| 352 if (kNone_DrawOpType == draw) { | 345 if (kNone_DrawOpType == draw) { |
| 353 return; | 346 return; |
| 354 } | 347 } |
| 355 | 348 |
| 349 emit_mat(canvas, mat); |
| 350 emit_clip(canvas, clip); |
| 351 |
| 356 // the matrix & clip order will be reversed once collapsed! | 352 // the matrix & clip order will be reversed once collapsed! |
| 357 for (int i = 0; i < accumulatedClips; ++i) { | 353 for (int i = 0; i < accumulatedClips; ++i) { |
| 358 add_clip(clip, mat, expected); | 354 add_clip(clip, mat, expected); |
| 359 } | 355 } |
| 360 add_mat(mat, expected); | 356 add_mat(mat, expected); |
| 361 } | 357 } |
| 362 | 358 |
| 363 // Emit: | 359 // Emit: |
| 364 // matrix | 360 // matrix |
| 365 // clip | 361 // clip |
| 366 // matrix | 362 // matrix |
| 367 // clip | 363 // clip |
| 368 // This tests that the matrices and clips coalesce when collapsed | 364 // This tests that the matrices and clips coalesce when collapsed |
| 369 static void emit_double_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType cli
p, | 365 static void emit_double_mat_and_clip(SkCanvas* canvas, MatType mat, ClipType cli
p, |
| 370 DrawOpType draw, SkTDArray<DrawType>* expec
ted, | 366 DrawOpType draw, SkTDArray<DrawType>* expec
ted, |
| 371 int accumulatedClips) { | 367 int accumulatedClips) { |
| 368 if (kNone_DrawOpType == draw) { |
| 369 return; |
| 370 } |
| 371 |
| 372 emit_mat(canvas, mat); | 372 emit_mat(canvas, mat); |
| 373 emit_clip(canvas, clip); | 373 emit_clip(canvas, clip); |
| 374 emit_mat(canvas, mat); | 374 emit_mat(canvas, mat); |
| 375 emit_clip(canvas, clip); | 375 emit_clip(canvas, clip); |
| 376 | 376 |
| 377 if (kNone_DrawOpType == draw) { | |
| 378 return; | |
| 379 } | |
| 380 | |
| 381 for (int i = 0; i < accumulatedClips; ++i) { | 377 for (int i = 0; i < accumulatedClips; ++i) { |
| 382 add_clip(clip, mat, expected); | 378 add_clip(clip, mat, expected); |
| 383 add_clip(clip, mat, expected); | 379 add_clip(clip, mat, expected); |
| 384 } | 380 } |
| 385 add_mat(mat, expected); | 381 add_mat(mat, expected); |
| 386 } | 382 } |
| 387 | 383 |
| 388 // Emit: | 384 // Emit: |
| 389 // matrix | 385 // matrix |
| 390 // clip | 386 // clip |
| 391 // clip | 387 // clip |
| 392 // This tests accumulation of clips in same transform state. It also tests pushi
ng | 388 // This tests accumulation of clips in same transform state. It also tests pushi
ng |
| 393 // of the matrix across both the clips. | 389 // of the matrix across both the clips. |
| 394 static void emit_mat_clip_clip(SkCanvas* canvas, MatType mat, ClipType clip, | 390 static void emit_mat_clip_clip(SkCanvas* canvas, MatType mat, ClipType clip, |
| 395 DrawOpType draw, SkTDArray<DrawType>* expected, | 391 DrawOpType draw, SkTDArray<DrawType>* expected, |
| 396 int accumulatedClips) { | 392 int accumulatedClips) { |
| 393 if (kNone_DrawOpType == draw) { |
| 394 return; |
| 395 } |
| 396 |
| 397 emit_mat(canvas, mat); | 397 emit_mat(canvas, mat); |
| 398 emit_clip(canvas, clip); | 398 emit_clip(canvas, clip); |
| 399 emit_clip(canvas, clip); | 399 emit_clip(canvas, clip); |
| 400 | 400 |
| 401 if (kNone_DrawOpType == draw) { | |
| 402 return; | |
| 403 } | |
| 404 | |
| 405 for (int i = 0; i < accumulatedClips; ++i) { | 401 for (int i = 0; i < accumulatedClips; ++i) { |
| 406 add_clip(clip, mat, expected); | 402 add_clip(clip, mat, expected); |
| 407 add_clip(clip, mat, expected); | 403 add_clip(clip, mat, expected); |
| 408 } | 404 } |
| 409 add_mat(mat, expected); | 405 add_mat(mat, expected); |
| 410 } | 406 } |
| 411 | 407 |
| 412 ////////////////////////////////////////////////////////////////////////////// | 408 ////////////////////////////////////////////////////////////////////////////// |
| 413 | 409 |
| 414 // Emit: | 410 // Emit: |
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 462 // SaveLayer | 458 // SaveLayer |
| 463 // matrix & clip calls | 459 // matrix & clip calls |
| 464 // draw op | 460 // draw op |
| 465 // Restore | 461 // Restore |
| 466 static void emit_body2(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, | 462 static void emit_body2(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, |
| 467 ClipType clip, DrawOpType draw, | 463 ClipType clip, DrawOpType draw, |
| 468 SkTDArray<DrawType>* expected, int accumulatedClips) { | 464 SkTDArray<DrawType>* expected, int accumulatedClips) { |
| 469 bool needsSaveRestore = kNone_DrawOpType != draw && | 465 bool needsSaveRestore = kNone_DrawOpType != draw && |
| 470 (kNone_MatType != mat || kNone_ClipType != clip); | 466 (kNone_MatType != mat || kNone_ClipType != clip); |
| 471 | 467 |
| 472 if (kNone_MatType != mat || kNone_ClipType != clip) { | 468 if (needsSaveRestore) { |
| 473 *expected->append() = SAVE; | 469 *expected->append() = SAVE_LAYER; |
| 474 } | 470 } |
| 475 (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, accumulatedCli
ps+1); | 471 (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into later o
ps |
| 476 *expected->append() = SAVE_LAYER; | |
| 477 // TODO: widen testing to exercise saveLayer's parameters | 472 // TODO: widen testing to exercise saveLayer's parameters |
| 478 canvas->saveLayer(NULL, NULL); | 473 canvas->saveLayer(NULL, NULL); |
| 479 if (needsSaveRestore) { | 474 if (needsSaveRestore) { |
| 480 *expected->append() = SAVE; | 475 *expected->append() = SAVE; |
| 481 } | 476 } |
| 482 (*emitMC)(canvas, mat, clip, draw, expected, 1); | 477 (*emitMC)(canvas, mat, clip, draw, expected, accumulatedClips+2); |
| 483 emit_draw(canvas, draw, expected); | 478 emit_draw(canvas, draw, expected); |
| 484 if (needsSaveRestore) { | 479 if (needsSaveRestore) { |
| 485 *expected->append() = RESTORE; | 480 *expected->append() = RESTORE; |
| 486 } | 481 } |
| 487 canvas->restore(); | 482 canvas->restore(); |
| 488 *expected->append() = RESTORE; | 483 if (needsSaveRestore) { |
| 489 if (kNone_MatType != mat || kNone_ClipType != clip) { | |
| 490 *expected->append() = RESTORE; | 484 *expected->append() = RESTORE; |
| 491 } | 485 } |
| 492 } | 486 } |
| 493 | 487 |
| 494 // Emit: | 488 // Emit: |
| 495 // matrix & clip calls | 489 // matrix & clip calls |
| 496 // SaveLayer | 490 // SaveLayer |
| 497 // matrix & clip calls | 491 // matrix & clip calls |
| 498 // SaveLayer | 492 // SaveLayer |
| 499 // matrix & clip calls | 493 // matrix & clip calls |
| 500 // draw op | 494 // draw op |
| 501 // Restore | 495 // Restore |
| 502 // matrix & clip calls (will be ignored) | 496 // matrix & clip calls (will be ignored) |
| 503 // Restore | 497 // Restore |
| 504 static void emit_body3(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, | 498 static void emit_body3(SkCanvas* canvas, PFEmitMC emitMC, MatType mat, |
| 505 ClipType clip, DrawOpType draw, | 499 ClipType clip, DrawOpType draw, |
| 506 SkTDArray<DrawType>* expected, int accumulatedClips) { | 500 SkTDArray<DrawType>* expected, int accumulatedClips) { |
| 507 bool needsSaveRestore = kNone_DrawOpType != draw && | 501 bool needsSaveRestore = kNone_DrawOpType != draw && |
| 508 (kNone_MatType != mat || kNone_ClipType != clip); | 502 (kNone_MatType != mat || kNone_ClipType != clip); |
| 509 | 503 |
| 510 if (kNone_MatType != mat || kNone_ClipType != clip) { | 504 // This saveLayer will always be forced b.c. we currently can't tell |
| 511 *expected->append() = SAVE; | 505 // ahead of time if it will be empty (see comment in SkMatrixClipStateMgr::s
ave) |
| 512 } | |
| 513 (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, accumulatedCli
ps+1); | |
| 514 *expected->append() = SAVE_LAYER; | 506 *expected->append() = SAVE_LAYER; |
| 507 |
| 508 (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into later o
ps |
| 515 // TODO: widen testing to exercise saveLayer's parameters | 509 // TODO: widen testing to exercise saveLayer's parameters |
| 516 canvas->saveLayer(NULL, NULL); | 510 canvas->saveLayer(NULL, NULL); |
| 517 (*emitMC)(canvas, mat, clip, kSaveLayer_DrawOpType, expected, 1); | 511 (*emitMC)(canvas, mat, clip, draw, NULL, 0); // these get fused into lat
er ops |
| 518 if (kNone_MatType != mat || kNone_ClipType != clip) { | 512 if (needsSaveRestore) { |
| 519 *expected->append() = SAVE; | 513 *expected->append() = SAVE_LAYER; |
| 520 } | 514 } |
| 521 *expected->append() = SAVE_LAYER; | |
| 522 // TODO: widen testing to exercise saveLayer's parameters | 515 // TODO: widen testing to exercise saveLayer's parameters |
| 523 canvas->saveLayer(NULL, NULL); | 516 canvas->saveLayer(NULL, NULL); |
| 524 if (needsSaveRestore) { | 517 if (needsSaveRestore) { |
| 525 *expected->append() = SAVE; | 518 *expected->append() = SAVE; |
| 526 } | 519 } |
| 527 (*emitMC)(canvas, mat, clip, draw, expected, 1); | 520 (*emitMC)(canvas, mat, clip, draw, expected, accumulatedClips+3); |
| 528 emit_draw(canvas, draw, expected); | 521 emit_draw(canvas, draw, expected); |
| 529 if (needsSaveRestore) { | 522 if (needsSaveRestore) { |
| 530 *expected->append() = RESTORE; | 523 *expected->append() = RESTORE; |
| 531 } | 524 } |
| 532 canvas->restore(); // for saveLayer | 525 canvas->restore(); |
| 533 *expected->append() = RESTORE; // for saveLayer | 526 if (needsSaveRestore) { |
| 534 if (kNone_MatType != mat || kNone_ClipType != clip) { | |
| 535 *expected->append() = RESTORE; | 527 *expected->append() = RESTORE; |
| 536 } | 528 } |
| 537 canvas->restore(); | 529 canvas->restore(); |
| 530 |
| 538 // required to match forced SAVE_LAYER | 531 // required to match forced SAVE_LAYER |
| 539 *expected->append() = RESTORE; | 532 *expected->append() = RESTORE; |
| 540 if (kNone_MatType != mat || kNone_ClipType != clip) { | |
| 541 *expected->append() = RESTORE; | |
| 542 } | |
| 543 } | 533 } |
| 544 | 534 |
| 545 ////////////////////////////////////////////////////////////////////////////// | 535 ////////////////////////////////////////////////////////////////////////////// |
| 546 | 536 |
| 547 // Emit: | 537 // Emit: |
| 548 // Save | 538 // Save |
| 549 // some body | 539 // some body |
| 550 // Restore | 540 // Restore |
| 551 // Note: the outer save/restore are provided by beginRecording/endRecording | 541 // Note: the outer save/restore are provided by beginRecording/endRecording |
| 552 static void emit_struct0(SkCanvas* canvas, | 542 static void emit_struct0(SkCanvas* canvas, |
| (...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 663 PFEmitStruct gStructure[] = { emit_struct0, emit_struct1, emit_struct2, emit
_struct3 }; | 653 PFEmitStruct gStructure[] = { emit_struct0, emit_struct1, emit_struct2, emit
_struct3 }; |
| 664 PFEmitBody gBody[] = { emit_body0, emit_body1, emit_body2, emit_body3 }; | 654 PFEmitBody gBody[] = { emit_body0, emit_body1, emit_body2, emit_body3 }; |
| 665 PFEmitMC gMCs[] = { emit_clip_and_mat, emit_mat_and_clip, | 655 PFEmitMC gMCs[] = { emit_clip_and_mat, emit_mat_and_clip, |
| 666 emit_double_mat_and_clip, emit_mat_clip_clip }; | 656 emit_double_mat_and_clip, emit_mat_clip_clip }; |
| 667 | 657 |
| 668 for (size_t i = 0; i < SK_ARRAY_COUNT(gStructure); ++i) { | 658 for (size_t i = 0; i < SK_ARRAY_COUNT(gStructure); ++i) { |
| 669 for (size_t j = 0; j < SK_ARRAY_COUNT(gBody); ++j) { | 659 for (size_t j = 0; j < SK_ARRAY_COUNT(gBody); ++j) { |
| 670 for (size_t k = 0; k < SK_ARRAY_COUNT(gMCs); ++k) { | 660 for (size_t k = 0; k < SK_ARRAY_COUNT(gMCs); ++k) { |
| 671 for (int l = 0; l < kMatTypeCount; ++l) { | 661 for (int l = 0; l < kMatTypeCount; ++l) { |
| 672 for (int m = 0; m < kClipTypeCount; ++m) { | 662 for (int m = 0; m < kClipTypeCount; ++m) { |
| 673 for (int n = 0; n < kNonSaveLayerDrawOpTypeCount; ++n) { | 663 for (int n = 0; n < kDrawOpTypeCount; ++n) { |
| 674 #ifdef TEST_COLLAPSE_MATRIX_CLIP_STATE | 664 #ifdef TEST_COLLAPSE_MATRIX_CLIP_STATE |
| 675 static int testID = -1; | 665 static int testID = -1; |
| 676 ++testID; | 666 ++testID; |
| 677 if (testID < -1) { | 667 if (testID < -1) { |
| 678 continue; | 668 continue; |
| 679 } | 669 } |
| 680 SkDebugf("test: %d\n", testID); | |
| 681 #endif | 670 #endif |
| 682 | 671 |
| 683 SkTDArray<DrawType> expected, actual; | 672 SkTDArray<DrawType> expected, actual; |
| 684 | 673 |
| 685 SkPicture picture; | 674 SkPicture picture; |
| 686 | 675 |
| 687 // Note: beginRecording/endRecording add a save/rest
ore pair | 676 // Note: beginRecording/endRecording add a save/rest
ore pair |
| 688 SkCanvas* canvas = picture.beginRecording(100, 100); | 677 SkCanvas* canvas = picture.beginRecording(100, 100); |
| 689 (*gStructure[i])(canvas, | 678 (*gStructure[i])(canvas, |
| 690 gMCs[k], | 679 gMCs[k], |
| (...skipping 30 matching lines...) Expand all Loading... |
| 721 } | 710 } |
| 722 } | 711 } |
| 723 } | 712 } |
| 724 } | 713 } |
| 725 | 714 |
| 726 DEF_TEST(MatrixClipCollapse, reporter) { | 715 DEF_TEST(MatrixClipCollapse, reporter) { |
| 727 test_collapse(reporter); | 716 test_collapse(reporter); |
| 728 } | 717 } |
| 729 | 718 |
| 730 #endif | 719 #endif |
| OLD | NEW |