Index: ui/gfx/transform.cc |
diff --git a/ui/gfx/transform.cc b/ui/gfx/transform.cc |
index 3e94f44e21cb37c012d201c3ec0d58b40ca44b60..bfd1b66f6f6202cdb221078f6366b34bfe647608 100644 |
--- a/ui/gfx/transform.cc |
+++ b/ui/gfx/transform.cc |
@@ -24,61 +24,72 @@ namespace gfx { |
namespace { |
// Taken from SkMatrix44. |
-const double kEpsilon = 1e-8; |
+const SkMScalar kEpsilon = 1e-8; |
-double TanDegrees(double degrees) { |
- double radians = degrees * M_PI / 180; |
+SkMScalar TanDegrees(double degrees) { |
+ SkMScalar radians = degrees * M_PI / 180; |
return std::tan(radians); |
} |
} // namespace |
-Transform::Transform( |
- double col1row1, double col2row1, double col3row1, double col4row1, |
- double col1row2, double col2row2, double col3row2, double col4row2, |
- double col1row3, double col2row3, double col3row3, double col4row3, |
- double col1row4, double col2row4, double col3row4, double col4row4) |
- : matrix_(SkMatrix44::kUninitialized_Constructor) |
-{ |
- matrix_.setDouble(0, 0, col1row1); |
- matrix_.setDouble(1, 0, col1row2); |
- matrix_.setDouble(2, 0, col1row3); |
- matrix_.setDouble(3, 0, col1row4); |
- |
- matrix_.setDouble(0, 1, col2row1); |
- matrix_.setDouble(1, 1, col2row2); |
- matrix_.setDouble(2, 1, col2row3); |
- matrix_.setDouble(3, 1, col2row4); |
- |
- matrix_.setDouble(0, 2, col3row1); |
- matrix_.setDouble(1, 2, col3row2); |
- matrix_.setDouble(2, 2, col3row3); |
- matrix_.setDouble(3, 2, col3row4); |
- |
- matrix_.setDouble(0, 3, col4row1); |
- matrix_.setDouble(1, 3, col4row2); |
- matrix_.setDouble(2, 3, col4row3); |
- matrix_.setDouble(3, 3, col4row4); |
-} |
- |
-Transform::Transform( |
- double col1row1, double col2row1, |
- double col1row2, double col2row2, |
- double x_translation, double y_translation) |
- : matrix_(SkMatrix44::kIdentity_Constructor) |
-{ |
- matrix_.setDouble(0, 0, col1row1); |
- matrix_.setDouble(1, 0, col1row2); |
- matrix_.setDouble(0, 1, col2row1); |
- matrix_.setDouble(1, 1, col2row2); |
- matrix_.setDouble(0, 3, x_translation); |
- matrix_.setDouble(1, 3, y_translation); |
+Transform::Transform(SkMScalar col1row1, |
+ SkMScalar col2row1, |
+ SkMScalar col3row1, |
+ SkMScalar col4row1, |
+ SkMScalar col1row2, |
+ SkMScalar col2row2, |
+ SkMScalar col3row2, |
+ SkMScalar col4row2, |
+ SkMScalar col1row3, |
+ SkMScalar col2row3, |
+ SkMScalar col3row3, |
+ SkMScalar col4row3, |
+ SkMScalar col1row4, |
+ SkMScalar col2row4, |
+ SkMScalar col3row4, |
+ SkMScalar col4row4) |
+ : matrix_(SkMatrix44::kUninitialized_Constructor) { |
+ matrix_.set(0, 0, col1row1); |
+ matrix_.set(1, 0, col1row2); |
+ matrix_.set(2, 0, col1row3); |
+ matrix_.set(3, 0, col1row4); |
+ |
+ matrix_.set(0, 1, col2row1); |
+ matrix_.set(1, 1, col2row2); |
+ matrix_.set(2, 1, col2row3); |
+ matrix_.set(3, 1, col2row4); |
+ |
+ matrix_.set(0, 2, col3row1); |
+ matrix_.set(1, 2, col3row2); |
+ matrix_.set(2, 2, col3row3); |
+ matrix_.set(3, 2, col3row4); |
+ |
+ matrix_.set(0, 3, col4row1); |
+ matrix_.set(1, 3, col4row2); |
+ matrix_.set(2, 3, col4row3); |
+ matrix_.set(3, 3, col4row4); |
+} |
+ |
+Transform::Transform(SkMScalar col1row1, |
+ SkMScalar col2row1, |
+ SkMScalar col1row2, |
+ SkMScalar col2row2, |
+ SkMScalar x_translation, |
+ SkMScalar y_translation) |
+ : matrix_(SkMatrix44::kIdentity_Constructor) { |
+ matrix_.set(0, 0, col1row1); |
+ matrix_.set(1, 0, col1row2); |
+ matrix_.set(0, 1, col2row1); |
+ matrix_.set(1, 1, col2row2); |
+ matrix_.set(0, 3, x_translation); |
+ matrix_.set(1, 3, y_translation); |
} |
void Transform::RotateAboutXAxis(double degrees) { |
double radians = degrees * M_PI / 180; |
- double cosTheta = std::cos(radians); |
- double sinTheta = std::sin(radians); |
+ SkMScalar cosTheta = SkDoubleToMScalar(std::cos(radians)); |
+ SkMScalar sinTheta = SkDoubleToMScalar(std::sin(radians)); |
if (matrix_.isIdentity()) { |
matrix_.set3x3(1, 0, 0, |
0, cosTheta, sinTheta, |
@@ -94,8 +105,8 @@ void Transform::RotateAboutXAxis(double degrees) { |
void Transform::RotateAboutYAxis(double degrees) { |
double radians = degrees * M_PI / 180; |
- double cosTheta = std::cos(radians); |
- double sinTheta = std::sin(radians); |
+ SkMScalar cosTheta = SkDoubleToMScalar(std::cos(radians)); |
+ SkMScalar sinTheta = SkDoubleToMScalar(std::sin(radians)); |
if (matrix_.isIdentity()) { |
// Note carefully the placement of the -sinTheta for rotation about |
// y-axis is different than rotation about x-axis or z-axis. |
@@ -112,9 +123,9 @@ void Transform::RotateAboutYAxis(double degrees) { |
} |
void Transform::RotateAboutZAxis(double degrees) { |
- double radians = degrees * M_PI / 180; |
- double cosTheta = std::cos(radians); |
- double sinTheta = std::sin(radians); |
+ double radians = (degrees / 180.0) * M_PI; |
enne (OOO)
2013/09/07 00:01:45
This needed to stay a double for precision when ro
|
+ SkMScalar cosTheta = SkDoubleToScalar(std::cos(radians)); |
+ SkMScalar sinTheta = SkDoubleToScalar(std::sin(radians)); |
if (matrix_.isIdentity()) { |
matrix_.set3x3(cosTheta, sinTheta, 0, |
-sinTheta, cosTheta, 0, |
@@ -130,68 +141,62 @@ void Transform::RotateAboutZAxis(double degrees) { |
void Transform::RotateAbout(const Vector3dF& axis, double degrees) { |
if (matrix_.isIdentity()) { |
- matrix_.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), |
- SkDoubleToMScalar(axis.y()), |
- SkDoubleToMScalar(axis.z()), |
- SkDoubleToMScalar(degrees)); |
+ matrix_.setRotateDegreesAbout(SkFloatToMScalar(axis.x()), |
+ SkFloatToMScalar(axis.y()), |
+ SkFloatToMScalar(axis.z()), |
+ degrees); |
} else { |
SkMatrix44 rot(SkMatrix44::kUninitialized_Constructor); |
- rot.setRotateDegreesAbout(SkDoubleToMScalar(axis.x()), |
- SkDoubleToMScalar(axis.y()), |
- SkDoubleToMScalar(axis.z()), |
- SkDoubleToMScalar(degrees)); |
+ rot.setRotateDegreesAbout(SkFloatToMScalar(axis.x()), |
+ SkFloatToMScalar(axis.y()), |
+ SkFloatToMScalar(axis.z()), |
+ degrees); |
matrix_.preConcat(rot); |
} |
} |
-void Transform::Scale(double x, double y) { |
- matrix_.preScale(SkDoubleToMScalar(x), SkDoubleToMScalar(y), 1); |
-} |
+void Transform::Scale(SkMScalar x, SkMScalar y) { matrix_.preScale(x, y, 1); } |
-void Transform::Scale3d(double x, double y, double z) { |
- matrix_.preScale(SkDoubleToMScalar(x), |
- SkDoubleToMScalar(y), |
- SkDoubleToMScalar(z)); |
+void Transform::Scale3d(SkMScalar x, SkMScalar y, SkMScalar z) { |
+ matrix_.preScale(x, y, z); |
} |
-void Transform::Translate(double x, double y) { |
- matrix_.preTranslate(SkDoubleToMScalar(x), SkDoubleToMScalar(y), 0); |
+void Transform::Translate(SkMScalar x, SkMScalar y) { |
+ matrix_.preTranslate(x, y, 0); |
} |
-void Transform::Translate3d(double x, double y, double z) { |
- matrix_.preTranslate(SkDoubleToMScalar(x), |
- SkDoubleToMScalar(y), |
- SkDoubleToMScalar(z)); |
+void Transform::Translate3d(SkMScalar x, SkMScalar y, SkMScalar z) { |
+ matrix_.preTranslate(x, y, z); |
} |
-void Transform::SkewX(double angle_x) { |
+void Transform::SkewX(SkMScalar angle_x) { |
if (matrix_.isIdentity()) |
- matrix_.setDouble(0, 1, TanDegrees(angle_x)); |
+ matrix_.set(0, 1, TanDegrees(angle_x)); |
else { |
SkMatrix44 skew(SkMatrix44::kIdentity_Constructor); |
- skew.setDouble(0, 1, TanDegrees(angle_x)); |
+ skew.set(0, 1, TanDegrees(angle_x)); |
matrix_.preConcat(skew); |
} |
} |
-void Transform::SkewY(double angle_y) { |
+void Transform::SkewY(SkMScalar angle_y) { |
if (matrix_.isIdentity()) |
- matrix_.setDouble(1, 0, TanDegrees(angle_y)); |
+ matrix_.set(1, 0, TanDegrees(angle_y)); |
else { |
SkMatrix44 skew(SkMatrix44::kIdentity_Constructor); |
- skew.setDouble(1, 0, TanDegrees(angle_y)); |
+ skew.set(1, 0, TanDegrees(angle_y)); |
matrix_.preConcat(skew); |
} |
} |
-void Transform::ApplyPerspectiveDepth(double depth) { |
+void Transform::ApplyPerspectiveDepth(SkMScalar depth) { |
if (depth == 0) |
return; |
if (matrix_.isIdentity()) |
- matrix_.setDouble(3, 2, -1.0 / depth); |
+ matrix_.set(3, 2, -1.0 / depth); |
else { |
SkMatrix44 m(SkMatrix44::kIdentity_Constructor); |
- m.setDouble(3, 2, -1.0 / depth); |
+ m.set(3, 2, -1.0 / depth); |
matrix_.preConcat(m); |
} |
} |
@@ -209,9 +214,9 @@ bool Transform::IsIdentityOrIntegerTranslation() const { |
return false; |
bool no_fractional_translation = |
- static_cast<int>(matrix_.getDouble(0, 3)) == matrix_.getDouble(0, 3) && |
- static_cast<int>(matrix_.getDouble(1, 3)) == matrix_.getDouble(1, 3) && |
- static_cast<int>(matrix_.getDouble(2, 3)) == matrix_.getDouble(2, 3); |
+ static_cast<int>(matrix_.get(0, 3)) == matrix_.get(0, 3) && |
+ static_cast<int>(matrix_.get(1, 3)) == matrix_.get(1, 3) && |
+ static_cast<int>(matrix_.get(2, 3)) == matrix_.get(2, 3); |
return no_fractional_translation; |
} |
@@ -244,34 +249,22 @@ bool Transform::IsBackFaceVisible() const { |
// Compute the cofactor of the 3rd row, 3rd column. |
double cofactor_part_1 = |
- matrix_.getDouble(0, 0) * |
- matrix_.getDouble(1, 1) * |
- matrix_.getDouble(3, 3); |
+ matrix_.get(0, 0) * matrix_.get(1, 1) * matrix_.get(3, 3); |
double cofactor_part_2 = |
- matrix_.getDouble(0, 1) * |
- matrix_.getDouble(1, 3) * |
- matrix_.getDouble(3, 0); |
+ matrix_.get(0, 1) * matrix_.get(1, 3) * matrix_.get(3, 0); |
double cofactor_part_3 = |
- matrix_.getDouble(0, 3) * |
- matrix_.getDouble(1, 0) * |
- matrix_.getDouble(3, 1); |
+ matrix_.get(0, 3) * matrix_.get(1, 0) * matrix_.get(3, 1); |
double cofactor_part_4 = |
- matrix_.getDouble(0, 0) * |
- matrix_.getDouble(1, 3) * |
- matrix_.getDouble(3, 1); |
+ matrix_.get(0, 0) * matrix_.get(1, 3) * matrix_.get(3, 1); |
double cofactor_part_5 = |
- matrix_.getDouble(0, 1) * |
- matrix_.getDouble(1, 0) * |
- matrix_.getDouble(3, 3); |
+ matrix_.get(0, 1) * matrix_.get(1, 0) * matrix_.get(3, 3); |
double cofactor_part_6 = |
- matrix_.getDouble(0, 3) * |
- matrix_.getDouble(1, 1) * |
- matrix_.getDouble(3, 0); |
+ matrix_.get(0, 3) * matrix_.get(1, 1) * matrix_.get(3, 0); |
double cofactor33 = |
cofactor_part_1 + |
@@ -317,30 +310,30 @@ bool Transform::Preserves2dAxisAlignment() const { |
// values: The current implementation conservatively assumes that axis |
// alignment is not preserved. |
- bool has_x_or_y_perspective = matrix_.getDouble(3, 0) != 0 || |
- matrix_.getDouble(3, 1) != 0; |
+ bool has_x_or_y_perspective = |
+ matrix_.get(3, 0) != 0 || matrix_.get(3, 1) != 0; |
int num_non_zero_in_row_0 = 0; |
int num_non_zero_in_row_1 = 0; |
int num_non_zero_in_col_0 = 0; |
int num_non_zero_in_col_1 = 0; |
- if (std::abs(matrix_.getDouble(0, 0)) > kEpsilon) { |
+ if (std::abs(matrix_.get(0, 0)) > kEpsilon) { |
num_non_zero_in_row_0++; |
num_non_zero_in_col_0++; |
} |
- if (std::abs(matrix_.getDouble(0, 1)) > kEpsilon) { |
+ if (std::abs(matrix_.get(0, 1)) > kEpsilon) { |
num_non_zero_in_row_0++; |
num_non_zero_in_col_1++; |
} |
- if (std::abs(matrix_.getDouble(1, 0)) > kEpsilon) { |
+ if (std::abs(matrix_.get(1, 0)) > kEpsilon) { |
num_non_zero_in_row_1++; |
num_non_zero_in_col_0++; |
} |
- if (std::abs(matrix_.getDouble(1, 1)) > kEpsilon) { |
+ if (std::abs(matrix_.get(1, 1)) > kEpsilon) { |
num_non_zero_in_row_1++; |
num_non_zero_in_col_1++; |
} |
@@ -358,21 +351,21 @@ void Transform::Transpose() { |
} |
void Transform::FlattenTo2d() { |
- matrix_.setDouble(2, 0, 0.0); |
- matrix_.setDouble(2, 1, 0.0); |
- matrix_.setDouble(0, 2, 0.0); |
- matrix_.setDouble(1, 2, 0.0); |
- matrix_.setDouble(2, 2, 1.0); |
- matrix_.setDouble(3, 2, 0.0); |
- matrix_.setDouble(2, 3, 0.0); |
+ matrix_.set(2, 0, 0.0); |
+ matrix_.set(2, 1, 0.0); |
+ matrix_.set(0, 2, 0.0); |
+ matrix_.set(1, 2, 0.0); |
+ matrix_.set(2, 2, 1.0); |
+ matrix_.set(3, 2, 0.0); |
+ matrix_.set(2, 3, 0.0); |
} |
Vector2dF Transform::To2dTranslation() const { |
DCHECK(IsIdentityOrTranslation()); |
// Ensure that this translation is truly 2d. |
- const double translate_z = matrix_.getDouble(2, 3); |
+ const double translate_z = matrix_.get(2, 3); |
DCHECK_EQ(0.0, translate_z); |
- return gfx::Vector2dF(matrix_.getDouble(0, 3), matrix_.getDouble(1, 3)); |
+ return gfx::Vector2dF(matrix_.get(0, 3), matrix_.get(1, 3)); |
} |
void Transform::TransformPoint(Point& point) const { |
@@ -428,7 +421,7 @@ bool Transform::TransformRectReverse(RectF* rect) const { |
return true; |
} |
-bool Transform::Blend(const Transform& from, double progress) { |
+bool Transform::Blend(const Transform& from, SkMScalar progress) { |
DecomposedTransform to_decomp; |
DecomposedTransform from_decomp; |
if (!DecomposeTransform(&to_decomp, *this) || |
@@ -447,12 +440,8 @@ void Transform::TransformPointInternal(const SkMatrix44& xform, |
if (xform.isIdentity()) |
return; |
- SkMScalar p[4] = { |
- SkDoubleToMScalar(point.x()), |
- SkDoubleToMScalar(point.y()), |
- SkDoubleToMScalar(point.z()), |
- SkDoubleToMScalar(1) |
- }; |
+ SkMScalar p[4] = {SkFloatToMScalar(point.x()), SkFloatToMScalar(point.y()), |
+ SkFloatToMScalar(point.z()), 1}; |
xform.mapMScalars(p); |
@@ -468,12 +457,8 @@ void Transform::TransformPointInternal(const SkMatrix44& xform, |
if (xform.isIdentity()) |
return; |
- SkMScalar p[4] = { |
- SkDoubleToMScalar(point.x()), |
- SkDoubleToMScalar(point.y()), |
- SkDoubleToMScalar(0), |
- SkDoubleToMScalar(1) |
- }; |
+ SkMScalar p[4] = {SkFloatToMScalar(point.x()), SkFloatToMScalar(point.y()), 0, |
+ 1}; |
xform.mapMScalars(p); |
@@ -486,22 +471,22 @@ std::string Transform::ToString() const { |
" %+0.4f %+0.4f %+0.4f %+0.4f \n" |
" %+0.4f %+0.4f %+0.4f %+0.4f \n" |
" %+0.4f %+0.4f %+0.4f %+0.4f ]\n", |
- matrix_.getDouble(0, 0), |
- matrix_.getDouble(0, 1), |
- matrix_.getDouble(0, 2), |
- matrix_.getDouble(0, 3), |
- matrix_.getDouble(1, 0), |
- matrix_.getDouble(1, 1), |
- matrix_.getDouble(1, 2), |
- matrix_.getDouble(1, 3), |
- matrix_.getDouble(2, 0), |
- matrix_.getDouble(2, 1), |
- matrix_.getDouble(2, 2), |
- matrix_.getDouble(2, 3), |
- matrix_.getDouble(3, 0), |
- matrix_.getDouble(3, 1), |
- matrix_.getDouble(3, 2), |
- matrix_.getDouble(3, 3)); |
+ matrix_.get(0, 0), |
+ matrix_.get(0, 1), |
+ matrix_.get(0, 2), |
+ matrix_.get(0, 3), |
+ matrix_.get(1, 0), |
+ matrix_.get(1, 1), |
+ matrix_.get(1, 2), |
+ matrix_.get(1, 3), |
+ matrix_.get(2, 0), |
+ matrix_.get(2, 1), |
+ matrix_.get(2, 2), |
+ matrix_.get(2, 3), |
+ matrix_.get(3, 0), |
+ matrix_.get(3, 1), |
+ matrix_.get(3, 2), |
+ matrix_.get(3, 3)); |
} |
} // namespace gfx |