From 467a6990b0ee9ba568008697ba2f31b26951dbeb Mon Sep 17 00:00:00 2001 From: Nao Pross Date: Wed, 23 Jan 2019 01:12:09 +0100 Subject: Separate renderer from window --- include/video.hpp | 34 +++++++++++++++++++++++++++++++-- test/window_test.cpp | 1 - video.cpp | 53 +++++++++++++++++++++++++++++++++++++++++----------- wrapsdl2.cpp | 12 ++++-------- 4 files changed, 78 insertions(+), 22 deletions(-) diff --git a/include/video.hpp b/include/video.hpp index a00f77e..23c1c6e 100644 --- a/include/video.hpp +++ b/include/video.hpp @@ -12,13 +12,37 @@ namespace wsdl2 { typedef SDL_Point point; typedef SDL_Rect rect; + class window; + + class renderer { + public: + friend class window; + + renderer(window& w); + virtual ~renderer(); + + inline void clear() { SDL_RenderClear(safe()); } + inline void present() { SDL_RenderPresent(safe()); } + + // dirty C code + inline SDL_Renderer* sdl() { return m_renderer; } + + private: + renderer(); + + SDL_Renderer* safe(); + void create_sdl_renderer(SDL_Window *win); + + SDL_Renderer *m_renderer; + }; + class window { public: window() = delete; window(const window& other) = delete; window(const std::string& title, std::size_t width, std::size_t height); - ~window(); + virtual ~window(); // setters void open(); @@ -35,9 +59,15 @@ namespace wsdl2 { // rendering void update(); + // dirty C code + inline SDL_Window* sdl() { return m_window; } + private: bool m_open; + renderer m_renderer; SDL_Window *m_window; - SDL_Renderer *m_renderer; }; + + + } \ No newline at end of file diff --git a/test/window_test.cpp b/test/window_test.cpp index 17c7cf4..3971645 100644 --- a/test/window_test.cpp +++ b/test/window_test.cpp @@ -25,7 +25,6 @@ int main(int argc, char *argv[]) { std::optional ev = poll_event(); if (ev.has_value()) { event& event = ev.value(); - npdebug("received event", event.sdl().type); // TODO: remove this sdl code if (event.sdl().type == SDL_WINDOWEVENT) { diff --git a/video.cpp b/video.cpp index 68beff7..db153c7 100644 --- a/video.cpp +++ b/video.cpp @@ -27,21 +27,13 @@ window::window(const std::string& title, std::size_t width, std::size_t height) throw std::runtime_error("failed to create SDL window"); } - // create a rendering contest - m_renderer = SDL_CreateRenderer( - m_window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC - ); + m_renderer.create_sdl_renderer(m_window); // other attributes m_open = false; } window::~window() { - if (m_renderer != NULL) - SDL_DestroyRenderer(m_renderer); - else - npdebug("warning: m_renderer is NULL") - if (m_window != NULL) SDL_DestroyWindow(m_window); else @@ -68,6 +60,45 @@ bool window::is_visible() { } void window::update() { - SDL_RenderClear(m_renderer); - SDL_RenderPresent(m_renderer); + m_renderer.clear(); + m_renderer.present(); +} + + +/* class renderer */ + +renderer::renderer() { + npdebug("warning: created uninitialized renderer object"); +} + +SDL_Renderer * renderer::safe() { +#ifndef WRAPSDL2_UNSAFE + if (m_renderer == NULL) { + throw std::runtime_error("attempted to call safe() when m_renderer is NULL"); + } +#endif + + return m_renderer; +} + +void renderer::create_sdl_renderer(SDL_Window *win) { + // create a rendering contest + m_renderer = SDL_CreateRenderer( + win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC + ); + + if (m_renderer == NULL) { + throw std::runtime_error("failed to create SDL renderer"); + } +} + +renderer::renderer(window& w) { + create_sdl_renderer(w.sdl()); +} + +renderer::~renderer() { + if (m_renderer != NULL) + SDL_DestroyRenderer(m_renderer); + else + npdebug("warning: m_renderer is NULL") } \ No newline at end of file diff --git a/wrapsdl2.cpp b/wrapsdl2.cpp index a0fa624..393bff6 100644 --- a/wrapsdl2.cpp +++ b/wrapsdl2.cpp @@ -11,20 +11,16 @@ extern "C" { bool wsdl2::initialize(void) { if (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) { -#ifdef WRAPSDL2_EXCEPTIONS - throw std::runtime_error("failed to initialize sdl video subsystem"); -#endif + throw std::runtime_error("failed to initialize SDL video subsystem"); return false; } if (SDL_InitSubSystem(SDL_INIT_EVENTS) < 0) { -#ifdef WRAPSDL2_EXCEPTIONS - throw std::runtime_error("failed to initialzie sdl events subsystem"); -#endif + throw std::runtime_error("failed to initialzie SDL events subsystem"); return false; } - npdebug("initialized sdl2"); + npdebug("initialized SDL2"); return true; } @@ -38,7 +34,7 @@ void wsdl2::quit(void) { SDL_Quit(); - npdebug("deinitialized (quit) sdl2"); + npdebug("deinitialized (quit) SDL2"); } -- cgit v1.2.1