#pragma once /** * @file video.hpp * @brief Marries the two classes together resolving what would otherwise be circular dependencies between Window and * Renderer */ #include #include #include /// We need to be able to return a Renderer from Window, but Renderer also needs to be able to return a Window, so we /// have to include both headers here to resolve the circular dependency. #include namespace hdk::sdl { /** @see SDL_GetRenderer * https://wiki.libsdl.org/SDL3/SDL_GetRenderer * @brief Get the renderer associated with a window. * @return Renderer The renderer associated with the window. If the window is invalid or has no renderer, returns an * invalid renderer. */ inline Renderer Window::GetRenderer() const { return Renderer(Renderer::get_or_view(SDL_GetRenderer(*this))); } /** @see SDL_GetRenderWindow * https://wiki.libsdl.org/SDL3/SDL_GetRenderWindow */ inline Window Renderer::GetWindow() const { return Window(Window::get_or_view(SDL_GetRenderWindow(*this))); } /** @see SDL_CreateWindowAndRenderer * https://wiki.libsdl.org/SDL3/SDL_CreateWindowAndRenderer * @brief Create a window and renderer with one function call. * @param title * @param width * @param height * @param window_flags * @return std::pair */ inline std::pair CreateWindowAndRenderer( const char* title, int width, int height, SDL_WindowFlags window_flags) { SDL_Window* window_ptr = nullptr; SDL_Renderer* renderer_ptr = nullptr; if (SDL_CreateWindowAndRenderer(title, width, height, window_flags, &window_ptr, &renderer_ptr)) { return { Window::get_or_cache(window_ptr, SDL_DestroyWindow), Renderer::get_or_cache(renderer_ptr, SDL_DestroyRenderer) }; } else { return { Window(nullptr), Renderer(nullptr) }; } } }