// // Created by william on 17/05/24. // #include "window.h" #include "log.h" NesWindow window_init(int width, int height, char *title) { NesWindow win; win.width = width * WINDOW_SCALING; win.height = height * WINDOW_SCALING; win.canvas = canvas_init(width, height); int renderer_flags = SDL_RENDERER_ACCELERATED; int window_flags = 0; if (SDL_Init(SDL_INIT_VIDEO) < 0) { log_error("Couldn't initialize SDL: %s", SDL_GetError()); exit(-1); } win.window = SDL_CreateWindow(title, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, win.width, win.height, window_flags); if (!win.window) { log_error("Failed to open %d x %d window: %s", win.width, win.height, SDL_GetError()); exit(-1); } SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear"); win.renderer = SDL_CreateRenderer(win.window, -1, renderer_flags); if (!win.renderer) { log_error("Failed to create renderer: %s\n", SDL_GetError()); exit(-1); } return win; } void window_uninit(NesWindow *window) { canvas_uninit(&window->canvas); } void window_render(NesWindow *window) { SDL_RenderClear(window->renderer); for (int x = 0; x < window->canvas.width; x++) { for (int y = 0; y < window->canvas.height; y++) { int pixel_index = x + y * window->canvas.width; Pixel pixel = window->canvas.pixels[pixel_index]; SDL_SetRenderDrawColor(window->renderer, pixel.r, pixel.g, pixel.b, 255); for (int i = 0; i < WINDOW_SCALING; i++) { for (int j = 0; j < WINDOW_SCALING; j++) { int scaled_x = x * WINDOW_SCALING + i; int scaled_y = y * WINDOW_SCALING + j; SDL_RenderDrawPoint(window->renderer, scaled_x, scaled_y); } } } } } void window_present(NesWindow *window) { SDL_RenderPresent(window->renderer); }