2021-08-06 14:22:56 +02:00
|
|
|
#ifndef BWIDGETS_RENDERER_HPP
|
|
|
|
#define BWIDGETS_RENDERER_HPP
|
2021-07-18 18:26:12 +02:00
|
|
|
|
|
|
|
#include <cstdint>
|
2021-08-10 23:48:19 +02:00
|
|
|
#include <memory>
|
2021-07-18 18:26:12 +02:00
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
#include <SDL2/SDL_render.h>
|
|
|
|
|
2021-08-13 22:00:42 +02:00
|
|
|
#include <basic_widgets/core/error_helper.hpp>
|
2021-08-06 14:22:56 +02:00
|
|
|
#include <basic_widgets/core/type/color.hpp>
|
2021-07-18 18:26:12 +02:00
|
|
|
#include <basic_widgets/core/type/opaque_struct.hpp>
|
|
|
|
#include <basic_widgets/core/type/sdl_error.hpp>
|
|
|
|
#include <basic_widgets/core/type/size.hpp>
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
namespace bwidgets
|
2021-07-18 18:26:12 +02:00
|
|
|
{
|
2021-08-06 14:22:56 +02:00
|
|
|
class Texture;
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-08-11 15:52:07 +02:00
|
|
|
class Renderer final : OpaqueStruct<SDL_Renderer>::Wrapper
|
2021-07-18 18:26:12 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
friend Texture;
|
|
|
|
|
2021-07-30 20:41:47 +02:00
|
|
|
static inline auto _info(SDL_Renderer* r) -> SDL_RendererInfo
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
|
|
|
SDL_RendererInfo info;
|
2021-08-13 22:00:42 +02:00
|
|
|
success_or_throw<SDLError>(SDL_GetRendererInfo(r, &info));
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-07-29 16:06:03 +02:00
|
|
|
return info;
|
|
|
|
}
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-07-29 16:06:03 +02:00
|
|
|
public:
|
2021-08-06 14:22:56 +02:00
|
|
|
const SDL_RendererInfo info;
|
|
|
|
|
2021-07-29 16:06:03 +02:00
|
|
|
Renderer(SDL_Renderer*);
|
|
|
|
Renderer(SDL_Window*, int, uint32_t);
|
2021-08-06 14:22:56 +02:00
|
|
|
Renderer(const Renderer&) = delete;
|
2021-08-12 15:29:25 +02:00
|
|
|
Renderer(Renderer&&) = delete;
|
|
|
|
~Renderer() noexcept = default;
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto operator=(const Renderer&) = delete;
|
2021-08-12 15:29:25 +02:00
|
|
|
auto operator=(Renderer&&) = delete;
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
[[nodiscard]] auto blend_mode() -> SDL_BlendMode;
|
|
|
|
auto blend_mode(SDL_BlendMode) -> Renderer*;
|
|
|
|
auto clear() -> Renderer*;
|
2021-08-12 16:10:49 +02:00
|
|
|
auto copy(const Texture*, const SDL_Rect*, const SDL_Rect*) -> Renderer*;
|
2021-08-06 14:22:56 +02:00
|
|
|
[[nodiscard]] auto draw_color() -> Color;
|
|
|
|
auto draw_color(const Color&) -> Renderer*;
|
|
|
|
auto draw_line(const SDL_Point&, const SDL_Point&) -> Renderer*;
|
|
|
|
auto draw_lines(const std::vector<SDL_Point>&) -> Renderer*;
|
|
|
|
auto draw_point(const SDL_Point&) -> Renderer*;
|
|
|
|
auto draw_points(const std::vector<SDL_Point>&) -> Renderer*;
|
|
|
|
auto draw_rect(const SDL_Rect*) -> Renderer*;
|
|
|
|
auto draw_rects(const std::vector<SDL_Rect>&) -> Renderer*;
|
|
|
|
auto fill_rect(const SDL_Rect*) -> Renderer*;
|
|
|
|
auto fill_rects(const std::vector<SDL_Rect>&) -> Renderer*;
|
|
|
|
[[nodiscard]] auto output_size() -> Size;
|
2021-08-08 16:00:22 +02:00
|
|
|
void present() noexcept;
|
|
|
|
[[nodiscard]] auto viewport() noexcept -> SDL_Rect;
|
2021-08-06 14:22:56 +02:00
|
|
|
auto viewport(const SDL_Rect*) -> Renderer*;
|
2021-07-18 18:26:12 +02:00
|
|
|
|
2021-08-12 16:10:49 +02:00
|
|
|
inline auto copy(const Texture* t, const SDL_Rect* src, const SDL_Rect& dst)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto d = dst;
|
2021-07-29 16:06:03 +02:00
|
|
|
return copy(t, src, &d);
|
|
|
|
}
|
2021-08-12 16:10:49 +02:00
|
|
|
inline auto copy(const Texture* t, const SDL_Rect& src, const SDL_Rect* dst)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto s = src;
|
2021-07-29 16:06:03 +02:00
|
|
|
return copy(t, &s, dst);
|
|
|
|
}
|
2021-08-12 16:10:49 +02:00
|
|
|
inline auto copy(const Texture* t, const SDL_Rect& src, const SDL_Rect& dst)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto s = src;
|
|
|
|
const auto d = dst;
|
2021-07-29 16:06:03 +02:00
|
|
|
return copy(t, &s, &d);
|
|
|
|
}
|
2021-08-10 23:48:19 +02:00
|
|
|
inline auto draw_rect(const SDL_Rect& r)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto rect = r;
|
2021-07-29 16:06:03 +02:00
|
|
|
return draw_rect(&rect);
|
|
|
|
}
|
2021-08-10 23:48:19 +02:00
|
|
|
inline auto fill_rect(const SDL_Rect& r)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto rect = r;
|
2021-07-29 16:06:03 +02:00
|
|
|
return fill_rect(&rect);
|
|
|
|
}
|
2021-08-10 23:48:19 +02:00
|
|
|
inline auto viewport(const SDL_Rect& vp)
|
2021-07-29 16:06:03 +02:00
|
|
|
{
|
2021-08-08 14:30:56 +02:00
|
|
|
const auto v = vp;
|
2021-07-29 16:06:03 +02:00
|
|
|
return viewport(&v);
|
|
|
|
}
|
2021-07-18 18:26:12 +02:00
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|