diff --git a/include/window/window.h b/include/window/window.h index bc99300..a1e6846 100644 --- a/include/window/window.h +++ b/include/window/window.h @@ -13,19 +13,21 @@ typedef struct { } colour_t; typedef struct { - u64 width; - u64 height; + u32 width; + u32 height; + u32 half_width; + u32 half_height; const char *title; SDL_Window *window; SDL_Surface *front_buffer; SDL_Surface *back_buffer; } window_t; -bool init_window(window_t *wnd, u64 width, u64 height, const char *title); +bool init_window(window_t *wnd, u32 width, u32 height, const char *title); void close_window(window_t *wnd); void clear_window(window_t *wnd, colour_t colour); -void set_pixel(window_t *wnd, f32 x, f32 y, colour_t colour); +void set_pixel(window_t *wnd, i32 x, i32 y, colour_t colour); void swap_buffers(window_t *wnd); #endif // !WINDOW_H diff --git a/src/window/window.c b/src/window/window.c index b3f299f..5ec845f 100644 --- a/src/window/window.c +++ b/src/window/window.c @@ -7,21 +7,26 @@ #include <stdbool.h> #include <stdio.h> -#define NORMALISED_MIN -1.0f -#define NORMALISED_MAX 1.0f - u32 colour_to_u32(colour_t colour); u32 index_from_coordinates(window_t *wnd, u32 x, u32 y); -i32 denormalise(f32 value, u32 max); +i32 denormalise(i32 value, u32 max, u32 abs_normalised); void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour); -bool init_window(window_t *wnd, u64 width, u64 height, const char *title) { +bool init_window(window_t *wnd, u32 width, u32 height, const char *title) { if (SDL_Init(SDL_INIT_EVERYTHING) != 0) { printf("Failed to initialise SDL: %s\n", SDL_GetError()); return false; } + if (width % 2 != 0) { + ++width; + } + + if (height % 2 != 0) { + ++height; + } + wnd->window = SDL_CreateWindow(title, SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); if (!(wnd->window)) { @@ -53,6 +58,8 @@ bool init_window(window_t *wnd, u64 width, u64 height, const char *title) { wnd->width = width; wnd->height = height; + wnd->half_width = width / 2; + wnd->half_height = height / 2; wnd->title = title; return true; @@ -95,9 +102,9 @@ void clear_window(window_t *wnd, colour_t colour) { SDL_UnlockSurface(wnd->back_buffer); } -void set_pixel(window_t *wnd, f32 x, f32 y, colour_t colour) { - i32 screen_x = denormalise(x, wnd->width); - i32 screen_y = denormalise(-y, wnd->height); +void set_pixel(window_t *wnd, i32 x, i32 y, colour_t colour) { + i32 screen_x = denormalise(x, wnd->width, wnd->half_width); + i32 screen_y = denormalise(-y, wnd->height, wnd->half_height); if (screen_x < 0 || screen_y < 0) { return; @@ -125,13 +132,22 @@ u32 index_from_coordinates(window_t *wnd, u32 x, u32 y) { return y * wnd->width + x; } -i32 denormalise(f32 value, u32 max) { - if (max == 0 || value < NORMALISED_MIN || value >= NORMALISED_MAX) { +i32 denormalise(i32 value, u32 max, u32 abs_normalised) { + i32 normalised_min = -abs_normalised; + i32 normalised_max = abs_normalised; + + if (max == 0) { return -1; } - return (i32)(((value - NORMALISED_MIN) * max) / - (NORMALISED_MAX - NORMALISED_MIN)); + i32 denormalised = (i32)(((value - normalised_min) * max) / + (normalised_max - normalised_min)); + + if (denormalised < 0 || denormalised >= max) { + return -1; + } + + return denormalised; } void set_screen_pixel(window_t *wnd, u32 x, u32 y, colour_t colour) {