blob: d92bd3379d6e14b496fec3f672220defa6a5aca0 [file] [log] [blame]
// 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.
#ifndef FLUTTER_IMPELLER_GEOMETRY_RSTRANSFORM_H_
#define FLUTTER_IMPELLER_GEOMETRY_RSTRANSFORM_H_
#include "flutter/impeller/geometry/point.h"
#include "flutter/impeller/geometry/rect.h"
#include "flutter/impeller/geometry/scalar.h"
#include "flutter/impeller/geometry/size.h"
namespace impeller {
/// A utility struct that stores a simple transform composed of a translation,
/// a rotation, and a uniform scale.
///
/// This transform is used by drawAtlas to transform the sprites.
/// This structure mirrors the Flutter RSTransform class.
struct RSTransform {
constexpr RSTransform()
: scaled_cos(1.0f),
scaled_sin(0.0f),
translate_x(0.0f),
translate_y(0.0f) {}
constexpr RSTransform(Scalar scaled_cos,
Scalar scaled_sin,
Scalar translate_x,
Scalar translate_y)
: scaled_cos(scaled_cos),
scaled_sin(scaled_sin),
translate_x(translate_x),
translate_y(translate_y) {}
/// Constructs an RSTransform from the indicated origin, uniform scale,
/// and radians rotation.
static inline RSTransform Make(Point origin, Scalar scale, Radians radians) {
auto scaled_cos_sin = Matrix::CosSin(radians) * scale;
return {scaled_cos_sin.x, scaled_cos_sin.y, origin.x, origin.y};
}
Scalar scaled_cos;
Scalar scaled_sin;
Scalar translate_x;
Scalar translate_y;
/// Returns true iff the resulting transformed quad will be aligned with
/// the axes, even if rotated by a quadrant rotation.
bool IsAxisAligned() const;
Matrix GetMatrix() const;
/// Returns the 4 corner points of the transformed quad for a sub-image
/// of the indicated size in the same order as Rect::GetPoints.
///
/// The order is UpperLeft, UpperRight, LowerLeft, LowerRight
void GetQuad(Scalar width, Scalar height, Quad& quad) const;
Quad GetQuad(Scalar width, Scalar height) const;
Quad GetQuad(Size size) const;
/// Returns the bounds of the 4 corner points of the transformed quad
/// for a sub-image of the indicated size.
std::optional<Rect> GetBounds(Scalar width, Scalar height) const;
std::optional<Rect> GetBounds(Size size) const;
};
} // namespace impeller
namespace std {
inline std::ostream& operator<<(std::ostream& out,
const impeller::RSTransform& rst) {
// clang-format off
out << "("
<< "scos: " << rst.scaled_cos << ", "
<< "ssin: " << rst.scaled_sin << ", "
<< "origin: (" << rst.translate_x << ", "
<< rst.translate_y << ")"
<< ")";
// clang-format on
return out;
}
} // namespace std
#endif // FLUTTER_IMPELLER_GEOMETRY_RSTRANSFORM_H_