OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 "SkMatrix44.h" | 8 #include "SkMatrix44.h" |
9 #include "Test.h" | 9 #include "Test.h" |
10 | 10 |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
193 static const Make44Proc gMakeProcs[] = { | 193 static const Make44Proc gMakeProcs[] = { |
194 make_i, make_t, make_s, make_st, make_a, make_p | 194 make_i, make_t, make_s, make_st, make_a, make_p |
195 }; | 195 }; |
196 | 196 |
197 static void test_map2(skiatest::Reporter* reporter, const SkMatrix44& mat) { | 197 static void test_map2(skiatest::Reporter* reporter, const SkMatrix44& mat) { |
198 SkMScalar src2[] = { 1, 2 }; | 198 SkMScalar src2[] = { 1, 2 }; |
199 SkMScalar src4[] = { src2[0], src2[1], 0, 1 }; | 199 SkMScalar src4[] = { src2[0], src2[1], 0, 1 }; |
200 SkMScalar dstA[4], dstB[4]; | 200 SkMScalar dstA[4], dstB[4]; |
201 | 201 |
202 for (int i = 0; i < 4; ++i) { | 202 for (int i = 0; i < 4; ++i) { |
203 dstA[i] = 123456789; | 203 dstA[i] = SkDoubleToMScalar(123456789); |
204 dstB[i] = 987654321; | 204 dstB[i] = SkDoubleToMScalar(987654321); |
205 } | 205 } |
206 | 206 |
207 mat.map2(src2, 1, dstA); | 207 mat.map2(src2, 1, dstA); |
208 mat.mapMScalars(src4, dstB); | 208 mat.mapMScalars(src4, dstB); |
209 | 209 |
210 for (int i = 0; i < 4; ++i) { | 210 for (int i = 0; i < 4; ++i) { |
211 REPORTER_ASSERT(reporter, dstA[i] == dstB[i]); | 211 REPORTER_ASSERT(reporter, dstA[i] == dstB[i]); |
212 } | 212 } |
213 } | 213 } |
214 | 214 |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[3], vec3transf
ormed[2])); | 525 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[3], vec3transf
ormed[2])); |
526 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[0], vec4transf
ormed2[0])); | 526 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[0], vec4transf
ormed2[0])); |
527 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[1], vec4transf
ormed2[1])); | 527 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[1], vec4transf
ormed2[1])); |
528 REPORTER_ASSERT(reporter, !nearly_equal_scalar(vec4transformed[2], vec4trans
formed2[2])); | 528 REPORTER_ASSERT(reporter, !nearly_equal_scalar(vec4transformed[2], vec4trans
formed2[2])); |
529 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[3], vec4transf
ormed2[3])); | 529 REPORTER_ASSERT(reporter, nearly_equal_scalar(vec4transformed[3], vec4transf
ormed2[3])); |
530 } | 530 } |
531 | 531 |
532 static void test_has_perspective(skiatest::Reporter* reporter) { | 532 static void test_has_perspective(skiatest::Reporter* reporter) { |
533 SkMatrix44 transform(SkMatrix44::kIdentity_Constructor); | 533 SkMatrix44 transform(SkMatrix44::kIdentity_Constructor); |
534 | 534 |
535 transform.set(3, 2, -0.1); | 535 transform.setDouble(3, 2, -0.1); |
536 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 536 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
537 | 537 |
538 transform.reset(); | 538 transform.reset(); |
539 REPORTER_ASSERT(reporter, !transform.hasPerspective()); | 539 REPORTER_ASSERT(reporter, !transform.hasPerspective()); |
540 | 540 |
541 transform.set(3, 0, -1.0); | 541 transform.setDouble(3, 0, -1.0); |
542 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 542 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
543 | 543 |
544 transform.reset(); | 544 transform.reset(); |
545 transform.set(3, 1, -1.0); | 545 transform.setDouble(3, 1, -1.0); |
546 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 546 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
547 | 547 |
548 transform.reset(); | 548 transform.reset(); |
549 transform.set(3, 2, -0.3); | 549 transform.setDouble(3, 2, -0.3); |
550 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 550 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
551 | 551 |
552 transform.reset(); | 552 transform.reset(); |
553 transform.set(3, 3, 0.5); | 553 transform.setDouble(3, 3, 0.5); |
554 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 554 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
555 | 555 |
556 transform.reset(); | 556 transform.reset(); |
557 transform.set(3, 3, 0.0); | 557 transform.setDouble(3, 3, 0.0); |
558 REPORTER_ASSERT(reporter, transform.hasPerspective()); | 558 REPORTER_ASSERT(reporter, transform.hasPerspective()); |
559 } | 559 } |
560 | 560 |
561 static bool is_rectilinear (SkVector4& p1, SkVector4& p2, SkVector4& p3, SkVecto
r4& p4) { | 561 static bool is_rectilinear (SkVector4& p1, SkVector4& p2, SkVector4& p3, SkVecto
r4& p4) { |
562 return (SkScalarNearlyEqual(p1.fData[0], p2.fData[0]) && | 562 return (SkScalarNearlyEqual(p1.fData[0], p2.fData[0]) && |
563 SkScalarNearlyEqual(p2.fData[1], p3.fData[1]) && | 563 SkScalarNearlyEqual(p2.fData[1], p3.fData[1]) && |
564 SkScalarNearlyEqual(p3.fData[0], p4.fData[0]) && | 564 SkScalarNearlyEqual(p3.fData[0], p4.fData[0]) && |
565 SkScalarNearlyEqual(p4.fData[1], p1.fData[1])) || | 565 SkScalarNearlyEqual(p4.fData[1], p1.fData[1])) || |
566 (SkScalarNearlyEqual(p1.fData[1], p2.fData[1]) && | 566 (SkScalarNearlyEqual(p1.fData[1], p2.fData[1]) && |
567 SkScalarNearlyEqual(p2.fData[0], p3.fData[0]) && | 567 SkScalarNearlyEqual(p2.fData[0], p3.fData[0]) && |
(...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
750 for (size_t i = 0; i < sizeof(double_rotation_tests)/sizeof(DoubleRotationCase
); ++i) { | 750 for (size_t i = 0; i < sizeof(double_rotation_tests)/sizeof(DoubleRotationCase
); ++i) { |
751 const DoubleRotationCase& value = double_rotation_tests[i]; | 751 const DoubleRotationCase& value = double_rotation_tests[i]; |
752 transform.setRotateDegreesAbout(value.x1, value.y1, value.z1, value.degrees1
); | 752 transform.setRotateDegreesAbout(value.x1, value.y1, value.z1, value.degrees1
); |
753 transform2.setRotateDegreesAbout(value.x2, value.y2, value.z2, value.degrees
2); | 753 transform2.setRotateDegreesAbout(value.x2, value.y2, value.z2, value.degrees
2); |
754 transform.postConcat(transform2); | 754 transform.postConcat(transform2); |
755 test(value.expected, reporter, transform); | 755 test(value.expected, reporter, transform); |
756 } | 756 } |
757 | 757 |
758 // Perspective cases. | 758 // Perspective cases. |
759 transform.setIdentity(); | 759 transform.setIdentity(); |
760 transform.set(3, 2, -0.1); // Perspective depth 10 | 760 transform.setDouble(3, 2, -0.1); // Perspective depth 10 |
761 transform2.setRotateDegreesAbout(0.0, 1.0, 0.0, 45.0); | 761 transform2.setRotateDegreesAbout(0.0, 1.0, 0.0, 45.0); |
762 transform.preConcat(transform2); | 762 transform.preConcat(transform2); |
763 test(false, reporter, transform); | 763 test(false, reporter, transform); |
764 | 764 |
765 transform.setIdentity(); | 765 transform.setIdentity(); |
766 transform.set(3, 2, -0.1); // Perspective depth 10 | 766 transform.setDouble(3, 2, -0.1); // Perspective depth 10 |
767 transform2.setRotateDegreesAbout(0.0, 0.0, 1.0, 90.0); | 767 transform2.setRotateDegreesAbout(0.0, 0.0, 1.0, 90.0); |
768 transform.preConcat(transform2); | 768 transform.preConcat(transform2); |
769 test(true, reporter, transform); | 769 test(true, reporter, transform); |
770 } | 770 } |
771 | 771 |
772 // just want to exercise the various converters for MScalar | 772 // just want to exercise the various converters for MScalar |
773 static void test_toint(skiatest::Reporter* reporter) { | 773 static void test_toint(skiatest::Reporter* reporter) { |
774 SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); | 774 SkMatrix44 mat(SkMatrix44::kUninitialized_Constructor); |
775 mat.setScale(3, 3, 3); | 775 mat.setScale(3, 3, 3); |
776 | 776 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
812 mat.postConcat(rot); | 812 mat.postConcat(rot); |
813 REPORTER_ASSERT(reporter, mat.invert(NULL)); | 813 REPORTER_ASSERT(reporter, mat.invert(NULL)); |
814 mat.invert(&inverse); | 814 mat.invert(&inverse); |
815 iden1.setConcat(mat, inverse); | 815 iden1.setConcat(mat, inverse); |
816 REPORTER_ASSERT(reporter, is_identity(iden1)); | 816 REPORTER_ASSERT(reporter, is_identity(iden1)); |
817 iden2.setConcat(inverse, mat); | 817 iden2.setConcat(inverse, mat); |
818 REPORTER_ASSERT(reporter, is_identity(iden2)); | 818 REPORTER_ASSERT(reporter, is_identity(iden2)); |
819 | 819 |
820 // test tiny-valued matrix inverse | 820 // test tiny-valued matrix inverse |
821 mat.reset(); | 821 mat.reset(); |
822 mat.setScale(1.0e-12, 1.0e-12, 1.0e-12); | 822 auto v = SkDoubleToMScalar(1.0e-12); |
| 823 mat.setScale(v,v,v); |
823 rot.setRotateDegreesAbout(0, 0, -1, 90); | 824 rot.setRotateDegreesAbout(0, 0, -1, 90); |
824 mat.postConcat(rot); | 825 mat.postConcat(rot); |
825 mat.postTranslate(1.0e-12, 1.0e-12, 1.0e-12); | 826 mat.postTranslate(v,v,v); |
826 REPORTER_ASSERT(reporter, mat.invert(NULL)); | 827 REPORTER_ASSERT(reporter, mat.invert(NULL)); |
827 mat.invert(&inverse); | 828 mat.invert(&inverse); |
828 iden1.setConcat(mat, inverse); | 829 iden1.setConcat(mat, inverse); |
829 REPORTER_ASSERT(reporter, is_identity(iden1)); | 830 REPORTER_ASSERT(reporter, is_identity(iden1)); |
830 | 831 |
831 // test mixed-valued matrix inverse | 832 // test mixed-valued matrix inverse |
832 mat.reset(); | 833 mat.reset(); |
833 mat.setScale(1.0e-10, 3.0, 1.0e+10); | 834 mat.setScale(SkDoubleToMScalar(1.0e-10), |
| 835 SkDoubleToMScalar(3.0), |
| 836 SkDoubleToMScalar(1.0e+10)); |
834 rot.setRotateDegreesAbout(0, 0, -1, 90); | 837 rot.setRotateDegreesAbout(0, 0, -1, 90); |
835 mat.postConcat(rot); | 838 mat.postConcat(rot); |
836 mat.postTranslate(1.0e+10, 3.0, 1.0e-10); | 839 mat.postTranslate(SkDoubleToMScalar(1.0e+10), |
| 840 SkDoubleToMScalar(3.0), |
| 841 SkDoubleToMScalar(1.0e-10)); |
837 REPORTER_ASSERT(reporter, mat.invert(NULL)); | 842 REPORTER_ASSERT(reporter, mat.invert(NULL)); |
838 mat.invert(&inverse); | 843 mat.invert(&inverse); |
839 iden1.setConcat(mat, inverse); | 844 iden1.setConcat(mat, inverse); |
840 REPORTER_ASSERT(reporter, is_identity(iden1)); | 845 REPORTER_ASSERT(reporter, is_identity(iden1)); |
841 | 846 |
842 // test degenerate matrix | 847 // test degenerate matrix |
843 mat.reset(); | 848 mat.reset(); |
844 mat.set3x3(1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0); | 849 mat.set3x3(1.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0, 0.0); |
845 REPORTER_ASSERT(reporter, !mat.invert(NULL)); | 850 REPORTER_ASSERT(reporter, !mat.invert(NULL)); |
846 | 851 |
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
887 test_get_set_double(reporter); | 892 test_get_set_double(reporter); |
888 test_set_row_col_major(reporter); | 893 test_set_row_col_major(reporter); |
889 test_translate(reporter); | 894 test_translate(reporter); |
890 test_scale(reporter); | 895 test_scale(reporter); |
891 test_map2(reporter); | 896 test_map2(reporter); |
892 test_3x3_conversion(reporter); | 897 test_3x3_conversion(reporter); |
893 test_has_perspective(reporter); | 898 test_has_perspective(reporter); |
894 test_preserves_2d_axis_alignment(reporter); | 899 test_preserves_2d_axis_alignment(reporter); |
895 test_toint(reporter); | 900 test_toint(reporter); |
896 } | 901 } |
OLD | NEW |