| OLD | NEW |
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #include "Test.h" | 8 #include "Test.h" |
| 9 #include "SkMath.h" | 9 #include "SkMath.h" |
| 10 #include "SkMatrix.h" | 10 #include "SkMatrix.h" |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 123 size_t size3 = m2.readFromMemory(buffer, kBufferSize); | 123 size_t size3 = m2.readFromMemory(buffer, kBufferSize); |
| 124 REPORTER_ASSERT(reporter, size1 == size3); | 124 REPORTER_ASSERT(reporter, size1 == size3); |
| 125 REPORTER_ASSERT(reporter, are_equal(reporter, m, m2)); | 125 REPORTER_ASSERT(reporter, are_equal(reporter, m, m2)); |
| 126 | 126 |
| 127 char buffer2[kBufferSize]; | 127 char buffer2[kBufferSize]; |
| 128 size3 = m2.writeToMemory(buffer2); | 128 size3 = m2.writeToMemory(buffer2); |
| 129 REPORTER_ASSERT(reporter, size1 == size3); | 129 REPORTER_ASSERT(reporter, size1 == size3); |
| 130 REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); | 130 REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); |
| 131 } | 131 } |
| 132 | 132 |
| 133 static void test_matrix_max_stretch(skiatest::Reporter* reporter) { | 133 static void test_matrix_min_max_stretch(skiatest::Reporter* reporter) { |
| 134 SkMatrix identity; | 134 SkMatrix identity; |
| 135 identity.reset(); | 135 identity.reset(); |
| 136 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMinStretch()); |
| 136 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxStretch()); | 137 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxStretch()); |
| 137 | 138 |
| 138 SkMatrix scale; | 139 SkMatrix scale; |
| 139 scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); | 140 scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); |
| 141 REPORTER_ASSERT(reporter, SK_Scalar1 * 2 == scale.getMinStretch()); |
| 140 REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxStretch()); | 142 REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxStretch()); |
| 141 | 143 |
| 142 SkMatrix rot90Scale; | 144 SkMatrix rot90Scale; |
| 143 rot90Scale.setRotate(90 * SK_Scalar1); | 145 rot90Scale.setRotate(90 * SK_Scalar1); |
| 144 rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); | 146 rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); |
| 147 REPORTER_ASSERT(reporter, SK_Scalar1 / 4 == rot90Scale.getMinStretch()); |
| 145 REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxStretch()); | 148 REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxStretch()); |
| 146 | 149 |
| 147 SkMatrix rotate; | 150 SkMatrix rotate; |
| 148 rotate.setRotate(128 * SK_Scalar1); | 151 rotate.setRotate(128 * SK_Scalar1); |
| 149 REPORTER_ASSERT(reporter, SkScalarAbs(SK_Scalar1 - rotate.getMaxStretch()) <
= SK_ScalarNearlyZero); | 152 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMinStret
ch() ,SK_ScalarNearlyZero)); |
| 153 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMaxStret
ch(), SK_ScalarNearlyZero)); |
| 150 | 154 |
| 151 SkMatrix translate; | 155 SkMatrix translate; |
| 152 translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); | 156 translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); |
| 157 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMinStretch()); |
| 153 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxStretch()); | 158 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxStretch()); |
| 154 | 159 |
| 155 SkMatrix perspX; | 160 SkMatrix perspX; |
| 156 perspX.reset(); | 161 perspX.reset(); |
| 157 perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000)); | 162 perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000)); |
| 163 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMinStretch()); |
| 158 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch()); | 164 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxStretch()); |
| 159 | 165 |
| 160 SkMatrix perspY; | 166 SkMatrix perspY; |
| 161 perspY.reset(); | 167 perspY.reset(); |
| 162 perspY.setPerspX(SkScalarToPersp(-SK_Scalar1 / 500)); | 168 perspY.setPerspY(SkScalarToPersp(-SK_Scalar1 / 500)); |
| 169 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMinStretch()); |
| 163 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch()); | 170 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxStretch()); |
| 164 | 171 |
| 165 SkMatrix baseMats[] = {scale, rot90Scale, rotate, | 172 SkMatrix baseMats[] = {scale, rot90Scale, rotate, |
| 166 translate, perspX, perspY}; | 173 translate, perspX, perspY}; |
| 167 SkMatrix mats[2*SK_ARRAY_COUNT(baseMats)]; | 174 SkMatrix mats[2*SK_ARRAY_COUNT(baseMats)]; |
| 168 for (size_t i = 0; i < SK_ARRAY_COUNT(baseMats); ++i) { | 175 for (size_t i = 0; i < SK_ARRAY_COUNT(baseMats); ++i) { |
| 169 mats[i] = baseMats[i]; | 176 mats[i] = baseMats[i]; |
| 170 bool invertable = mats[i].invert(&mats[i + SK_ARRAY_COUNT(baseMats)]); | 177 bool invertable = mats[i].invert(&mats[i + SK_ARRAY_COUNT(baseMats)]); |
| 171 REPORTER_ASSERT(reporter, invertable); | 178 REPORTER_ASSERT(reporter, invertable); |
| 172 } | 179 } |
| 173 SkRandom rand; | 180 SkRandom rand; |
| 174 for (int m = 0; m < 1000; ++m) { | 181 for (int m = 0; m < 1000; ++m) { |
| 175 SkMatrix mat; | 182 SkMatrix mat; |
| 176 mat.reset(); | 183 mat.reset(); |
| 177 for (int i = 0; i < 4; ++i) { | 184 for (int i = 0; i < 4; ++i) { |
| 178 int x = rand.nextU() % SK_ARRAY_COUNT(mats); | 185 int x = rand.nextU() % SK_ARRAY_COUNT(mats); |
| 179 mat.postConcat(mats[x]); | 186 mat.postConcat(mats[x]); |
| 180 } | 187 } |
| 181 SkScalar stretch = mat.getMaxStretch(); | |
| 182 | 188 |
| 183 if ((stretch < 0) != mat.hasPerspective()) { | 189 SkScalar minStretch = mat.getMinStretch(); |
| 184 stretch = mat.getMaxStretch(); | 190 SkScalar maxStretch = mat.getMaxStretch(); |
| 185 } | 191 REPORTER_ASSERT(reporter, (minStretch < 0) == (maxStretch < 0)); |
| 186 | 192 REPORTER_ASSERT(reporter, (maxStretch < 0) == mat.hasPerspective()); |
| 187 REPORTER_ASSERT(reporter, (stretch < 0) == mat.hasPerspective()); | |
| 188 | 193 |
| 189 if (mat.hasPerspective()) { | 194 if (mat.hasPerspective()) { |
| 190 m -= 1; // try another non-persp matrix | 195 m -= 1; // try another non-persp matrix |
| 191 continue; | 196 continue; |
| 192 } | 197 } |
| 193 | 198 |
| 194 // test a bunch of vectors. None should be scaled by more than stretch | 199 // test a bunch of vectors. All should be scaled by between minStretch a
nd maxStretch |
| 195 // (modulo some error) and we should find a vector that is scaled by | 200 // (modulo some error) and we should find a vector that is scaled by alm
ost each. |
| 196 // almost stretch. | 201 static const SkScalar gVectorStretchTol = (105 * SK_Scalar1) / 100; |
| 197 static const SkScalar gStretchTol = (105 * SK_Scalar1) / 100; | 202 static const SkScalar gClosestStretchTol = (97 * SK_Scalar1) / 100; |
| 198 static const SkScalar gMaxStretchTol = (97 * SK_Scalar1) / 100; | 203 SkScalar max = 0, min = SK_ScalarMax; |
| 199 SkScalar max = 0; | |
| 200 SkVector vectors[1000]; | 204 SkVector vectors[1000]; |
| 201 for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { | 205 for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { |
| 202 vectors[i].fX = rand.nextSScalar1(); | 206 vectors[i].fX = rand.nextSScalar1(); |
| 203 vectors[i].fY = rand.nextSScalar1(); | 207 vectors[i].fY = rand.nextSScalar1(); |
| 204 if (!vectors[i].normalize()) { | 208 if (!vectors[i].normalize()) { |
| 205 i -= 1; | 209 i -= 1; |
| 206 continue; | 210 continue; |
| 207 } | 211 } |
| 208 } | 212 } |
| 209 mat.mapVectors(vectors, SK_ARRAY_COUNT(vectors)); | 213 mat.mapVectors(vectors, SK_ARRAY_COUNT(vectors)); |
| 210 for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { | 214 for (size_t i = 0; i < SK_ARRAY_COUNT(vectors); ++i) { |
| 211 SkScalar d = vectors[i].length(); | 215 SkScalar d = vectors[i].length(); |
| 212 REPORTER_ASSERT(reporter, SkScalarDiv(d, stretch) < gStretchTol); | 216 REPORTER_ASSERT(reporter, SkScalarDiv(d, maxStretch) < gVectorStretc
hTol); |
| 217 REPORTER_ASSERT(reporter, SkScalarDiv(minStretch, d) < gVectorStretc
hTol); |
| 213 if (max < d) { | 218 if (max < d) { |
| 214 max = d; | 219 max = d; |
| 215 } | 220 } |
| 221 if (min > d) { |
| 222 min = d; |
| 223 } |
| 216 } | 224 } |
| 217 REPORTER_ASSERT(reporter, SkScalarDiv(max, stretch) >= gMaxStretchTol); | 225 REPORTER_ASSERT(reporter, SkScalarDiv(max, maxStretch) >= gClosestStretc
hTol); |
| 226 REPORTER_ASSERT(reporter, SkScalarDiv(minStretch, min) >= gClosestStretc
hTol); |
| 218 } | 227 } |
| 219 } | 228 } |
| 220 | 229 |
| 221 static void test_matrix_is_similarity(skiatest::Reporter* reporter) { | 230 static void test_matrix_is_similarity(skiatest::Reporter* reporter) { |
| 222 SkMatrix mat; | 231 SkMatrix mat; |
| 223 | 232 |
| 224 // identity | 233 // identity |
| 225 mat.setIdentity(); | 234 mat.setIdentity(); |
| 226 REPORTER_ASSERT(reporter, mat.isSimilarity()); | 235 REPORTER_ASSERT(reporter, mat.isSimilarity()); |
| 227 | 236 |
| (...skipping 562 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 790 mat.reset(); | 799 mat.reset(); |
| 791 mat.set(SkMatrix::kMSkewX, SK_ScalarNaN); | 800 mat.set(SkMatrix::kMSkewX, SK_ScalarNaN); |
| 792 mat2.set(SkMatrix::kMSkewX, SK_ScalarNaN); | 801 mat2.set(SkMatrix::kMSkewX, SK_ScalarNaN); |
| 793 // fixed pt doesn't have the property that NaN does not equal itself. | 802 // fixed pt doesn't have the property that NaN does not equal itself. |
| 794 #ifdef SK_SCALAR_IS_FIXED | 803 #ifdef SK_SCALAR_IS_FIXED |
| 795 REPORTER_ASSERT(reporter, are_equal(reporter, mat, mat2)); | 804 REPORTER_ASSERT(reporter, are_equal(reporter, mat, mat2)); |
| 796 #else | 805 #else |
| 797 REPORTER_ASSERT(reporter, !are_equal(reporter, mat, mat2)); | 806 REPORTER_ASSERT(reporter, !are_equal(reporter, mat, mat2)); |
| 798 #endif | 807 #endif |
| 799 | 808 |
| 800 test_matrix_max_stretch(reporter); | 809 test_matrix_min_max_stretch(reporter); |
| 801 test_matrix_is_similarity(reporter); | 810 test_matrix_is_similarity(reporter); |
| 802 test_matrix_recttorect(reporter); | 811 test_matrix_recttorect(reporter); |
| 803 test_matrix_decomposition(reporter); | 812 test_matrix_decomposition(reporter); |
| 804 test_matrix_homogeneous(reporter); | 813 test_matrix_homogeneous(reporter); |
| 805 } | 814 } |
| 806 | 815 |
| 807 #include "TestClassDef.h" | 816 #include "TestClassDef.h" |
| 808 DEFINE_TESTCLASS("Matrix", MatrixTestClass, TestMatrix) | 817 DEFINE_TESTCLASS("Matrix", MatrixTestClass, TestMatrix) |
| OLD | NEW |