15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/interpolated_transform.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/rect.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void CheckApproximatelyEqual(const gfx::Transform& lhs, 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Transform& rhs) { 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 4; ++i) { 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int j = 0; j < 4; ++j) { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FLOAT_EQ(lhs.matrix().get(i, j), rhs.matrix().get(i, j)); 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, InterpolatedRotation) { 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedRotation interpolated_rotation(0, 100); 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedRotation interpolated_rotation_diff_start_end( 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 0, 100, 100, 200); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i <= 100; ++i) { 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform rotation; 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) rotation.Rotate(i); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform interpolated = interpolated_rotation.Interpolate(i / 100.0f); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(rotation, interpolated); 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interpolated = interpolated_rotation_diff_start_end.Interpolate(i + 100); 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(rotation, interpolated); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, InterpolatedScale) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedScale interpolated_scale(gfx::Point3F(0, 0, 0), 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F(100, 100, 100)); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedScale interpolated_scale_diff_start_end( 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F(0, 0, 0), gfx::Point3F(100, 100, 100), 100, 200); 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i <= 100; ++i) { 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform scale; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scale.Scale(i, i); 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform interpolated = interpolated_scale.Interpolate(i / 100.0f); 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(scale, interpolated); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interpolated = interpolated_scale_diff_start_end.Interpolate(i + 100); 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(scale, interpolated); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, InterpolatedTranslate) { 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedTranslation interpolated_xform(gfx::Point(0, 0), 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(100, 100)); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedTranslation interpolated_xform_diff_start_end( 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(0, 0), gfx::Point(100, 100), 100, 200); 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i <= 100; ++i) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform xform; 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) xform.Translate(i, i); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform interpolated = interpolated_xform.Interpolate(i / 100.0f); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(xform, interpolated); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) interpolated = interpolated_xform_diff_start_end.Interpolate(i + 100); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(xform, interpolated); 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, InterpolatedRotationAboutPivot) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point pivot(100, 100); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point above_pivot(100, 200); 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedRotation rot(0, 90); 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedTransformAboutPivot interpolated_xform( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pivot, 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedRotation(0, 90)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform result = interpolated_xform.Interpolate(0.0f); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(gfx::Transform(), result); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = interpolated_xform.Interpolate(1.0f); 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point expected_result = pivot; 83d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.TransformPoint(&pivot); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_result, pivot); 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result = gfx::Point(0, 100); 86d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.TransformPoint(&above_pivot); 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_result, above_pivot); 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, InterpolatedScaleAboutPivot) { 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point pivot(100, 100); 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point above_pivot(100, 200); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::InterpolatedTransformAboutPivot interpolated_xform( 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pivot, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedScale(gfx::Point3F(1, 1, 1), gfx::Point3F(2, 2, 2))); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform result = interpolated_xform.Interpolate(0.0f); 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CheckApproximatelyEqual(gfx::Transform(), result); 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result = interpolated_xform.Interpolate(1.0f); 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point expected_result = pivot; 100d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.TransformPoint(&pivot); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_result, pivot); 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) expected_result = gfx::Point(100, 300); 103d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) result.TransformPoint(&above_pivot); 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(expected_result, above_pivot); 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::InterpolatedTransform* GetScreenRotation(int degrees, bool reversed) { 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point old_pivot; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point new_pivot; 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int width = 1920; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int height = 180; 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) switch (degrees) { 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 90: 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_pivot = gfx::Point(width, 0); 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case -90: 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_pivot = gfx::Point(0, height); 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 180: 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) case 360: 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_pivot = old_pivot = gfx::Point(width / 2, height / 2); 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) break; 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> rotation( 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedTransformAboutPivot( 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) old_pivot, 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedRotation(reversed ? degrees : 0, 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) reversed ? 0 : degrees))); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> translation( 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedTranslation( 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(0, 0), 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(new_pivot.x() - old_pivot.x(), 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new_pivot.y() - old_pivot.y()))); 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale_factor = 0.9f; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> scale_down( 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedScale(1.0f, scale_factor, 0.0f, 0.5f)); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> scale_up( 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedScale(1.0f, 1.0f / scale_factor, 0.5f, 1.0f)); 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> to_return( 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedConstantTransform(gfx::Transform())); 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale_up->SetChild(scale_down.release()); 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) translation->SetChild(scale_up.release()); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation->SetChild(translation.release()); 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_return->SetChild(rotation.release()); 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) to_return->SetReversed(reversed); 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return to_return.release(); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, ScreenRotationEndsCleanly) { 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0; i < 2; ++i) { 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int degrees = -360; degrees <= 360; degrees += 90) { 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const bool reversed = i == 1; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> screen_rotation( 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetScreenRotation(degrees, reversed)); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform interpolated = screen_rotation->Interpolate(1.0f); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkMatrix44& m = interpolated.matrix(); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Upper-left 3x3 matrix should all be 0, 1 or -1. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int row = 0; row < 3; ++row) { 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int col = 0; col < 3; ++col) { 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float entry = m.get(row, col); 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::InterpolatedTransform* GetMaximize() { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect target_bounds(0, 0, 1920, 1080); 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Rect initial_bounds(30, 1000, 192, 108); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale_x = static_cast<float>( 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_bounds.height()) / initial_bounds.width(); 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float scale_y = static_cast<float>( 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_bounds.width()) / initial_bounds.height(); 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> scale( 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedScale(gfx::Point3F(1, 1, 1), 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point3F(scale_x, scale_y, 1))); 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> translation( 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedTranslation( 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(target_bounds.x() - initial_bounds.x(), 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) target_bounds.y() - initial_bounds.y()))); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> rotation( 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedRotation(0, 4.0f)); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> rotation_about_pivot( 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new ui::InterpolatedTransformAboutPivot( 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Point(initial_bounds.width() * 0.5, 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initial_bounds.height() * 0.5), 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation.release())); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scale->SetChild(translation.release()); 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_about_pivot->SetChild(scale.release()); 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rotation_about_pivot->SetReversed(true); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return rotation_about_pivot.release(); 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST(InterpolatedTransformTest, MaximizeEndsCleanly) { 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<ui::InterpolatedTransform> maximize(GetMaximize()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::Transform interpolated = maximize->Interpolate(1.0f); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SkMatrix44& m = interpolated.matrix(); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Upper-left 3x3 matrix should all be 0, 1 or -1. 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int row = 0; row < 3; ++row) { 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int col = 0; col < 3; ++col) { 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) float entry = m.get(row, col); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(entry == 0 || entry == 1 || entry == -1); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225