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 "SkMath.h" | 8 #include "SkMath.h" |
9 #include "SkMatrix.h" | 9 #include "SkMatrix.h" |
10 #include "SkMatrixUtils.h" | 10 #include "SkMatrixUtils.h" |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 REPORTER_ASSERT(reporter, size1 == size3); | 113 REPORTER_ASSERT(reporter, size1 == size3); |
114 REPORTER_ASSERT(reporter, are_equal(reporter, m, m2)); | 114 REPORTER_ASSERT(reporter, are_equal(reporter, m, m2)); |
115 | 115 |
116 char buffer2[kBufferSize]; | 116 char buffer2[kBufferSize]; |
117 size3 = m2.writeToMemory(buffer2); | 117 size3 = m2.writeToMemory(buffer2); |
118 REPORTER_ASSERT(reporter, size1 == size3); | 118 REPORTER_ASSERT(reporter, size1 == size3); |
119 REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); | 119 REPORTER_ASSERT(reporter, memcmp(buffer, buffer2, size1) == 0); |
120 } | 120 } |
121 | 121 |
122 static void test_matrix_min_max_scale(skiatest::Reporter* reporter) { | 122 static void test_matrix_min_max_scale(skiatest::Reporter* reporter) { |
| 123 SkScalar scales[2]; |
| 124 bool success; |
| 125 |
123 SkMatrix identity; | 126 SkMatrix identity; |
124 identity.reset(); | 127 identity.reset(); |
125 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMinScale()); | 128 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMinScale()); |
126 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxScale()); | 129 REPORTER_ASSERT(reporter, SK_Scalar1 == identity.getMaxScale()); |
| 130 success = identity.getMinMaxScales(scales); |
| 131 REPORTER_ASSERT(reporter, success && SK_Scalar1 == scales[0] && SK_Scalar1 =
= scales[1]); |
127 | 132 |
128 SkMatrix scale; | 133 SkMatrix scale; |
129 scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); | 134 scale.setScale(SK_Scalar1 * 2, SK_Scalar1 * 4); |
130 REPORTER_ASSERT(reporter, SK_Scalar1 * 2 == scale.getMinScale()); | 135 REPORTER_ASSERT(reporter, SK_Scalar1 * 2 == scale.getMinScale()); |
131 REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxScale()); | 136 REPORTER_ASSERT(reporter, SK_Scalar1 * 4 == scale.getMaxScale()); |
| 137 success = scale.getMinMaxScales(scales); |
| 138 REPORTER_ASSERT(reporter, success && SK_Scalar1 * 2 == scales[0] && SK_Scala
r1 * 4 == scales[1]); |
132 | 139 |
133 SkMatrix rot90Scale; | 140 SkMatrix rot90Scale; |
134 rot90Scale.setRotate(90 * SK_Scalar1); | 141 rot90Scale.setRotate(90 * SK_Scalar1); |
135 rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); | 142 rot90Scale.postScale(SK_Scalar1 / 4, SK_Scalar1 / 2); |
136 REPORTER_ASSERT(reporter, SK_Scalar1 / 4 == rot90Scale.getMinScale()); | 143 REPORTER_ASSERT(reporter, SK_Scalar1 / 4 == rot90Scale.getMinScale()); |
137 REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxScale()); | 144 REPORTER_ASSERT(reporter, SK_Scalar1 / 2 == rot90Scale.getMaxScale()); |
| 145 success = rot90Scale.getMinMaxScales(scales); |
| 146 REPORTER_ASSERT(reporter, success && SK_Scalar1 / 4 == scales[0] && SK_Scal
ar1 / 2 == scales[1]); |
138 | 147 |
139 SkMatrix rotate; | 148 SkMatrix rotate; |
140 rotate.setRotate(128 * SK_Scalar1); | 149 rotate.setRotate(128 * SK_Scalar1); |
141 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMinScale
() ,SK_ScalarNearlyZero)); | 150 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMinScale
(), SK_ScalarNearlyZero)); |
142 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMaxScale
(), SK_ScalarNearlyZero)); | 151 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, rotate.getMaxScale
(), SK_ScalarNearlyZero)); |
| 152 success = rotate.getMinMaxScales(scales); |
| 153 REPORTER_ASSERT(reporter, success); |
| 154 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, scales[0], SK_Scal
arNearlyZero)); |
| 155 REPORTER_ASSERT(reporter, SkScalarNearlyEqual(SK_Scalar1, scales[1], SK_Scal
arNearlyZero)); |
143 | 156 |
144 SkMatrix translate; | 157 SkMatrix translate; |
145 translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); | 158 translate.setTranslate(10 * SK_Scalar1, -5 * SK_Scalar1); |
146 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMinScale()); | 159 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMinScale()); |
147 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxScale()); | 160 REPORTER_ASSERT(reporter, SK_Scalar1 == translate.getMaxScale()); |
| 161 success = translate.getMinMaxScales(scales); |
| 162 REPORTER_ASSERT(reporter, success && SK_Scalar1 == scales[0] && SK_Scalar1 =
= scales[1]); |
148 | 163 |
149 SkMatrix perspX; | 164 SkMatrix perspX; |
150 perspX.reset(); | 165 perspX.reset(); |
151 perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000)); | 166 perspX.setPerspX(SkScalarToPersp(SK_Scalar1 / 1000)); |
152 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMinScale()); | 167 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMinScale()); |
153 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxScale()); | 168 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspX.getMaxScale()); |
| 169 // Verify that getMinMaxScales() doesn't update the scales array on failure. |
| 170 scales[0] = -5; |
| 171 scales[1] = -5; |
| 172 success = perspX.getMinMaxScales(scales); |
| 173 REPORTER_ASSERT(reporter, !success && -5 * SK_Scalar1 == scales[0] && -5 * S
K_Scalar1 == scales[1]); |
154 | 174 |
155 SkMatrix perspY; | 175 SkMatrix perspY; |
156 perspY.reset(); | 176 perspY.reset(); |
157 perspY.setPerspY(SkScalarToPersp(-SK_Scalar1 / 500)); | 177 perspY.setPerspY(SkScalarToPersp(-SK_Scalar1 / 500)); |
158 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMinScale()); | 178 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMinScale()); |
159 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxScale()); | 179 REPORTER_ASSERT(reporter, -SK_Scalar1 == perspY.getMaxScale()); |
| 180 scales[0] = -5; |
| 181 scales[1] = -5; |
| 182 success = perspY.getMinMaxScales(scales); |
| 183 REPORTER_ASSERT(reporter, !success && -5 * SK_Scalar1 == scales[0] && -5 * S
K_Scalar1 == scales[1]); |
160 | 184 |
161 SkMatrix baseMats[] = {scale, rot90Scale, rotate, | 185 SkMatrix baseMats[] = {scale, rot90Scale, rotate, |
162 translate, perspX, perspY}; | 186 translate, perspX, perspY}; |
163 SkMatrix mats[2*SK_ARRAY_COUNT(baseMats)]; | 187 SkMatrix mats[2*SK_ARRAY_COUNT(baseMats)]; |
164 for (size_t i = 0; i < SK_ARRAY_COUNT(baseMats); ++i) { | 188 for (size_t i = 0; i < SK_ARRAY_COUNT(baseMats); ++i) { |
165 mats[i] = baseMats[i]; | 189 mats[i] = baseMats[i]; |
166 bool invertable = mats[i].invert(&mats[i + SK_ARRAY_COUNT(baseMats)]); | 190 bool invertable = mats[i].invert(&mats[i + SK_ARRAY_COUNT(baseMats)]); |
167 REPORTER_ASSERT(reporter, invertable); | 191 REPORTER_ASSERT(reporter, invertable); |
168 } | 192 } |
169 SkRandom rand; | 193 SkRandom rand; |
170 for (int m = 0; m < 1000; ++m) { | 194 for (int m = 0; m < 1000; ++m) { |
171 SkMatrix mat; | 195 SkMatrix mat; |
172 mat.reset(); | 196 mat.reset(); |
173 for (int i = 0; i < 4; ++i) { | 197 for (int i = 0; i < 4; ++i) { |
174 int x = rand.nextU() % SK_ARRAY_COUNT(mats); | 198 int x = rand.nextU() % SK_ARRAY_COUNT(mats); |
175 mat.postConcat(mats[x]); | 199 mat.postConcat(mats[x]); |
176 } | 200 } |
177 | 201 |
178 SkScalar minScale = mat.getMinScale(); | 202 SkScalar minScale = mat.getMinScale(); |
179 SkScalar maxScale = mat.getMaxScale(); | 203 SkScalar maxScale = mat.getMaxScale(); |
180 REPORTER_ASSERT(reporter, (minScale < 0) == (maxScale < 0)); | 204 REPORTER_ASSERT(reporter, (minScale < 0) == (maxScale < 0)); |
181 REPORTER_ASSERT(reporter, (maxScale < 0) == mat.hasPerspective()); | 205 REPORTER_ASSERT(reporter, (maxScale < 0) == mat.hasPerspective()); |
182 | 206 |
| 207 SkScalar scales[2]; |
| 208 bool success = mat.getMinMaxScales(scales); |
| 209 REPORTER_ASSERT(reporter, success == !mat.hasPerspective()); |
| 210 REPORTER_ASSERT(reporter, !success || (scales[0] == minScale && scales[1
] == maxScale)); |
| 211 |
183 if (mat.hasPerspective()) { | 212 if (mat.hasPerspective()) { |
184 m -= 1; // try another non-persp matrix | 213 m -= 1; // try another non-persp matrix |
185 continue; | 214 continue; |
186 } | 215 } |
187 | 216 |
188 // test a bunch of vectors. All should be scaled by between minScale and
maxScale | 217 // test a bunch of vectors. All should be scaled by between minScale and
maxScale |
189 // (modulo some error) and we should find a vector that is scaled by alm
ost each. | 218 // (modulo some error) and we should find a vector that is scaled by alm
ost each. |
190 static const SkScalar gVectorScaleTol = (105 * SK_Scalar1) / 100; | 219 static const SkScalar gVectorScaleTol = (105 * SK_Scalar1) / 100; |
191 static const SkScalar gCloseScaleTol = (97 * SK_Scalar1) / 100; | 220 static const SkScalar gCloseScaleTol = (97 * SK_Scalar1) / 100; |
192 SkScalar max = 0, min = SK_ScalarMax; | 221 SkScalar max = 0, min = SK_ScalarMax; |
(...skipping 598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
791 a.setTranslate(10, 20); | 820 a.setTranslate(10, 20); |
792 | 821 |
793 SkMatrix b; | 822 SkMatrix b; |
794 b.setScale(3, 5); | 823 b.setScale(3, 5); |
795 | 824 |
796 SkMatrix expected; | 825 SkMatrix expected; |
797 expected.setConcat(a,b); | 826 expected.setConcat(a,b); |
798 | 827 |
799 REPORTER_ASSERT(r, expected == SkMatrix::Concat(a, b)); | 828 REPORTER_ASSERT(r, expected == SkMatrix::Concat(a, b)); |
800 } | 829 } |
OLD | NEW |