blob: 7b8e5ed98106bd2a86f714f906db8d31bfa4dae5 [file] [log] [blame] [edit]
// 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