From 5ce56c337bfc58b08382aef46ab299c1546fec16 Mon Sep 17 00:00:00 2001 From: Alejandro Laguna Date: Mon, 20 Jul 2026 16:21:46 +0200 Subject: [PATCH] refactor: separate SDL init to a diff function --- include/mandelbrot.h | 6 ++++++ src/main.c | 43 ++++++++++++++++++++++++++++--------------- 2 files changed, 34 insertions(+), 15 deletions(-) diff --git a/include/mandelbrot.h b/include/mandelbrot.h index f377522b3c91469042dd6683e95f1b7d07ce1085..c2ddcbfaf5cdd42b27eada455859f289728e5ae4 100644 --- a/include/mandelbrot.h +++ b/include/mandelbrot.h @@ -18,6 +18,12 @@ typedef struct position_s { double y_max; } position_t; +typedef struct state_s { + SDL_Window* window; + SDL_Surface* surface; + SDL_Renderer* renderer; +} state_t; + // math.c int mandelbrot_iterations(double cr, double ci, int max_iter); void calculate_points(position_t* pos); diff --git a/src/main.c b/src/main.c index a7d755a2e6ba3769280753dc321c4721989db342..1b68d61e92b94f56ce73cbf8ca6997302e802562 100644 --- a/src/main.c +++ b/src/main.c @@ -14,39 +14,52 @@ extern int points[WINDOW_WIDTH * WINDOW_HEIGHT]; -int main(void) { +state_t* init() { + state_t *state = malloc(sizeof(state_t)); if (!SDL_Init(SDL_INIT_VIDEO | SDL_INIT_EVENTS)) { fprintf(stderr, "SDL_Init failed: %s\n", SDL_GetError()); - return -1; + return NULL; } - SDL_Window* window = SDL_CreateWindow(WINDOW_TITLE, WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_HIDDEN); if (window == NULL) { fprintf(stderr, "CreateWindow failed: %s\n", SDL_GetError()); SDL_Quit(); - return -1; + free(state); + return NULL; } - SDL_Surface* surface = SDL_GetWindowSurface(window); if (!surface) { fprintf(stderr, "GetWindowSurface failed: %s\n", SDL_GetError()); SDL_DestroyWindow(window); SDL_Quit(); - return -1; + free(state); + return NULL; } - SDL_Renderer* renderer = SDL_CreateSoftwareRenderer(surface); if (renderer == NULL) { fprintf(stderr, "CreateSoftwareRenderer failed: %s\n", SDL_GetError()); SDL_DestroyWindow(window); + SDL_DestroySurface(surface); SDL_Quit(); + free(state); + return NULL; + } + state->window = window; + state->surface = surface; + state->renderer = renderer; + return state; +} + +int main(void) { + state_t *state = init(); + if (state == NULL) { return -1; } SDL_Event e; bool running = true; - SDL_ShowWindow(window); + SDL_ShowWindow(state->window); position_t position; position.x_min = -2.0; @@ -146,17 +159,17 @@ int main(void) { calculate_points(&position); pos_updated = false; } - draw_points(surface); + draw_points(state->surface); if (debug_text[0] != '\0') { - SDL_SetRenderDrawColor(renderer, 64, 224, 208, 255); - SDL_RenderDebugText(renderer, 10, 10, debug_text); + SDL_SetRenderDrawColor(state->renderer, 64, 224, 208, 255); + SDL_RenderDebugText(state->renderer, 10, 10, debug_text); } - SDL_RenderPresent(renderer); - SDL_UpdateWindowSurface(window); + SDL_RenderPresent(state->renderer); + SDL_UpdateWindowSurface(state->window); SDL_Delay(16); } - SDL_DestroyRenderer(renderer); - SDL_DestroyWindow(window); + SDL_DestroyRenderer(state->renderer); + SDL_DestroyWindow(state->window); SDL_Quit(); return 0; }