// SPDX-FileCopyrightText: 2013 Dolphin Emulator Project // SPDX-FileCopyrightText: 2014 Citra Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include namespace Common { constexpr float PI = 3.1415926535f; template struct Rectangle { T left{}; T top{}; T right{}; T bottom{}; constexpr Rectangle() = default; constexpr Rectangle(T left_, T top_, T right_, T bottom_) : left(left_), top(top_), right(right_), bottom(bottom_) {} [[nodiscard]] T GetWidth() const { if constexpr (std::is_floating_point_v) { return std::abs(right - left); } else { return static_cast(std::abs(static_cast>(right - left))); } } [[nodiscard]] T GetHeight() const { if constexpr (std::is_floating_point_v) { return std::abs(bottom - top); } else { return static_cast(std::abs(static_cast>(bottom - top))); } } [[nodiscard]] Rectangle TranslateX(const T x) const { return Rectangle{left + x, top, right + x, bottom}; } [[nodiscard]] Rectangle TranslateY(const T y) const { return Rectangle{left, top + y, right, bottom + y}; } [[nodiscard]] Rectangle Scale(const float s) const { return Rectangle{left, top, static_cast(static_cast(left + GetWidth()) * s), static_cast(static_cast(top + GetHeight()) * s)}; } }; template Rectangle(T, T, T, T) -> Rectangle; } // namespace Common