@@ 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);
@@ 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;
}