blob: 8a080e18b52a92aa55c0b6650b990970e8aecd09 [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.
#pragma once
#include <cfloat>
#include <type_traits>
#include <valarray>
#include "impeller/geometry/constants.h"
namespace impeller {
using Scalar = float;
template <class T, class = std::enable_if_t<std::is_arithmetic_v<T>>>
constexpr T Absolute(const T& val) {
return val >= T{} ? val : -val;
}
constexpr inline bool ScalarNearlyZero(Scalar x,
Scalar tolerance = kEhCloseEnough) {
return Absolute(x) <= tolerance;
}
constexpr inline bool ScalarNearlyEqual(Scalar x,
Scalar y,
Scalar tolerance = kEhCloseEnough) {
return ScalarNearlyZero(x - y, tolerance);
}
struct Degrees;
struct Radians {
Scalar radians = 0.0;
constexpr Radians() = default;
explicit constexpr Radians(Scalar p_radians) : radians(p_radians) {}
};
struct Degrees {
Scalar degrees = 0.0;
constexpr Degrees() = default;
explicit constexpr Degrees(Scalar p_degrees) : degrees(p_degrees) {}
constexpr operator Radians() const {
return Radians{degrees * kPi / 180.0f};
};
};
} // namespace impeller