85 lines
2.0 KiB
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;
|
|
} |