| // 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 "flutter/lib/ui/painting/matrix.h" |
| |
| #include "flutter/fml/logging.h" |
| #include "flutter/lib/ui/floating_point.h" |
| |
| namespace flutter { |
| |
| // Mappings from SkMatrix-index to input-index. |
| static const int kSkMatrixIndexToMatrix4Index[] = { |
| // clang-format off |
| 0, 4, 12, |
| 1, 5, 13, |
| 3, 7, 15, |
| // clang-format on |
| }; |
| |
| SkM44 ToSkM44(const tonic::Float64List& matrix4) { |
| // clang-format off |
| return SkM44( |
| SafeNarrow(matrix4[ 0]), SafeNarrow(matrix4[ 4]), SafeNarrow(matrix4[ 8]), SafeNarrow(matrix4[12]), |
| SafeNarrow(matrix4[ 1]), SafeNarrow(matrix4[ 5]), SafeNarrow(matrix4[ 9]), SafeNarrow(matrix4[13]), |
| SafeNarrow(matrix4[ 2]), SafeNarrow(matrix4[ 6]), SafeNarrow(matrix4[10]), SafeNarrow(matrix4[14]), |
| SafeNarrow(matrix4[ 3]), SafeNarrow(matrix4[ 7]), SafeNarrow(matrix4[11]), SafeNarrow(matrix4[15]) |
| ); |
| // clang-format on |
| } |
| |
| SkMatrix ToSkMatrix(const tonic::Float64List& matrix4) { |
| FML_DCHECK(matrix4.data()); |
| SkMatrix sk_matrix; |
| for (int i = 0; i < 9; ++i) { |
| int matrix4_index = kSkMatrixIndexToMatrix4Index[i]; |
| if (matrix4_index < matrix4.num_elements()) { |
| sk_matrix[i] = SafeNarrow(matrix4[matrix4_index]); |
| } else { |
| sk_matrix[i] = 0.0f; |
| } |
| } |
| return sk_matrix; |
| } |
| |
| tonic::Float64List ToMatrix4(const SkMatrix& sk_matrix) { |
| tonic::Float64List matrix4(Dart_NewTypedData(Dart_TypedData_kFloat64, 16)); |
| for (int i = 0; i < 9; ++i) { |
| matrix4[kSkMatrixIndexToMatrix4Index[i]] = sk_matrix[i]; |
| } |
| matrix4[10] = 1.0; // Identity along the z axis. |
| return matrix4; |
| } |
| |
| } // namespace flutter |