nesemu/gui/gui.c

85 lines
2.0 KiB
C

//
// Created by william on 16/05/24.
//
#include "gui.h"
#include "log.h"
NesGui gui;
int gui_init() {
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());
return -1;
}
gui.window = SDL_CreateWindow("NES Emulator", SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, GUI_WIDTH,
GUI_HEIGHT, window_flags);
if (!gui.window) {
log_error("Failed to open %d x %d window: %s", GUI_WIDTH, GUI_HEIGHT, SDL_GetError());
return -1;
}
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");
gui.renderer = SDL_CreateRenderer(gui.window, -1, renderer_flags);
if (!gui.renderer) {
log_error("Failed to create renderer: %s\n", SDL_GetError());
return -1;
}
return 1;
}
int gui_input() {
SDL_Event event;
while (SDL_PollEvent(&event)) {
switch (event.type) {
case SDL_QUIT:
return -1;
default:
break;
}
}
return 1;
}
void gui_prepare() {
SDL_SetRenderDrawColor(gui.renderer, 96, 128, 255, 255);
SDL_RenderClear(gui.renderer);
}
void gui_render() {
for (int x = 0; x < CANVAS_WIDTH; x++) {
for (int y = 0; y < CANVAS_HEIGHT; y++) {
int pixel_index = CANVAS_INDEX(x, y);
Pixel pixel = gui.canvas.pixels[pixel_index];
SDL_SetRenderDrawColor(gui.renderer, pixel.r, pixel.g, pixel.b, 255);
for (int i = 0; i < GUI_SCALING; i++) {
for (int j = 0; j < GUI_SCALING; j++) {
int scaled_x = x * GUI_SCALING + i;
int scaled_y = y * GUI_SCALING + j;
SDL_RenderDrawPoint(gui.renderer, scaled_x, scaled_y);
}
}
}
}
}
void gui_present() {
SDL_RenderPresent(gui.renderer);
}
void gui_uninit() {
}
Canvas *gui_get_canvas() {
return &gui.canvas;
}