Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "cc/base/math_util.h" | 5 #include "cc/base/math_util.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 #include <cmath> | 8 #include <cmath> |
| 9 #include <limits> | 9 #include <limits> |
| 10 | 10 |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 114 static inline void AddVertexToClippedQuad3d(const gfx::Point3F& new_vertex, | 114 static inline void AddVertexToClippedQuad3d(const gfx::Point3F& new_vertex, |
| 115 gfx::Point3F clipped_quad[8], | 115 gfx::Point3F clipped_quad[8], |
| 116 int* num_vertices_in_clipped_quad) { | 116 int* num_vertices_in_clipped_quad) { |
| 117 clipped_quad[*num_vertices_in_clipped_quad] = new_vertex; | 117 clipped_quad[*num_vertices_in_clipped_quad] = new_vertex; |
| 118 (*num_vertices_in_clipped_quad)++; | 118 (*num_vertices_in_clipped_quad)++; |
| 119 } | 119 } |
| 120 | 120 |
| 121 gfx::Rect MathUtil::MapEnclosingClippedRect(const gfx::Transform& transform, | 121 gfx::Rect MathUtil::MapEnclosingClippedRect(const gfx::Transform& transform, |
| 122 const gfx::Rect& src_rect) { | 122 const gfx::Rect& src_rect) { |
| 123 if (transform.IsIdentityOrIntegerTranslation()) { | 123 if (transform.IsIdentityOrIntegerTranslation()) { |
| 124 return src_rect + | 124 gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)), |
| 125 gfx::Vector2d( | 125 static_cast<int>(transform.matrix().getFloat(1, 3))); |
| 126 static_cast<int>(SkMScalarToFloat(transform.matrix().get(0, 3))), | 126 return src_rect + offset; |
| 127 static_cast<int>( | |
| 128 SkMScalarToFloat(transform.matrix().get(1, 3)))); | |
| 129 } | 127 } |
| 130 return gfx::ToEnclosingRect(MapClippedRect(transform, gfx::RectF(src_rect))); | 128 return gfx::ToEnclosingRect(MapClippedRect(transform, gfx::RectF(src_rect))); |
| 131 } | 129 } |
| 132 | 130 |
| 133 gfx::RectF MathUtil::MapClippedRect(const gfx::Transform& transform, | 131 gfx::RectF MathUtil::MapClippedRect(const gfx::Transform& transform, |
| 134 const gfx::RectF& src_rect) { | 132 const gfx::RectF& src_rect) { |
| 135 if (transform.IsIdentityOrTranslation()) { | 133 if (transform.IsIdentityOrTranslation()) { |
| 136 return src_rect + | 134 gfx::Vector2dF offset(transform.matrix().getFloat(0, 3), |
| 137 gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)), | 135 transform.matrix().getFloat(1, 3)); |
| 138 SkMScalarToFloat(transform.matrix().get(1, 3))); | 136 return src_rect + offset; |
| 139 } | 137 } |
| 140 | 138 |
| 141 // Apply the transform, but retain the result in homogeneous coordinates. | 139 // Apply the transform, but retain the result in homogeneous coordinates. |
| 142 | 140 |
| 143 SkMScalar quad[4 * 2]; // input: 4 x 2D points | 141 SkMScalar quad[4 * 2]; // input: 4 x 2D points |
| 144 quad[0] = src_rect.x(); | 142 quad[0] = src_rect.x(); |
| 145 quad[1] = src_rect.y(); | 143 quad[1] = src_rect.y(); |
| 146 quad[2] = src_rect.right(); | 144 quad[2] = src_rect.right(); |
| 147 quad[3] = src_rect.y(); | 145 quad[3] = src_rect.y(); |
| 148 quad[4] = src_rect.right(); | 146 quad[4] = src_rect.right(); |
| 149 quad[5] = src_rect.bottom(); | 147 quad[5] = src_rect.bottom(); |
| 150 quad[6] = src_rect.x(); | 148 quad[6] = src_rect.x(); |
| 151 quad[7] = src_rect.bottom(); | 149 quad[7] = src_rect.bottom(); |
| 152 | 150 |
| 153 SkMScalar result[4 * 4]; // output: 4 x 4D homogeneous points | 151 SkMScalar result[4 * 4]; // output: 4 x 4D homogeneous points |
| 154 transform.matrix().map2(quad, 4, result); | 152 transform.matrix().map2(quad, 4, result); |
| 155 | 153 |
| 156 HomogeneousCoordinate hc0(result[0], result[1], result[2], result[3]); | 154 HomogeneousCoordinate hc0(result[0], result[1], result[2], result[3]); |
| 157 HomogeneousCoordinate hc1(result[4], result[5], result[6], result[7]); | 155 HomogeneousCoordinate hc1(result[4], result[5], result[6], result[7]); |
| 158 HomogeneousCoordinate hc2(result[8], result[9], result[10], result[11]); | 156 HomogeneousCoordinate hc2(result[8], result[9], result[10], result[11]); |
| 159 HomogeneousCoordinate hc3(result[12], result[13], result[14], result[15]); | 157 HomogeneousCoordinate hc3(result[12], result[13], result[14], result[15]); |
| 160 return ComputeEnclosingClippedRect(hc0, hc1, hc2, hc3); | 158 return ComputeEnclosingClippedRect(hc0, hc1, hc2, hc3); |
| 161 } | 159 } |
| 162 | 160 |
| 163 gfx::Rect MathUtil::ProjectEnclosingClippedRect(const gfx::Transform& transform, | 161 gfx::Rect MathUtil::ProjectEnclosingClippedRect(const gfx::Transform& transform, |
| 164 const gfx::Rect& src_rect) { | 162 const gfx::Rect& src_rect) { |
| 165 if (transform.IsIdentityOrIntegerTranslation()) { | 163 if (transform.IsIdentityOrIntegerTranslation()) { |
| 166 return src_rect + | 164 gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)), |
| 167 gfx::Vector2d( | 165 static_cast<int>(transform.matrix().getFloat(1, 3))); |
| 168 static_cast<int>(SkMScalarToFloat(transform.matrix().get(0, 3))), | 166 return src_rect + offset; |
| 169 static_cast<int>( | |
| 170 SkMScalarToFloat(transform.matrix().get(1, 3)))); | |
| 171 } | 167 } |
| 172 return gfx::ToEnclosingRect( | 168 return gfx::ToEnclosingRect( |
| 173 ProjectClippedRect(transform, gfx::RectF(src_rect))); | 169 ProjectClippedRect(transform, gfx::RectF(src_rect))); |
| 174 } | 170 } |
| 175 | 171 |
| 176 gfx::RectF MathUtil::ProjectClippedRect(const gfx::Transform& transform, | 172 gfx::RectF MathUtil::ProjectClippedRect(const gfx::Transform& transform, |
| 177 const gfx::RectF& src_rect) { | 173 const gfx::RectF& src_rect) { |
| 178 if (transform.IsIdentityOrTranslation()) { | 174 if (transform.IsIdentityOrTranslation()) { |
| 179 return src_rect + | 175 gfx::Vector2dF offset(transform.matrix().getFloat(0, 3), |
| 180 gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)), | 176 transform.matrix().getFloat(1, 3)); |
| 181 SkMScalarToFloat(transform.matrix().get(1, 3))); | 177 return src_rect + offset; |
| 182 } | 178 } |
| 183 | 179 |
| 184 // Perform the projection, but retain the result in homogeneous coordinates. | 180 // Perform the projection, but retain the result in homogeneous coordinates. |
| 185 gfx::QuadF q = gfx::QuadF(src_rect); | 181 gfx::QuadF q = gfx::QuadF(src_rect); |
| 186 HomogeneousCoordinate h1 = ProjectHomogeneousPoint(transform, q.p1()); | 182 HomogeneousCoordinate h1 = ProjectHomogeneousPoint(transform, q.p1()); |
| 187 HomogeneousCoordinate h2 = ProjectHomogeneousPoint(transform, q.p2()); | 183 HomogeneousCoordinate h2 = ProjectHomogeneousPoint(transform, q.p2()); |
| 188 HomogeneousCoordinate h3 = ProjectHomogeneousPoint(transform, q.p3()); | 184 HomogeneousCoordinate h3 = ProjectHomogeneousPoint(transform, q.p3()); |
| 189 HomogeneousCoordinate h4 = ProjectHomogeneousPoint(transform, q.p4()); | 185 HomogeneousCoordinate h4 = ProjectHomogeneousPoint(transform, q.p4()); |
| 190 | 186 |
| 191 return ComputeEnclosingClippedRect(h1, h2, h3, h4); | 187 return ComputeEnclosingClippedRect(h1, h2, h3, h4); |
| 192 } | 188 } |
| 193 | 189 |
| 190 gfx::Rect MathUtil::MapEnclosedNonClippedRect(const gfx::Transform& transform, | |
|
enne (OOO)
2014/08/25 19:58:56
Do you think this function name have the 2d axis a
| |
| 191 const gfx::Rect& rect) { | |
| 192 DCHECK(transform.Preserves2dAxisAlignment()); | |
| 193 | |
| 194 if (transform.IsIdentityOrIntegerTranslation()) { | |
| 195 gfx::Vector2d offset(static_cast<int>(transform.matrix().getFloat(0, 3)), | |
| 196 static_cast<int>(transform.matrix().getFloat(1, 3))); | |
| 197 return rect + offset; | |
| 198 } | |
| 199 if (transform.IsIdentityOrTranslation()) { | |
| 200 gfx::Vector2dF offset(transform.matrix().getFloat(0, 3), | |
| 201 transform.matrix().getFloat(1, 3)); | |
| 202 return gfx::ToEnclosedRect(rect + offset); | |
| 203 } | |
| 204 | |
| 205 SkMScalar quad[2 * 2]; // input: 2 x 2D points | |
| 206 quad[0] = rect.x(); | |
| 207 quad[1] = rect.y(); | |
| 208 quad[2] = rect.right(); | |
| 209 quad[3] = rect.bottom(); | |
| 210 | |
| 211 SkMScalar result[4 * 2]; // output: 2 x 4D homogeneous points | |
| 212 transform.matrix().map2(quad, 2, result); | |
| 213 | |
| 214 HomogeneousCoordinate hc0(result[0], result[1], result[2], result[3]); | |
| 215 HomogeneousCoordinate hc1(result[4], result[5], result[6], result[7]); | |
| 216 DCHECK(!hc0.ShouldBeClipped()); | |
| 217 DCHECK(!hc1.ShouldBeClipped()); | |
| 218 | |
| 219 gfx::PointF top_left(hc0.CartesianPoint2d()); | |
| 220 gfx::PointF bottom_right(hc1.CartesianPoint2d()); | |
| 221 return gfx::ToEnclosedRect(gfx::BoundingRect(top_left, bottom_right)); | |
| 222 } | |
| 223 | |
| 194 void MathUtil::MapClippedQuad(const gfx::Transform& transform, | 224 void MathUtil::MapClippedQuad(const gfx::Transform& transform, |
| 195 const gfx::QuadF& src_quad, | 225 const gfx::QuadF& src_quad, |
| 196 gfx::PointF clipped_quad[8], | 226 gfx::PointF clipped_quad[8], |
| 197 int* num_vertices_in_clipped_quad) { | 227 int* num_vertices_in_clipped_quad) { |
| 198 HomogeneousCoordinate h1 = | 228 HomogeneousCoordinate h1 = |
| 199 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p1())); | 229 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p1())); |
| 200 HomogeneousCoordinate h2 = | 230 HomogeneousCoordinate h2 = |
| 201 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p2())); | 231 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p2())); |
| 202 HomogeneousCoordinate h3 = | 232 HomogeneousCoordinate h3 = |
| 203 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p3())); | 233 MapHomogeneousPoint(transform, gfx::Point3F(src_quad.p3())); |
| (...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 429 | 459 |
| 430 return gfx::RectF(gfx::PointF(xmin, ymin), | 460 return gfx::RectF(gfx::PointF(xmin, ymin), |
| 431 gfx::SizeF(xmax - xmin, ymax - ymin)); | 461 gfx::SizeF(xmax - xmin, ymax - ymin)); |
| 432 } | 462 } |
| 433 | 463 |
| 434 gfx::QuadF MathUtil::MapQuad(const gfx::Transform& transform, | 464 gfx::QuadF MathUtil::MapQuad(const gfx::Transform& transform, |
| 435 const gfx::QuadF& q, | 465 const gfx::QuadF& q, |
| 436 bool* clipped) { | 466 bool* clipped) { |
| 437 if (transform.IsIdentityOrTranslation()) { | 467 if (transform.IsIdentityOrTranslation()) { |
| 438 gfx::QuadF mapped_quad(q); | 468 gfx::QuadF mapped_quad(q); |
| 439 mapped_quad += | 469 mapped_quad += gfx::Vector2dF(transform.matrix().getFloat(0, 3), |
| 440 gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)), | 470 transform.matrix().getFloat(1, 3)); |
| 441 SkMScalarToFloat(transform.matrix().get(1, 3))); | |
| 442 *clipped = false; | 471 *clipped = false; |
| 443 return mapped_quad; | 472 return mapped_quad; |
| 444 } | 473 } |
| 445 | 474 |
| 446 HomogeneousCoordinate h1 = | 475 HomogeneousCoordinate h1 = |
| 447 MapHomogeneousPoint(transform, gfx::Point3F(q.p1())); | 476 MapHomogeneousPoint(transform, gfx::Point3F(q.p1())); |
| 448 HomogeneousCoordinate h2 = | 477 HomogeneousCoordinate h2 = |
| 449 MapHomogeneousPoint(transform, gfx::Point3F(q.p2())); | 478 MapHomogeneousPoint(transform, gfx::Point3F(q.p2())); |
| 450 HomogeneousCoordinate h3 = | 479 HomogeneousCoordinate h3 = |
| 451 MapHomogeneousPoint(transform, gfx::Point3F(q.p3())); | 480 MapHomogeneousPoint(transform, gfx::Point3F(q.p3())); |
| (...skipping 10 matching lines...) Expand all Loading... | |
| 462 h3.CartesianPoint2d(), | 491 h3.CartesianPoint2d(), |
| 463 h4.CartesianPoint2d()); | 492 h4.CartesianPoint2d()); |
| 464 } | 493 } |
| 465 | 494 |
| 466 gfx::QuadF MathUtil::MapQuad3d(const gfx::Transform& transform, | 495 gfx::QuadF MathUtil::MapQuad3d(const gfx::Transform& transform, |
| 467 const gfx::QuadF& q, | 496 const gfx::QuadF& q, |
| 468 gfx::Point3F* p, | 497 gfx::Point3F* p, |
| 469 bool* clipped) { | 498 bool* clipped) { |
| 470 if (transform.IsIdentityOrTranslation()) { | 499 if (transform.IsIdentityOrTranslation()) { |
| 471 gfx::QuadF mapped_quad(q); | 500 gfx::QuadF mapped_quad(q); |
| 472 mapped_quad += | 501 mapped_quad += gfx::Vector2dF(transform.matrix().getFloat(0, 3), |
| 473 gfx::Vector2dF(SkMScalarToFloat(transform.matrix().get(0, 3)), | 502 transform.matrix().getFloat(1, 3)); |
| 474 SkMScalarToFloat(transform.matrix().get(1, 3))); | |
| 475 *clipped = false; | 503 *clipped = false; |
| 476 p[0] = gfx::Point3F(mapped_quad.p1().x(), mapped_quad.p1().y(), 0.0f); | 504 p[0] = gfx::Point3F(mapped_quad.p1().x(), mapped_quad.p1().y(), 0.0f); |
| 477 p[1] = gfx::Point3F(mapped_quad.p2().x(), mapped_quad.p2().y(), 0.0f); | 505 p[1] = gfx::Point3F(mapped_quad.p2().x(), mapped_quad.p2().y(), 0.0f); |
| 478 p[2] = gfx::Point3F(mapped_quad.p3().x(), mapped_quad.p3().y(), 0.0f); | 506 p[2] = gfx::Point3F(mapped_quad.p3().x(), mapped_quad.p3().y(), 0.0f); |
| 479 p[3] = gfx::Point3F(mapped_quad.p4().x(), mapped_quad.p4().y(), 0.0f); | 507 p[3] = gfx::Point3F(mapped_quad.p4().x(), mapped_quad.p4().y(), 0.0f); |
| 480 return mapped_quad; | 508 return mapped_quad; |
| 481 } | 509 } |
| 482 | 510 |
| 483 HomogeneousCoordinate h1 = | 511 HomogeneousCoordinate h1 = |
| 484 MapHomogeneousPoint(transform, gfx::Point3F(q.p1())); | 512 MapHomogeneousPoint(transform, gfx::Point3F(q.p1())); |
| (...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 790 | 818 |
| 791 double MathUtil::AsDoubleSafely(double value) { | 819 double MathUtil::AsDoubleSafely(double value) { |
| 792 return std::min(value, std::numeric_limits<double>::max()); | 820 return std::min(value, std::numeric_limits<double>::max()); |
| 793 } | 821 } |
| 794 | 822 |
| 795 float MathUtil::AsFloatSafely(float value) { | 823 float MathUtil::AsFloatSafely(float value) { |
| 796 return std::min(value, std::numeric_limits<float>::max()); | 824 return std::min(value, std::numeric_limits<float>::max()); |
| 797 } | 825 } |
| 798 | 826 |
| 799 } // namespace cc | 827 } // namespace cc |
| OLD | NEW |