From 5750185bd8a38ce2a450f47e3bd8d5315b455561 Mon Sep 17 00:00:00 2001 From: herbglitch Date: Sun, 3 Dec 2023 09:25:34 +0000 Subject: [PATCH] added views and temp circlefill --- include/arc/graphics/view.h | 59 +++++++++++++++++++++++++++++++++++++ src/graphics/sdl/view.c | 35 ++++++++++++++++++++++ 2 files changed, 94 insertions(+) create mode 100644 include/arc/graphics/view.h create mode 100644 src/graphics/sdl/view.c diff --git a/include/arc/graphics/view.h b/include/arc/graphics/view.h new file mode 100644 index 0000000..594a30a --- /dev/null +++ b/include/arc/graphics/view.h @@ -0,0 +1,59 @@ +#ifndef ARC_GRAPHICS_VIEW_H_ +#define ARC_GRAPHICS_VIEW_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include "arc/graphics/renderer.h" +#include "arc/math/rectangle.h" + +typedef struct ARC_View { + ARC_Renderer *renderer; + ARC_Rect bounds; +} ARC_View; + +/** + * @brief a function for ARC_View where contents of the function will be rendered within a view + * + * @param data data to be used within ARC_View_RenderFn + */ +typedef void (* ARC_View_RenderFn)(void *data); + +/** + * @brief creates ARC_View type + * + * @param view ARC_View to initialize + * @param renderer ARC_Renderer the view will render to + * @param bounds ARC_Rect bounds of the view within the renderer + */ +void ARC_View_Create(ARC_View **view, ARC_Renderer *renderer, ARC_Rect bounds); + +/** + * @brief destroys ARC_View type + */ +void ARC_View_Destroy(ARC_View *view); + +/** + * @brief renders callbacks contents within an ARC_View + * + * @param view ARC_View to be renedered to + * @param renderFn function which contents will render to given ARC_View + * @param data data to be used in renderFn + */ +void ARC_View_Render(ARC_View *view, ARC_View_RenderFn renderFn, void *data); + +/** + * @brief gets bounds from ARC_View type + * + * @param view ARC_View to get bounds from + * + * @return bounds of the view + */ +ARC_Rect ARC_View_GetBounds(ARC_View *view); + +#ifdef __cplusplus +} +#endif + +#endif // !ARC_GRAPHICS_VIEW_H_ diff --git a/src/graphics/sdl/view.c b/src/graphics/sdl/view.c new file mode 100644 index 0000000..ffa9483 --- /dev/null +++ b/src/graphics/sdl/view.c @@ -0,0 +1,35 @@ +#include "arc/graphics/view.h" + +#include "arc/std/errno.h" +#include +#include + +void ARC_View_Create(ARC_View **view, ARC_Renderer *renderer, ARC_Rect bounds){ + *view = (ARC_View *)malloc(sizeof(ARC_View)); + (*view)->renderer = renderer; + (*view)->bounds = bounds; +} + +void ARC_View_Destroy(ARC_View *view){ + free(view); +} + +void ARC_View_Render(ARC_View *view, ARC_View_RenderFn renderFn, void *data){ + int err = SDL_RenderSetViewport((SDL_Renderer *)view->renderer, (const SDL_Rect *)&(view->bounds)); + if(err){ + ARC_DEBUG_LOG(ARC_ERRNO_DATA, "in src/graphics/sdl/view.c ARC_View_Render(view, renderFn), SDL_RenderSetViewport(...) returned: %d", err); + return; + } + + renderFn(data); + + err = SDL_RenderSetViewport((SDL_Renderer *)view->renderer, NULL); + if(err){ + ARC_DEBUG_LOG(ARC_ERRNO_DATA, "in src/graphics/sdl/view.c ARC_View_Render(view, NULL), SDL_RenderSetViewport(...) returned: %d", err); + return; + } +} + +ARC_Rect ARC_View_GetBounds(ARC_View *view){ + return view->bounds; +}