bwidgets/src/sdl/renderer.cpp

188 lines
4.4 KiB
C++
Raw Normal View History

2021-07-16 17:18:13 +02:00
#include <string>
#include <basic_widgets/sdl/renderer.hpp>
#include <basic_widgets/sdl/texture.hpp>
using namespace bwidgets;
using exception::SDLError;
using exception::ptr_or_throw;
using std::vector;
sdl::Renderer::Renderer(SDL_Renderer* r)
: DataType(r),
info(_info(r))
{
}
sdl::Renderer::Renderer(SDL_Window* w, int index, uint32_t flags=0)
: DataType(ptr_or_throw<SDLError>(SDL_CreateRenderer(w, index, flags),
__FILE__, __FUNCTION__, __LINE__,
exception::Base::Args({
{"w", std::to_string((size_t)w)},
{"index", std::to_string(index)},
{"flags", std::to_string(flags)}
}))),
info(_info(c_pod))
{
}
sdl::Renderer::~Renderer()
{
SDL_DestroyRenderer(c_pod);
}
SDL_BlendMode sdl::Renderer::blend_mode()
{
SDL_BlendMode mode;
SDLError::success_or_throw(SDL_GetRenderDrawBlendMode(c_pod, &mode),
__FILE__, __FUNCTION__, __LINE__);
return mode;
}
sdl::Renderer& sdl::Renderer::blend_mode(SDL_BlendMode mode)
{
SDLError::success_or_throw(SDL_SetRenderDrawBlendMode(c_pod, mode),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::clear()
{
SDLError::success_or_throw(SDL_RenderClear(c_pod),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::copy(sdl::Texture& t,
const SDL_Rect* src, const SDL_Rect* dst)
{
SDLError::success_or_throw(
SDL_RenderCopy(c_pod, t.c_pod, src, dst),
__FILE__, __FUNCTION__, __LINE__
);
return *this;
}
SDL_Color sdl::Renderer::draw_color()
{
SDL_Color c;
SDLError::success_or_throw(
SDL_GetRenderDrawColor(c_pod, &c.r, &c.g, &c.b, &c.a),
__FILE__, __FUNCTION__, __LINE__
);
return c;
}
sdl::Renderer& sdl::Renderer::draw_color(const SDL_Color& c)
{
SDLError::success_or_throw(
SDL_SetRenderDrawColor(c_pod, c.r, c.g, c.b, c.a),
__FILE__, __FUNCTION__, __LINE__
);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_line(const SDL_Point& a, const SDL_Point& b)
{
SDLError::success_or_throw(SDL_RenderDrawLine(c_pod, a.x, a.y, b.x, b.y),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_lines(vector<SDL_Point> pts)
{
SDLError::success_or_throw(SDL_RenderDrawLines(c_pod, pts.data(), pts.size()),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_point(const SDL_Point& p)
{
SDLError::success_or_throw(SDL_RenderDrawPoint(c_pod, p.x, p.y),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_points(const vector<SDL_Point> pts)
{
SDLError::success_or_throw(SDL_RenderDrawPoints(c_pod, pts.data(), pts.size()),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_rect(const SDL_Rect& r)
{
const SDL_Rect rect = r;
SDLError::success_or_throw(SDL_RenderDrawRect(c_pod, &rect),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::draw_rects(const vector<SDL_Rect> rs)
{
SDLError::success_or_throw(SDL_RenderDrawRects(c_pod, rs.data(), rs.size()),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::fill_rect(const SDL_Rect& r)
{
SDL_Rect rect = r;
SDLError::success_or_throw(SDL_RenderFillRect(c_pod, &rect),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Renderer& sdl::Renderer::fill_rects(const std::vector<SDL_Rect> rs)
{
SDLError::success_or_throw(SDL_RenderFillRects(c_pod, rs.data(), rs.size()),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}
sdl::Size sdl::Renderer::output_size()
{
Size s;
SDLError::success_or_throw(SDL_GetRendererOutputSize(c_pod, &s.w, &s.h),
__FILE__, __FUNCTION__, __LINE__);
return s;
}
void sdl::Renderer::present()
{
SDL_RenderPresent(c_pod);
}
SDL_Rect sdl::Renderer::viewport()
{
SDL_Rect vp;
SDL_RenderGetViewport(c_pod, &vp);
return vp;
}
sdl::Renderer& sdl::Renderer::viewport(const SDL_Rect* vp)
{
SDLError::success_or_throw(SDL_RenderSetViewport(c_pod, vp),
__FILE__, __FUNCTION__, __LINE__);
return *this;
}