blob: d33c2d9dfe73f05f77431be8e248fa59dff7584e [file] [log] [blame]
// Copyright 2016 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef UI_GFX_MOJOM_TRANSFORM_MOJOM_TRAITS_H_
#define UI_GFX_MOJOM_TRANSFORM_MOJOM_TRAITS_H_
#include <array>
#include "base/check.h"
#include "mojo/public/cpp/bindings/array_traits.h"
#include "mojo/public/cpp/bindings/union_traits.h"
#include "ui/gfx/geometry/mojom/geometry_mojom_traits.h"
#include "ui/gfx/geometry/transform.h"
#include "ui/gfx/mojom/transform.mojom-shared.h"
namespace mojo {
template <>
struct UnionTraits<gfx::mojom::TransformDataDataView, gfx::Transform> {
static bool IsNull(const gfx::Transform& transform) {
return transform.IsIdentity();
}
static void SetToNull(gfx::Transform* out) { out->MakeIdentity(); }
static gfx::mojom::TransformDataDataView::Tag GetTag(
const gfx::Transform& transform) {
if (transform.full_matrix_) {
return gfx::mojom::TransformDataDataView::Tag::kMatrix;
}
return gfx::mojom::TransformDataDataView::Tag::kAxis2d;
}
static const gfx::AxisTransform2d& axis_2d(const gfx::Transform& transform) {
DCHECK(!transform.full_matrix_);
return transform.axis_2d_;
}
static std::array<double, 16> matrix(const gfx::Transform& transform) {
DCHECK(transform.full_matrix_);
std::array<double, 16> matrix_array;
transform.GetColMajor(matrix_array);
return matrix_array;
}
static bool Read(gfx::mojom::TransformDataDataView data,
gfx::Transform* out) {
switch (data.tag()) {
case gfx::mojom::TransformDataDataView::Tag::kAxis2d: {
gfx::AxisTransform2d axis_2d;
if (!data.ReadAxis2d(&axis_2d)) {
return false;
}
*out = gfx::Transform(axis_2d);
return true;
}
case gfx::mojom::TransformDataDataView::Tag::kMatrix: {
ArrayDataView<double> matrix_data;
data.GetMatrixDataView(&matrix_data);
*out = gfx::Transform::ColMajor(base::span(matrix_data).first<16>());
return true;
}
}
return false;
}
};
template <>
struct StructTraits<gfx::mojom::TransformDataView, gfx::Transform> {
static const gfx::Transform& data(const gfx::Transform& transform) {
return transform;
}
static bool Read(gfx::mojom::TransformDataView data, gfx::Transform* out) {
return data.ReadData(out);
}
};
} // namespace mojo
#endif // UI_GFX_MOJOM_TRANSFORM_MOJOM_TRAITS_H_