Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(56)

Side by Side Diff: tests/MatrixTest.cpp

Issue 298473002: Add function to get both min and max scale factors from matrix (Closed) Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Address comments Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/core/SkMatrix.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « src/core/SkMatrix.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698