Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright (C) 2014 Google Inc. All rights reserved. | |
| 3 * | |
| 4 * Redistribution and use in source and binary forms, with or without | |
| 5 * modification, are permitted provided that the following conditions | |
| 6 * are met: | |
| 7 * 1. Redistributions of source code must retain the above copyright | |
| 8 * notice, this list of conditions and the following disclaimer. | |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | |
| 10 * notice, this list of conditions and the following disclaimer in the | |
| 11 * documentation and/or other materials provided with the distribution. | |
| 12 * | |
| 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' AND AN Y | |
| 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | |
| 15 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
| 16 * DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS BE LIABLE FOR AN Y | |
| 17 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | |
| 18 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | |
| 19 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND O N | |
| 20 * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 21 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | |
| 22 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 23 */ | |
| 24 | |
| 25 #include "config.h" | |
| 26 #include "platform/transforms/TransformOperations.h" | |
| 27 | |
| 28 #include "platform/geometry/FloatBox.h" | |
| 29 #include "platform/geometry/FloatBoxTestHelpers.h" | |
| 30 #include "platform/transforms/IdentityTransformOperation.h" | |
| 31 #include "platform/transforms/Matrix3DTransformOperation.h" | |
| 32 #include "platform/transforms/MatrixTransformOperation.h" | |
| 33 #include "platform/transforms/PerspectiveTransformOperation.h" | |
| 34 #include "platform/transforms/RotateTransformOperation.h" | |
| 35 #include "platform/transforms/ScaleTransformOperation.h" | |
| 36 #include "platform/transforms/SkewTransformOperation.h" | |
| 37 #include "platform/transforms/TranslateTransformOperation.h" | |
| 38 | |
| 39 #include <gtest/gtest.h> | |
| 40 | |
| 41 using namespace WebCore; | |
| 42 namespace { | |
| 43 | |
| 44 static const TransformOperations identityOperations; | |
| 45 | |
| 46 static void EmpiricallyTestBounds(const TransformOperations& from, | |
| 47 const TransformOperations& to, | |
| 48 const double& minProgress, | |
| 49 const double& maxProgress) | |
| 50 { | |
| 51 FloatBox box(200, 500, 100, 100, 300, 200); | |
| 52 FloatBox bounds; | |
| 53 | |
| 54 EXPECT_TRUE(to.blendedBoundsForBox(box, from, minProgress, maxProgress, &bou nds)); | |
| 55 bool firstTime= true; | |
| 56 | |
| 57 FloatBox empiricalBounds; | |
| 58 static const size_t numSteps = 10; | |
| 59 for (size_t step = 0; step < numSteps; ++step) { | |
| 60 float t = step / (numSteps - 1); | |
| 61 t = minProgress + (maxProgress - minProgress) * t; | |
| 62 TransformOperations operations = from.blend(to, t); | |
| 63 TransformationMatrix matrix; | |
| 64 operations.apply(FloatSize(0, 0), matrix); | |
| 65 FloatBox transformed = box; | |
| 66 matrix.transformBox(transformed); | |
| 67 | |
| 68 if (firstTime) | |
| 69 empiricalBounds = transformed; | |
| 70 else | |
| 71 empiricalBounds.unionBounds(transformed); | |
| 72 firstTime = false; | |
| 73 } | |
| 74 | |
| 75 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertContains, bounds, empiricalBounds); | |
| 76 } | |
| 77 | |
| 78 TEST(TransformOperationsTest, AbsoluteAnimatedTranslatedBoundsTest) | |
| 79 { | |
| 80 TransformOperations fromOps; | |
| 81 TransformOperations toOps; | |
| 82 fromOps.operations().append(TranslateTransformOperation::create(Length(-30, WebCore::Fixed), Length(20, WebCore::Fixed), 15, TransformOperation::Translate3D )); | |
| 83 toOps.operations().append(TranslateTransformOperation::create(Length(10, Web Core::Fixed), Length(10, WebCore::Fixed), 200, TransformOperation::Translate3D)) ; | |
| 84 FloatBox box(0, 0, 0, 10, 10, 10); | |
| 85 FloatBox bounds; | |
| 86 | |
| 87 EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds )); | |
| 88 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 20, 2 0, 210), bounds); | |
| 89 | |
| 90 EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, toOps, 0, 1, &bounds )); | |
| 91 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 20, 2 0, 210), bounds); | |
| 92 | |
| 93 EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &boun ds)); | |
| 94 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-30, 0, 0, 40, 30, 25), bounds); | |
| 95 | |
| 96 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 97 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-30, 10, 15, 5 0, 20, 195), bounds); | |
| 98 | |
| 99 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.25, &bounds)); | |
| 100 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-50, 7.5, -77. 5, 80, 27.5, 333.75), bounds); | |
| 101 | |
| 102 } | |
| 103 | |
| 104 TEST(TransformOperationsTest, EmpiricalAnimatedTranslatedBoundsTest) | |
| 105 { | |
| 106 float testTransforms[][2][3] = { | |
| 107 { { 0, 0, 0 }, { 10, 10, 0 } } | |
| 108 , { { -100, 202.5, -32.6 }, { 43.2, 56.1, 89.75 } } | |
| 109 , { { 43.2, 56.1, 89.75 }, { -100, 202.5, -32.6 } } | |
| 110 }; | |
| 111 | |
| 112 // All proressions for animations start and end at 0, 1 respectively, | |
| 113 // we can go outside of these bounds, but will always at least contain [0,1] | |
|
Ian Vollick
2014/06/16 15:23:38
nit: please add a period.
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 114 float progress[][2] = { | |
| 115 { 0, 1 }, | |
|
Ian Vollick
2014/06/16 15:23:38
nit: you've got commas at the end of the lines her
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 116 { -.25, 1.25 } | |
| 117 }; | |
| 118 | |
| 119 for (size_t i = 0; i < sizeof(testTransforms) / sizeof(testTransforms[0]); + +i) { | |
|
Ian Vollick
2014/06/16 15:23:38
WTF_ARRAY_LENGTH?
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 120 for (size_t j = 0; j < sizeof(progress) / sizeof(progress[0]); ++j) { | |
| 121 TransformOperations fromOps; | |
| 122 TransformOperations toOps; | |
| 123 fromOps.operations().append(TranslateTransformOperation::create(Leng th(testTransforms[i][0][0], WebCore::Fixed), Length(testTransforms[i][0][1], Web Core::Fixed), testTransforms[i][0][2], TransformOperation::Translate3D)); | |
| 124 toOps.operations().append(TranslateTransformOperation::create(Length (testTransforms[i][1][0], WebCore::Fixed), Length(testTransforms[i][1][1], WebCo re::Fixed), testTransforms[i][1][2], TransformOperation::Translate3D)); | |
| 125 EmpiricallyTestBounds(fromOps, toOps, 0, 1); | |
| 126 } | |
| 127 } | |
| 128 } | |
| 129 | |
| 130 TEST(TransformOperationsTest, AbsoluteAnimatedScaleBoundsTest) | |
| 131 { | |
| 132 TransformOperations fromOps; | |
| 133 TransformOperations toOps; | |
| 134 fromOps.operations().append(ScaleTransformOperation::create(4, -3, Transform Operation::Scale)); | |
| 135 toOps.operations().append(ScaleTransformOperation::create(5, 2, TransformOpe ration::Scale)); | |
| 136 | |
| 137 FloatBox box(0, 0, 0, 10, 10, 10); | |
| 138 FloatBox bounds; | |
| 139 | |
| 140 | |
| 141 EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds )); | |
| 142 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 50, 2 0, 10), bounds); | |
| 143 | |
| 144 EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, toOps, 0, 1, &bounds )); | |
| 145 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 50, 2 0, 10), bounds); | |
| 146 | |
| 147 EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &boun ds)); | |
| 148 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -30, 0, 40, 40, 10), bounds); | |
| 149 | |
| 150 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 151 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -30, 0, 50, 50, 10), bounds); | |
| 152 | |
| 153 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.25, &bounds)); | |
| 154 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, -55, 0, 52. 5, 87.5, 10), bounds); | |
| 155 } | |
| 156 | |
| 157 TEST(TransformOperationsTest, EmpiricalAnimatedScaleBoundsTest) | |
| 158 { | |
| 159 | |
| 160 float testTransforms[][2][3] = { | |
| 161 { { 1, 1, 1 }, { 10, 10, -32}} | |
| 162 , { { 1, 2, 5 }, { -1, -2, -4}} | |
| 163 , { { 0, 0, 0 }, { 1, 2, 3}} | |
| 164 , { { 0, 0, 0 }, { 0, 0, 0}} | |
| 165 }; | |
| 166 | |
| 167 // All proressions for animations start and end at 0, 1 respectively, | |
|
Ian Vollick
2014/06/16 15:23:38
nit: typo. progressions
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 168 // we can go outside of these bounds, but will always at least contain [0,1] | |
|
Ian Vollick
2014/06/16 15:23:38
period, pls.
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 169 float progress[][2] = { | |
| 170 { 0, 1 } | |
| 171 , { -.25f, 1.25f } | |
| 172 }; | |
| 173 | |
| 174 for (size_t i = 0; i < sizeof(testTransforms) / sizeof(testTransforms[0]); + +i) { | |
| 175 for (size_t j = 0; j < sizeof(progress) / sizeof(progress[0]); ++j) { | |
| 176 TransformOperations fromOps; | |
| 177 TransformOperations toOps; | |
| 178 fromOps.operations().append(TranslateTransformOperation::create(Leng th(testTransforms[i][0][0], WebCore::Fixed), Length(testTransforms[i][0][1], Web Core::Fixed), testTransforms[i][0][2], TransformOperation::Translate3D)); | |
| 179 toOps.operations().append(TranslateTransformOperation::create(Length (testTransforms[i][1][0], WebCore::Fixed), Length(testTransforms[i][1][1], WebCo re::Fixed), testTransforms[i][1][2], TransformOperation::Translate3D)); | |
| 180 EmpiricallyTestBounds(fromOps, toOps, 0, 1); | |
| 181 } | |
| 182 } | |
| 183 } | |
| 184 | |
| 185 TEST(TransformOperationsTest, AbsoluteAnimatedRotationBounds) | |
| 186 { | |
| 187 TransformOperations fromOps; | |
| 188 TransformOperations toOps; | |
| 189 fromOps.operations().append(RotateTransformOperation::create(0, TransformOpe ration::Rotate)); | |
| 190 toOps.operations().append(RotateTransformOperation::create(360, TransformOpe ration::Rotate)); | |
| 191 float sqrt2 = sqrt(2); | |
| 192 FloatBox box(-sqrt2, -sqrt2, 0, sqrt2, sqrt2, 0); | |
| 193 FloatBox bounds; | |
| 194 | |
| 195 // Since we're rotating 360 degrees, any box with dimensions between 0 and | |
| 196 // 2 * sqrt(2) should give the same result; | |
| 197 float sizes[] = { 0, 0.1f, sqrt2, 2*sqrt2 }; | |
| 198 toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds); | |
| 199 for (size_t i = 0; i < sizeof(sizes) / sizeof(sizes[0]); ++i) { | |
| 200 box.setSize(FloatPoint3D(sizes[i], sizes[i], 0)); | |
| 201 | |
| 202 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 203 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-2, -2, 0, 4, 4, 0), bounds); | |
| 204 } | |
| 205 } | |
| 206 | |
| 207 TEST(TransformOperationsTest, AbsoluteAnimatedExtremeRotationBounds) | |
| 208 { | |
| 209 // If the normal is off-plane, we can have up to 6 exrema (min/max in each | |
| 210 // dimension between) the endpoints of the arg. This makes sure we are | |
| 211 // catching all 6. | |
| 212 TransformOperations fromOps; | |
| 213 TransformOperations toOps; | |
| 214 fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, Tr ansformOperation::Rotate3D)); | |
| 215 toOps.operations().append(RotateTransformOperation::create(1, 1, 1, 390, Tr ansformOperation::Rotate3D)); | |
| 216 | |
| 217 FloatBox box(1, 0, 0, 0, 0, 0); | |
| 218 FloatBox bounds; | |
| 219 float min = -1 / 3; | |
| 220 float max = 1; | |
| 221 float size = max - min; | |
| 222 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 223 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(min, min, min, size, size, size), bounds); | |
| 224 } | |
| 225 | |
| 226 TEST(TransformOperationsTest, AbsoluteAnimatedAxisRotationBounds) | |
| 227 { | |
| 228 // We can handle rotations about a single axis. If the axes are different, | |
| 229 // we revert to matrix interpolation for which inflated bounds cannot be | |
| 230 // computed. | |
| 231 TransformOperations fromOps; | |
| 232 TransformOperations toSame; | |
| 233 TransformOperations toOpposite; | |
| 234 TransformOperations toDifferent; | |
| 235 fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, Tr ansformOperation::Rotate3D)); | |
| 236 toSame.operations().append(RotateTransformOperation::create(1, 1, 1, 390, T ransformOperation::Rotate3D)); | |
| 237 toOpposite.operations().append(RotateTransformOperation::create(-1, -1, -1, 390, TransformOperation::Rotate3D)); | |
| 238 toDifferent.operations().append(RotateTransformOperation::create(1, 3, 1, 39 0, TransformOperation::Rotate3D)); | |
| 239 | |
| 240 FloatBox box(1, 0, 0, 0, 0, 0); | |
| 241 FloatBox bounds; | |
| 242 EXPECT_TRUE(toSame.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 243 EXPECT_TRUE(toOpposite.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 244 EXPECT_FALSE(toDifferent.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 245 } | |
| 246 | |
| 247 TEST(TransformOperationsTest, AbsoluteAnimatedOnAxisRotationBounds) | |
| 248 { | |
| 249 // If we rotate a point that is on the axis of rotation, the box should not | |
| 250 // change at all. | |
| 251 TransformOperations fromOps; | |
| 252 TransformOperations toOps; | |
| 253 fromOps.operations().append(RotateTransformOperation::create(1, 1, 1, 30, Tr ansformOperation::Rotate3D)); | |
| 254 toOps.operations().append(RotateTransformOperation::create(1, 1, 1, 390, Tr ansformOperation::Rotate3D)); | |
| 255 | |
| 256 FloatBox box(1, 1, 1, 0, 0, 0); | |
| 257 FloatBox bounds; | |
| 258 | |
| 259 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 260 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, box, bounds); | |
| 261 } | |
| 262 | |
| 263 // This would have been best as anonymous structs, but |arraysize| does not get | |
|
Ian Vollick
2014/06/16 15:23:38
Does WTF_ARRAY_SIZE have the same limitation? If n
awoloszyn
2014/06/17 14:26:01
Fixed the comment, but WTF_ARRAY_SIZE has the same
| |
| 264 // along with anonymous structs (and using ARRAYSIZE_UNSAFE seemed like a worse | |
| 265 // option). | |
| 266 struct ProblematicAxisTest { | |
| 267 double x; | |
| 268 double y; | |
| 269 double z; | |
| 270 FloatBox expected; | |
| 271 }; | |
| 272 | |
|
Ian Vollick
2014/06/16 15:23:38
nit: extra line of ws.
awoloszyn
2014/06/17 14:26:01
Done.
| |
| 273 | |
| 274 TEST(TransformOperationsTest, AbsoluteAnimatedProblematicAxisRotationBounds) | |
| 275 { | |
| 276 // Zeros in the components of the axis osf rotation turned out to be tricky to | |
| 277 // deal with in practice. This function tests some potentially problematic | |
| 278 // axes to ensure sane behavior. | |
| 279 | |
| 280 // Some common values used in the expected boxes. | |
| 281 float dim1 = 0.292893f; | |
| 282 float dim2 = sqrt(2); | |
| 283 float dim3 = 2 * dim2; | |
| 284 | |
| 285 ProblematicAxisTest tests[] = { | |
| 286 { 0, 0, 0, FloatBox(1, 1, 1, 0, 0, 0) }, | |
| 287 { 1, 0, 0, FloatBox(1, -dim2, -dim2, 0, dim3, dim3) }, | |
| 288 { 0, 1, 0, FloatBox(-dim2, 1, -dim2, dim3, 0, dim3) }, | |
| 289 { 0, 0, 1, FloatBox(-dim2, -dim2, 1, dim3, dim3, 0) }, | |
| 290 { 1, 1, 0, FloatBox(dim1, dim1, -1, dim2, dim2, 2) }, | |
| 291 { 0, 1, 1, FloatBox(-1, dim1, dim1, 2, dim2, dim2) }, | |
| 292 { 1, 0, 1, FloatBox(dim1, -1, dim1, dim2, 2, dim2) } | |
| 293 }; | |
| 294 | |
| 295 for (size_t i = 0; i < sizeof(tests) / sizeof(tests[0]); ++i) { | |
| 296 float x = tests[i].x; | |
| 297 float y = tests[i].y; | |
| 298 float z = tests[i].z; | |
| 299 TransformOperations fromOps; | |
| 300 fromOps.operations().append(RotateTransformOperation::create(x, y, z, 0, TransformOperation::Rotate3D)); | |
| 301 TransformOperations toOps; | |
| 302 toOps.operations().append(RotateTransformOperation::create(x, y, z, 360, TransformOperation::Rotate3D)); | |
| 303 FloatBox box(1, 1, 1, 0, 0, 0); | |
| 304 FloatBox bounds; | |
| 305 | |
| 306 EXPECT_TRUE(toOps.blendedBoundsForBox( | |
| 307 box, fromOps, 0, 1, &bounds)); | |
| 308 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, tests[i].expected, bounds); | |
| 309 } | |
| 310 } | |
| 311 | |
| 312 | |
| 313 TEST(TransformOperationsTest, BlendedBoundsForRotationEmpiricalTests) | |
| 314 { | |
| 315 float axes[][3] = { | |
| 316 { 1, 1, 1 } | |
| 317 , { -1, -1, -1 } | |
| 318 , { -1, 2, 3 } | |
| 319 , { 1, -2, 3 } | |
| 320 , { 0, 0, 0 } | |
| 321 , { 1, 0, 0 } | |
| 322 , { 0, 1, 0 } | |
| 323 , { 0, 0, 1 } | |
| 324 , { 1, 1, 0 } | |
| 325 , { 0, 1, 1 } | |
| 326 , { 1, 0, 1 } | |
| 327 , { -1, 0, 0 } | |
| 328 , { 0, -1, 0 } | |
| 329 , { 0, 0, -1 } | |
| 330 , { -1, -1, 0 } | |
| 331 , { 0, -1, -1 } | |
| 332 , { -1, 0, -1 } | |
| 333 }; | |
| 334 | |
| 335 float angles[][2] = { | |
| 336 { 5, 100 } | |
| 337 , { 10, 5 } | |
| 338 , { 0, 360 } | |
| 339 , { 20, 180 } | |
| 340 , { -20, -180 } | |
| 341 , { 180, -220 } | |
| 342 , { 220, 320 } | |
| 343 , { 1020, 1120 } | |
| 344 , {-3200, 120 } | |
| 345 , {-9000, -9050 } | |
| 346 }; | |
| 347 | |
| 348 float progress[][2] = { | |
| 349 { 0, 1 } | |
| 350 , { -0.25f, 1.25f } | |
| 351 }; | |
| 352 | |
| 353 for (size_t i = 0; i < sizeof(axes) / sizeof(axes[0]); ++i) { | |
| 354 for (size_t j = 0; j < sizeof(angles) / sizeof(angles[0]); ++j) { | |
| 355 for (size_t k = 0; k < sizeof(progress) / sizeof(progress[0]); ++k) { | |
| 356 float x = axes[i][0]; | |
| 357 float y = axes[i][1]; | |
| 358 float z = axes[i][2]; | |
| 359 | |
| 360 TransformOperations fromOps; | |
| 361 TransformOperations toOps; | |
| 362 | |
| 363 fromOps.operations().append(RotateTransformOperation::create(x, y, z, angles[j][0], TransformOperation::Rotate3D)); | |
| 364 toOps.operations().append(RotateTransformOperation::create(x, y, z, angles[j][1], TransformOperation::Rotate3D)); | |
| 365 EmpiricallyTestBounds(fromOps, toOps, progress[k][0], progress[k ][1]); | |
| 366 } | |
| 367 } | |
| 368 } | |
| 369 } | |
| 370 | |
| 371 TEST(TransformOperationsTest, AbsoluteAnimatedPerspectiveBoundsTest) | |
| 372 { | |
| 373 TransformOperations fromOps; | |
| 374 TransformOperations toOps; | |
| 375 fromOps.operations().append(PerspectiveTransformOperation::create(10)); | |
| 376 toOps.operations().append(PerspectiveTransformOperation::create(30)); | |
| 377 FloatBox box(0, 0, 0, 10, 10, 10); | |
| 378 FloatBox bounds; | |
| 379 toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds); | |
| 380 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 15, 1 5, 15), bounds); | |
| 381 | |
| 382 fromOps.blendedBoundsForBox(box, toOps, -0.25, 1.25, &bounds); | |
| 383 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-40, -40, -40, 52, 52, 52), bounds); | |
| 384 } | |
| 385 | |
| 386 TEST(TransformOperationsTest, EmpiricalAnimatedPerspectiveBoundsTest) | |
| 387 { | |
| 388 float depths[][2] = { | |
| 389 { 600, 400 } | |
| 390 , { 800, 1000 } | |
| 391 , { 800, std::numeric_limits<float>::infinity() } | |
| 392 }; | |
| 393 | |
| 394 float progress[][2] = { | |
| 395 { 0, 1 } | |
| 396 , {-0.1f, 1.1f } | |
| 397 }; | |
| 398 | |
| 399 for (size_t i = 0; i < sizeof(depths) / sizeof(depths[0]); ++i) { | |
| 400 for (size_t j = 0; j < sizeof(progress) / sizeof(progress[0]); ++j) { | |
| 401 TransformOperations fromOps; | |
| 402 TransformOperations toOps; | |
| 403 | |
| 404 fromOps.operations().append(PerspectiveTransformOperation::create(de pths[i][0])); | |
| 405 toOps.operations().append(PerspectiveTransformOperation::create(dept hs[i][1])); | |
| 406 | |
| 407 EmpiricallyTestBounds(fromOps, toOps, progress[j][0], progress[j][1] ); | |
| 408 } | |
| 409 } | |
| 410 } | |
| 411 | |
| 412 | |
| 413 TEST(TransformOperationsTest, AnimatedSkewBoundsTest) | |
| 414 { | |
| 415 TransformOperations fromOps; | |
| 416 TransformOperations toOps; | |
| 417 fromOps.operations().append(SkewTransformOperation::create(-45, 0, Transform Operation::Skew)); | |
| 418 toOps.operations().append(SkewTransformOperation::create(0, 45, TransformOpe ration::Skew)); | |
| 419 FloatBox box(0, 0, 0, 10, 10, 10); | |
| 420 FloatBox bounds; | |
| 421 | |
| 422 toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds); | |
| 423 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(0, 0, 0, 10, 2 0, 10), bounds); | |
| 424 | |
| 425 identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &bounds); | |
| 426 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 10, 10), bounds); | |
| 427 | |
| 428 toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds); | |
| 429 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 20, 10), bounds); | |
| 430 | |
| 431 fromOps.blendedBoundsForBox(box, toOps, 0, 1, &bounds); | |
| 432 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-10, 0, 0, 20, 20, 10), bounds); | |
| 433 } | |
| 434 | |
| 435 TEST(TransformOperationsTest, NonCommutativeRotations) | |
| 436 { | |
| 437 TransformOperations fromOps; | |
| 438 fromOps.operations().append(RotateTransformOperation::create(1, 0, 0, 0, Tra nsformOperation::Rotate3D)); | |
| 439 fromOps.operations().append(RotateTransformOperation::create(0, 1, 0, 0, Tra nsformOperation::Rotate3D)); | |
| 440 TransformOperations toOps; | |
| 441 toOps.operations().append(RotateTransformOperation::create(1, 0, 0, 45, Tran sformOperation::Rotate3D)); | |
| 442 toOps.operations().append(RotateTransformOperation::create(0, 1, 0, 135, Tra nsformOperation::Rotate3D)); | |
| 443 | |
| 444 FloatBox box(0, 0, 0, 1, 1, 1); | |
| 445 FloatBox bounds; | |
| 446 | |
| 447 double minProgress = 0; | |
| 448 double maxProgress = 1; | |
| 449 EXPECT_TRUE(toOps.blendedBoundsForBox( | |
| 450 box, fromOps, minProgress, maxProgress, &bounds)); | |
| 451 | |
| 452 TransformOperations operations = toOps.blend(fromOps, maxProgress); | |
| 453 TransformationMatrix blendedTransform; | |
| 454 operations.apply(FloatSize(0, 0), blendedTransform); | |
| 455 | |
| 456 FloatPoint3D blendedPoint(0.9f, 0.9f, 0); | |
| 457 blendedPoint = blendedTransform.mapPoint(blendedPoint); | |
| 458 FloatBox expandedBounds = bounds; | |
| 459 expandedBounds.expandTo(blendedPoint); | |
| 460 | |
| 461 ASSERT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, bounds, expandedBounds) ; | |
| 462 } | |
| 463 | |
| 464 TEST(TransformOperationsTest, AbsoluteSequenceBoundsTest) | |
| 465 { | |
| 466 TransformOperations fromOps; | |
| 467 TransformOperations toOps; | |
| 468 | |
| 469 fromOps.operations().append(TranslateTransformOperation::create(Length(1, Fi xed), Length(-5, Fixed), 1, TransformOperation::Translate3D)); | |
| 470 fromOps.operations().append(ScaleTransformOperation::create(-1, 2, 3, Transf ormOperation::Scale3D)); | |
| 471 fromOps.operations().append(TranslateTransformOperation::create(Length(2, Fi xed), Length(4, Fixed), -1, TransformOperation::Translate3D)); | |
| 472 | |
| 473 toOps.operations().append(TranslateTransformOperation::create(Length(13, Fix ed), Length(-1, Fixed), 5, TransformOperation::Translate3D)); | |
| 474 toOps.operations().append(ScaleTransformOperation::create(-3, -2, 5, Transfo rmOperation::Scale3D)); | |
| 475 toOps.operations().append(TranslateTransformOperation::create(Length(6, Fixe d), Length(-2, Fixed), 3, TransformOperation::Translate3D)); | |
| 476 | |
| 477 FloatBox box(1, 2, 3, 4, 4, 4); | |
| 478 FloatBox bounds; | |
| 479 | |
| 480 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, -0.5, 1.5, &bounds)); | |
| 481 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-57, -59, -1, 76, 112, 80), bounds); | |
| 482 | |
| 483 EXPECT_TRUE(toOps.blendedBoundsForBox(box, fromOps, 0, 1, &bounds)); | |
| 484 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-32, -25, 7, 4 2, 44, 48), bounds); | |
| 485 | |
| 486 EXPECT_TRUE(toOps.blendedBoundsForBox(box, identityOperations, 0, 1, &bounds )); | |
| 487 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-33, -13, 3, 5 7, 19, 52), bounds); | |
| 488 | |
| 489 EXPECT_TRUE(identityOperations.blendedBoundsForBox(box, fromOps, 0, 1, &boun ds)); | |
| 490 EXPECT_PRED_FORMAT2(FloatBoxTest::AssertAlmostEqual, FloatBox(-7, -3, 2, 15, 23, 20), bounds); | |
| 491 } | |
| 492 | |
| 493 } // namespace | |
| OLD | NEW |