Initial Video, Render, and Properties implementations.

Co-authored-by: Copilot <copilot@github.com>
This commit is contained in:
BadQuanta
2026-04-26 14:39:01 +00:00
parent 6d0de7e621
commit 85dbe33a77
17 changed files with 2461 additions and 50 deletions
+47
View File
@@ -0,0 +1,47 @@
#pragma once
/**
* @file video.hpp
* @brief Marries the two classes together resolving what would otherwise be circular dependencies between Window and
* Renderer
*/
#include <hdk/sdl/video/Display.hpp>
#include <hdk/sdl/video/Surface.hpp>
#include <hdk/sdl/video/Window.hpp>
/// 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 <hdk/sdl/render/Renderer.hpp>
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<Window, Renderer>
*/
inline std::pair<Window, Renderer> 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) };
}
}
}