OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 // MSVC++ requires this to be set before any other includes to get M_PI. | 5 // MSVC++ requires this to be set before any other includes to get M_PI. |
6 #define _USE_MATH_DEFINES | 6 #define _USE_MATH_DEFINES |
7 | 7 |
8 #include "ui/gfx/transform.h" | 8 #include "ui/gfx/transform.h" |
9 | 9 |
10 #include <cmath> | 10 #include <cmath> |
(...skipping 22 matching lines...) Expand all Loading... |
33 } | 33 } |
34 | 34 |
35 inline bool ApproximatelyZero(SkMScalar x, SkMScalar tolerance) { | 35 inline bool ApproximatelyZero(SkMScalar x, SkMScalar tolerance) { |
36 return std::abs(x) <= tolerance; | 36 return std::abs(x) <= tolerance; |
37 } | 37 } |
38 | 38 |
39 inline bool ApproximatelyOne(SkMScalar x, SkMScalar tolerance) { | 39 inline bool ApproximatelyOne(SkMScalar x, SkMScalar tolerance) { |
40 return std::abs(x - SkDoubleToMScalar(1.0)) <= tolerance; | 40 return std::abs(x - SkDoubleToMScalar(1.0)) <= tolerance; |
41 } | 41 } |
42 | 42 |
| 43 static float Round(float f) { |
| 44 if (f == 0.f) |
| 45 return f; |
| 46 return (f > 0.f) ? std::floor(f + 0.5f) : std::ceil(f - 0.5f); |
| 47 } |
| 48 |
43 } // namespace | 49 } // namespace |
44 | 50 |
45 Transform::Transform(SkMScalar col1row1, | 51 Transform::Transform(SkMScalar col1row1, |
46 SkMScalar col2row1, | 52 SkMScalar col2row1, |
47 SkMScalar col3row1, | 53 SkMScalar col3row1, |
48 SkMScalar col4row1, | 54 SkMScalar col4row1, |
49 SkMScalar col1row2, | 55 SkMScalar col1row2, |
50 SkMScalar col2row2, | 56 SkMScalar col2row2, |
51 SkMScalar col3row2, | 57 SkMScalar col3row2, |
52 SkMScalar col4row2, | 58 SkMScalar col4row2, |
(...skipping 433 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
486 !DecomposeTransform(&from_decomp, from)) | 492 !DecomposeTransform(&from_decomp, from)) |
487 return false; | 493 return false; |
488 | 494 |
489 if (!BlendDecomposedTransforms(&to_decomp, to_decomp, from_decomp, progress)) | 495 if (!BlendDecomposedTransforms(&to_decomp, to_decomp, from_decomp, progress)) |
490 return false; | 496 return false; |
491 | 497 |
492 matrix_ = ComposeTransform(to_decomp).matrix(); | 498 matrix_ = ComposeTransform(to_decomp).matrix(); |
493 return true; | 499 return true; |
494 } | 500 } |
495 | 501 |
| 502 void Transform::RoundTranslationComponents() { |
| 503 matrix_.set(0, 3, Round(matrix_.get(0, 3))); |
| 504 matrix_.set(1, 3, Round(matrix_.get(1, 3))); |
| 505 } |
| 506 |
| 507 |
496 void Transform::TransformPointInternal(const SkMatrix44& xform, | 508 void Transform::TransformPointInternal(const SkMatrix44& xform, |
497 Point3F* point) const { | 509 Point3F* point) const { |
498 if (xform.isIdentity()) | 510 if (xform.isIdentity()) |
499 return; | 511 return; |
500 | 512 |
501 SkMScalar p[4] = {SkFloatToMScalar(point->x()), SkFloatToMScalar(point->y()), | 513 SkMScalar p[4] = {SkFloatToMScalar(point->x()), SkFloatToMScalar(point->y()), |
502 SkFloatToMScalar(point->z()), 1}; | 514 SkFloatToMScalar(point->z()), 1}; |
503 | 515 |
504 xform.mapMScalars(p); | 516 xform.mapMScalars(p); |
505 | 517 |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 matrix_.get(2, 1), | 554 matrix_.get(2, 1), |
543 matrix_.get(2, 2), | 555 matrix_.get(2, 2), |
544 matrix_.get(2, 3), | 556 matrix_.get(2, 3), |
545 matrix_.get(3, 0), | 557 matrix_.get(3, 0), |
546 matrix_.get(3, 1), | 558 matrix_.get(3, 1), |
547 matrix_.get(3, 2), | 559 matrix_.get(3, 2), |
548 matrix_.get(3, 3)); | 560 matrix_.get(3, 3)); |
549 } | 561 } |
550 | 562 |
551 } // namespace gfx | 563 } // namespace gfx |
OLD | NEW |