2021-07-18 18:26:12 +02:00
|
|
|
#include <basic_widgets/core/renderer.hpp>
|
|
|
|
#include <basic_widgets/core/texture.hpp>
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
using namespace bwidgets;
|
|
|
|
|
2021-08-11 15:52:07 +02:00
|
|
|
Renderer::Renderer(SDL_Renderer* r)
|
|
|
|
: Wrapper(ptr_or_throw<SDLError>(r, __FILE__, __FUNCTION__, __LINE__),
|
|
|
|
[r](SDL_Renderer*) noexcept { SDL_DestroyRenderer(r); }),
|
|
|
|
info(_info(r))
|
|
|
|
{}
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-08-08 14:30:56 +02:00
|
|
|
Renderer::Renderer(SDL_Window* w, const int index, const uint32_t flags = 0)
|
2021-07-29 16:06:03 +02:00
|
|
|
: Renderer(ptr_or_throw<SDLError>(SDL_CreateRenderer(w, index, flags), __FILE__,
|
|
|
|
__FUNCTION__, __LINE__))
|
|
|
|
{}
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::blend_mode() -> SDL_BlendMode
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-07-30 20:41:47 +02:00
|
|
|
SDL_BlendMode mode {};
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_GetRenderDrawBlendMode(_data(), &mode), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
return mode;
|
|
|
|
}
|
|
|
|
|
2021-08-08 14:30:56 +02:00
|
|
|
auto Renderer::blend_mode(const SDL_BlendMode mode) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_SetRenderDrawBlendMode(_data(), mode), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::clear() -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderClear(_data()), __FILE__, __FUNCTION__,
|
2021-08-06 14:22:56 +02:00
|
|
|
__LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-12 16:10:49 +02:00
|
|
|
auto Renderer::copy(const Texture* t, const SDL_Rect* src, const SDL_Rect* dst)
|
|
|
|
-> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderCopy(_data(), t->_data(), src, dst), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_color() -> Color
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-06 14:22:56 +02:00
|
|
|
Color c;
|
|
|
|
SDLError::success_or_throw(
|
2021-08-11 15:52:07 +02:00
|
|
|
SDL_GetRenderDrawColor(_data(), &c().r, &c().g, &c().b, &c().a), __FILE__,
|
2021-08-06 14:22:56 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
return c;
|
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_color(const Color& c) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-06 14:22:56 +02:00
|
|
|
SDLError::success_or_throw(
|
2021-08-11 15:52:07 +02:00
|
|
|
SDL_SetRenderDrawColor(_data(), c().r, c().g, c().b, c().a), __FILE__,
|
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_line(const SDL_Point& a, const SDL_Point& b) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderDrawLine(_data(), a.x, a.y, b.x, b.y), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_lines(const std::vector<SDL_Point>& pts) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderDrawLines(_data(), pts.data(), (int)pts.size()),
|
2021-07-29 16:06:03 +02:00
|
|
|
__FILE__, __FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_point(const SDL_Point& p) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderDrawPoint(_data(), p.x, p.y), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_points(const std::vector<SDL_Point>& pts) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(
|
|
|
|
SDL_RenderDrawPoints(_data(), pts.data(), (int)pts.size()), __FILE__, __FUNCTION__,
|
|
|
|
__LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_rect(const SDL_Rect* r) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-07-26 22:57:28 +02:00
|
|
|
auto vp = viewport();
|
|
|
|
// Has glitch at top-left and bottom-right corner.
|
|
|
|
// The first corner has an extra pixel at y-1 and surimpression.
|
|
|
|
// The second corner is missing a pixel.
|
2021-07-30 20:41:47 +02:00
|
|
|
if (r != nullptr)
|
|
|
|
viewport({vp.x + r->x, vp.y + r->y, r->w - 1, r->h - 1}); // crop extra pixel
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderDrawRect(_data(), nullptr), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-08-06 14:22:56 +02:00
|
|
|
// add missing pixel. works sometimes…
|
|
|
|
if (r != nullptr) draw_point({r->w - 1, r->h - 1});
|
2021-07-29 16:06:03 +02:00
|
|
|
else draw_point({vp.w - 1, vp.h - 1});
|
2021-07-26 22:57:28 +02:00
|
|
|
|
|
|
|
viewport(vp);
|
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::draw_rects(const std::vector<SDL_Rect>& rs) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderDrawRects(_data(), rs.data(), (int)rs.size()),
|
2021-07-29 16:06:03 +02:00
|
|
|
__FILE__, __FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::fill_rect(const SDL_Rect* r) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderFillRect(_data(), r), __FILE__, __FUNCTION__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::fill_rects(const std::vector<SDL_Rect>& rs) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderFillRects(_data(), rs.data(), (int)rs.size()),
|
2021-07-29 16:06:03 +02:00
|
|
|
__FILE__, __FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::output_size() -> Size
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-07-30 20:41:47 +02:00
|
|
|
Size s {};
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_GetRendererOutputSize(_data(), &s.w, &s.h), __FILE__,
|
2021-07-29 16:06:03 +02:00
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
2021-08-08 16:00:22 +02:00
|
|
|
void Renderer::present() noexcept
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDL_RenderPresent(_data());
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|
|
|
|
|
2021-08-08 16:00:22 +02:00
|
|
|
auto Renderer::viewport() noexcept -> SDL_Rect
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
|
|
|
SDL_Rect vp;
|
2021-08-11 15:52:07 +02:00
|
|
|
SDL_RenderGetViewport(_data(), &vp);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
|
|
|
return vp;
|
|
|
|
}
|
|
|
|
|
2021-08-06 14:22:56 +02:00
|
|
|
auto Renderer::viewport(const SDL_Rect* vp) -> Renderer*
|
2021-07-16 17:18:13 +02:00
|
|
|
{
|
2021-08-11 15:52:07 +02:00
|
|
|
SDLError::success_or_throw(SDL_RenderSetViewport(_data(), vp), __FILE__,
|
|
|
|
__FUNCTION__, __LINE__);
|
2021-07-16 17:18:13 +02:00
|
|
|
|
2021-07-18 18:26:12 +02:00
|
|
|
return this;
|
2021-07-16 17:18:13 +02:00
|
|
|
}
|