bwidgets/inc/basic_widgets/core/renderer.hpp

99 lines
3.1 KiB
C++
Raw Normal View History

2021-08-06 14:22:56 +02:00
#ifndef BWIDGETS_RENDERER_HPP
#define BWIDGETS_RENDERER_HPP
#include <memory>
2021-08-14 16:37:02 +02:00
#include <span>
2021-08-23 00:00:57 +02:00
#include <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>
#include <basic_widgets/core/type/deleter.hpp>
#include <basic_widgets/core/type/size.hpp>
2021-08-06 14:22:56 +02:00
namespace bwidgets
{
2021-08-06 14:22:56 +02:00
class Texture;
2021-08-23 23:50:14 +02:00
// Wrap some of SDL's 2D accelerated rendering API.
class Renderer final
{
2021-08-11 15:52:07 +02:00
friend Texture;
const std::unique_ptr<SDL_Renderer, Deleter> _data;
static auto _info(SDL_Renderer* r) -> SDL_RendererInfo
{
SDL_RendererInfo info;
2021-08-13 22:00:42 +02:00
success_or_throw<SDLError>(SDL_GetRendererInfo(r, &info));
return info;
}
public:
2021-08-06 14:22:56 +02:00
const SDL_RendererInfo info;
2021-08-14 16:44:47 +02:00
explicit Renderer(SDL_Renderer*);
Renderer(SDL_Window*, int, uint32_t);
2021-08-06 14:22:56 +02:00
Renderer(const Renderer&) = delete;
Renderer(Renderer&&) = delete;
~Renderer() noexcept = default;
2021-08-06 14:22:56 +02:00
auto operator=(const Renderer&) = delete;
auto operator=(Renderer&&) = delete;
2021-08-06 14:22:56 +02:00
[[nodiscard]] auto blend_mode() -> SDL_BlendMode;
auto blend_mode(SDL_BlendMode) -> Renderer*;
auto clear() -> Renderer*;
auto copy(const Texture&, const SDL_Rect*, const SDL_Rect*) -> Renderer*;
2021-08-06 14:22:56 +02:00
[[nodiscard]] auto draw_color() -> Color;
2021-08-14 16:37:02 +02:00
auto draw_color(Color) -> Renderer*;
auto draw_line(SDL_Point, SDL_Point) -> Renderer*;
auto draw_lines(std::span<SDL_Point>) -> Renderer*;
auto draw_point(SDL_Point) -> Renderer*;
auto draw_points(std::span<SDL_Point>) -> Renderer*;
2021-08-06 14:22:56 +02:00
auto draw_rect(const SDL_Rect*) -> Renderer*;
2021-08-14 16:37:02 +02:00
auto draw_rects(std::span<SDL_Rect>) -> Renderer*;
2021-08-06 14:22:56 +02:00
auto fill_rect(const SDL_Rect*) -> Renderer*;
2021-08-14 16:37:02 +02:00
auto fill_rects(std::span<SDL_Rect>) -> Renderer*;
2021-08-06 14:22:56 +02:00
[[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*;
auto copy(const Texture& t, const SDL_Rect* src, const SDL_Rect& dst)
{
2021-08-08 14:30:56 +02:00
const auto d = dst;
return copy(t, src, &d);
}
auto copy(const Texture& t, const SDL_Rect& src, const SDL_Rect* dst)
{
2021-08-08 14:30:56 +02:00
const auto s = src;
return copy(t, &s, dst);
}
auto copy(const Texture& t, const SDL_Rect& src, const SDL_Rect& dst)
{
2021-08-08 14:30:56 +02:00
const auto s = src;
const auto d = dst;
return copy(t, &s, &d);
}
auto draw_rect(SDL_Rect&& r)
{
2021-08-08 14:30:56 +02:00
const auto rect = r;
return draw_rect(&rect);
}
auto fill_rect(SDL_Rect&& r)
{
2021-08-08 14:30:56 +02:00
const auto rect = r;
return fill_rect(&rect);
}
auto viewport(SDL_Rect&& vp)
{
2021-08-08 14:30:56 +02:00
const auto v = vp;
return viewport(&v);
}
};
}
#endif