| // Copyright 2013 The Flutter Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "transform.h" | |
| #include "base/string_utils.h" | |
| namespace gfx { | |
| Transform::Transform() | |
| : matrix_{1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1}, | |
| is_identity_(true) {} | |
| Transform::Transform(float col1row1, | |
| float col2row1, | |
| float col3row1, | |
| float col4row1, | |
| float col1row2, | |
| float col2row2, | |
| float col3row2, | |
| float col4row2, | |
| float col1row3, | |
| float col2row3, | |
| float col3row3, | |
| float col4row3, | |
| float col1row4, | |
| float col2row4, | |
| float col3row4, | |
| float col4row4) | |
| : matrix_{col1row1, col2row1, col3row1, col4row1, col1row2, col2row2, | |
| col3row2, col4row2, col1row3, col2row3, col3row3, col4row3, | |
| col4row4, col2row4, col3row4, col4row4} { | |
| UpdateIdentity(); | |
| } | |
| Transform::Transform(float col1row1, | |
| float col2row1, | |
| float col1row2, | |
| float col2row2, | |
| float x_translation, | |
| float y_translation) | |
| : matrix_{col1row1, | |
| col2row1, | |
| x_translation, | |
| 0, | |
| col1row2, | |
| col2row2, | |
| y_translation, | |
| 0, | |
| 0, | |
| 0, | |
| 1, | |
| 0, | |
| 0, | |
| 0, | |
| 0, | |
| 1} { | |
| UpdateIdentity(); | |
| } | |
| bool Transform::operator==(const Transform& rhs) const { | |
| return matrix_[0] == rhs[0] && matrix_[1] == rhs[1] && matrix_[2] == rhs[2] && | |
| matrix_[3] == rhs[3] && matrix_[4] == rhs[4] && matrix_[5] == rhs[5] && | |
| matrix_[6] == rhs[6] && matrix_[7] == rhs[7] && matrix_[8] == rhs[8] && | |
| matrix_[9] == rhs[9] && matrix_[10] == rhs[10] && | |
| matrix_[11] == rhs[11] && matrix_[12] == rhs[12] && | |
| matrix_[13] == rhs[13] && matrix_[14] == rhs[14] && | |
| matrix_[15] == rhs[15]; | |
| } | |
| bool Transform::IsIdentity() const { | |
| return is_identity_; | |
| } | |
| std::string Transform::ToString() const { | |
| return base::StringPrintf( | |
| "[ %+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" | |
| " %+0.4f %+0.4f %+0.4f %+0.4f ]\n", | |
| matrix_[0], matrix_[1], matrix_[2], matrix_[3], matrix_[4], matrix_[5], | |
| matrix_[6], matrix_[7], matrix_[8], matrix_[9], matrix_[10], matrix_[11], | |
| matrix_[12], matrix_[13], matrix_[14], matrix_[15]); | |
| } | |
| void Transform::Scale(float x, float y) { | |
| matrix_[0] *= x; | |
| matrix_[5] *= y; | |
| UpdateIdentity(); | |
| } | |
| void Transform::TransformRect(RectF* rect) const { | |
| if (IsIdentity()) | |
| return; | |
| PointF origin = rect->origin(); | |
| PointF top_right = rect->top_right(); | |
| PointF bottom_left = rect->bottom_left(); | |
| TransformPoint(&origin); | |
| TransformPoint(&top_right); | |
| TransformPoint(&bottom_left); | |
| rect->set_origin(origin); | |
| rect->set_width(top_right.x() - origin.x()); | |
| rect->set_height(bottom_left.y() - origin.y()); | |
| } | |
| void Transform::TransformPoint(PointF* point) const { | |
| if (IsIdentity()) | |
| return; | |
| float x = point->x(); | |
| float y = point->y(); | |
| point->SetPoint(x * matrix_[0] + y * matrix_[1] + matrix_[2], | |
| x * matrix_[4] + y * matrix_[5] + matrix_[6]); | |
| return; | |
| } | |
| void Transform::UpdateIdentity() { | |
| for (size_t i = 0; i < 16; i++) { | |
| if (i == 0 || i == 5 || i == 10 || i == 15) { | |
| if (matrix_[i] != 1) { | |
| is_identity_ = false; | |
| return; | |
| } | |
| } else { | |
| if (matrix_[i] != 0) { | |
| is_identity_ = false; | |
| return; | |
| } | |
| } | |
| } | |
| is_identity_ = true; | |
| } | |
| } // namespace gfx |