Home | History | Annotate | Download | only in gfx
      1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "ui/gfx/transform_util.h"
      6 
      7 #include "testing/gtest/include/gtest/gtest.h"
      8 #include "ui/gfx/point.h"
      9 #include "ui/gfx/point3_f.h"
     10 #include "ui/gfx/rect.h"
     11 
     12 namespace gfx {
     13 namespace {
     14 
     15 TEST(TransformUtilTest, GetScaleTransform) {
     16   const Point kAnchor(20, 40);
     17   const float kScale = 0.5f;
     18 
     19   Transform scale = GetScaleTransform(kAnchor, kScale);
     20 
     21   const int kOffset = 10;
     22   for (int sign_x = -1; sign_x <= 1; ++sign_x) {
     23     for (int sign_y = -1; sign_y <= 1; ++sign_y) {
     24       Point test(kAnchor.x() + sign_x * kOffset,
     25                  kAnchor.y() + sign_y * kOffset);
     26       scale.TransformPoint(&test);
     27 
     28       EXPECT_EQ(Point(kAnchor.x() + sign_x * kOffset * kScale,
     29                       kAnchor.y() + sign_y * kOffset * kScale),
     30                 test);
     31     }
     32   }
     33 }
     34 
     35 TEST(TransformUtilTest, SnapRotation) {
     36   Transform result(Transform::kSkipInitialization);
     37   Transform transform;
     38   transform.RotateAboutZAxis(89.99);
     39 
     40   Rect viewport(1920, 1200);
     41   bool snapped = SnapTransform(&result, transform, viewport);
     42 
     43   EXPECT_TRUE(snapped) << "Viewport should snap for this rotation.";
     44 }
     45 
     46 TEST(TransformUtilTest, SnapRotationDistantViewport) {
     47   const int kOffset = 5000;
     48   Transform result(Transform::kSkipInitialization);
     49   Transform transform;
     50 
     51   transform.RotateAboutZAxis(89.99);
     52 
     53   Rect viewport(kOffset, kOffset, 1920, 1200);
     54   bool snapped = SnapTransform(&result, transform, viewport);
     55 
     56   EXPECT_FALSE(snapped) << "Distant viewport shouldn't snap by more than 1px.";
     57 }
     58 
     59 TEST(TransformUtilTest, NoSnapRotation) {
     60   Transform result(Transform::kSkipInitialization);
     61   Transform transform;
     62   const int kOffset = 5000;
     63 
     64   transform.RotateAboutZAxis(89.9);
     65 
     66   Rect viewport(kOffset, kOffset, 1920, 1200);
     67   bool snapped = SnapTransform(&result, transform, viewport);
     68 
     69   EXPECT_FALSE(snapped) << "Viewport should not snap for this rotation.";
     70 }
     71 
     72 // Translations should always be snappable, the most we would move is 0.5
     73 // pixels towards either direction to the nearest value in each component.
     74 TEST(TransformUtilTest, SnapTranslation) {
     75   Transform result(Transform::kSkipInitialization);
     76   Transform transform;
     77 
     78   transform.Translate3d(
     79       SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0));
     80 
     81   Rect viewport(1920, 1200);
     82   bool snapped = SnapTransform(&result, transform, viewport);
     83 
     84   EXPECT_TRUE(snapped) << "Viewport should snap for this translation.";
     85 }
     86 
     87 TEST(TransformUtilTest, SnapTranslationDistantViewport) {
     88   Transform result(Transform::kSkipInitialization);
     89   Transform transform;
     90   const int kOffset = 5000;
     91 
     92   transform.Translate3d(
     93       SkDoubleToMScalar(1.01), SkDoubleToMScalar(1.99), SkDoubleToMScalar(3.0));
     94 
     95   Rect viewport(kOffset, kOffset, 1920, 1200);
     96   bool snapped = SnapTransform(&result, transform, viewport);
     97 
     98   EXPECT_TRUE(snapped)
     99       << "Distant viewport should still snap by less than 1px.";
    100 }
    101 
    102 TEST(TransformUtilTest, SnapScale) {
    103   Transform result(Transform::kSkipInitialization);
    104   Transform transform;
    105 
    106   transform.Scale3d(SkDoubleToMScalar(5.0),
    107                     SkDoubleToMScalar(2.00001),
    108                     SkDoubleToMScalar(1.0));
    109   Rect viewport(1920, 1200);
    110   bool snapped = SnapTransform(&result, transform, viewport);
    111 
    112   EXPECT_TRUE(snapped) << "Viewport should snap for this scaling.";
    113 }
    114 
    115 TEST(TransformUtilTest, NoSnapScale) {
    116   Transform result(Transform::kSkipInitialization);
    117   Transform transform;
    118 
    119   transform.Scale3d(
    120     SkDoubleToMScalar(5.0), SkDoubleToMScalar(2.1), SkDoubleToMScalar(1.0));
    121   Rect viewport(1920, 1200);
    122   bool snapped = SnapTransform(&result, transform, viewport);
    123 
    124   EXPECT_FALSE(snapped) << "Viewport shouldn't snap for this scaling.";
    125 }
    126 
    127 TEST(TransformUtilTest, SnapCompositeTransform) {
    128   Transform result(Transform::kSkipInitialization);
    129   Transform transform;
    130 
    131   transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0),
    132                         SkDoubleToMScalar(10.1));
    133   transform.RotateAboutZAxis(89.99);
    134   transform.Scale3d(SkDoubleToMScalar(1.0),
    135                     SkDoubleToMScalar(3.00001),
    136                     SkDoubleToMScalar(2.0));
    137 
    138   Rect viewport(1920, 1200);
    139   bool snapped = SnapTransform(&result, transform, viewport);
    140   ASSERT_TRUE(snapped) << "Viewport should snap all components.";
    141 
    142   Point3F point;
    143 
    144   point = Point3F(viewport.origin());
    145   result.TransformPoint(&point);
    146   EXPECT_EQ(Point3F(31.f, 20.f, 10.f), point) << "Transformed origin";
    147 
    148   point = Point3F(viewport.top_right());
    149   result.TransformPoint(&point);
    150   EXPECT_EQ(Point3F(31.f, 1940.f, 10.f), point) << "Transformed top-right";
    151 
    152   point = Point3F(viewport.bottom_left());
    153   result.TransformPoint(&point);
    154   EXPECT_EQ(Point3F(-3569.f, 20.f, 10.f), point) << "Transformed bottom-left";
    155 
    156   point = Point3F(viewport.bottom_right());
    157   result.TransformPoint(&point);
    158   EXPECT_EQ(Point3F(-3569.f, 1940.f, 10.f), point)
    159       << "Transformed bottom-right";
    160 }
    161 
    162 TEST(TransformUtilTest, NoSnapSkewedCompositeTransform) {
    163   Transform result(Transform::kSkipInitialization);
    164   Transform transform;
    165 
    166 
    167   transform.RotateAboutZAxis(89.99);
    168   transform.Scale3d(SkDoubleToMScalar(1.0),
    169                     SkDoubleToMScalar(3.00001),
    170                     SkDoubleToMScalar(2.0));
    171   transform.Translate3d(SkDoubleToMScalar(30.5), SkDoubleToMScalar(20.0),
    172                         SkDoubleToMScalar(10.1));
    173   transform.SkewX(20.0);
    174   Rect viewport(1920, 1200);
    175   bool snapped = SnapTransform(&result, transform, viewport);
    176   EXPECT_FALSE(snapped) << "Skewed viewport should not snap.";
    177 }
    178 
    179 }  // namespace
    180 }  // namespace gfx
    181