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