diff --git a/src/sdl_overlay.c b/src/sdl_overlay.c index 5eb7951..b0fe93f 100644 --- a/src/sdl_overlay.c +++ b/src/sdl_overlay.c @@ -117,8 +117,8 @@ void measure_string(sdl_overlay_font* font, const char* string, *w = max_w; } -void render_string(SDL_Renderer* rend, - int ox, int oy, int sx, int sy, +void render_string(SDL_Renderer* rend, int ox, int oy, + int vx, int vy, int sx, int sy, sdl_overlay_font* font, const char* string, uint32_t color) { int x = ox; @@ -135,8 +135,8 @@ void render_string(SDL_Renderer* rend, SDL_Texture* texture = font->textures[index]; SDL_Rect rect = { - .x = x * sx, - .y = y * sy, + .x = (x * sx) + vx, + .y = (y * sy) + vy, .w = cw * sx, .h = char_h * sy, }; @@ -157,16 +157,17 @@ void render_string(SDL_Renderer* rend, } int sdl_overlay_frame(Overlay* overlay, sdl_overlay_font* font, - SDL_Renderer* rend, + SDL_Renderer* rend, int vx, int vy, int sx, int sy) { int y = overlay_start_y; + int x = overlay_start_x; overlay_message* last = NULL, *next = NULL; for ( overlay_message* message = overlay->messages; NULL != message; last = message, message = next) { next = message->next; - render_string(rend, overlay_start_x, y, sx, sy, + render_string(rend, x, y, vx, vy, sx, sy, font, message->string, 0xFFFFFFFFU); y += (char_h + 1); diff --git a/src/sdl_overlay.h b/src/sdl_overlay.h index 6c2365d..17a5fd7 100644 --- a/src/sdl_overlay.h +++ b/src/sdl_overlay.h @@ -21,14 +21,14 @@ int sdl_overlay_font_init(SDL_Renderer*, sdl_overlay_font*); void sdl_overlay_font_done(sdl_overlay_font*); int sdl_overlay_frame(Overlay*, sdl_overlay_font*, SDL_Renderer*, - int sx, int sy); + int vx, int vy, int sx, int sy); void measure_string(sdl_overlay_font* font, const char* string, int* w, int* h); -void render_string(SDL_Renderer* rend, - int ox, int oy, int sx, int sy, +void render_string(SDL_Renderer* rend, int ox, int oy, + int vx, int vy, int sx, int sy, sdl_overlay_font* font, const char* string, uint32_t color); diff --git a/src/sdl_render.c b/src/sdl_render.c index bae0318..276f510 100644 --- a/src/sdl_render.c +++ b/src/sdl_render.c @@ -49,6 +49,7 @@ typedef struct { SDL_Texture* texture; int win_w; int win_h; + SDL_Rect view; } sdl_render_data; static sdl_render_data the_render_data = {0}; @@ -63,6 +64,8 @@ static int sdl_render_init(nes_Renderer* rend) { fprintf(stderr, "SDL: Failed to initialize\n"); } else { + SDL_ShowCursor(0); + SDL_DisplayMode mode = {0}; SDL_GetCurrentDisplayMode(0, &mode); @@ -84,11 +87,37 @@ static int sdl_render_init(nes_Renderer* rend) { fprintf(stderr, "SDL: Failed to create window\n"); SDL_Quit(); status = -1; + } else { + // TODO: Hide behind flag + SDL_SetWindowFullscreen(data->window, + SDL_WINDOW_FULLSCREEN); + SDL_GetWindowSize(data->window, + &data->win_w, &data->win_h); + + // Determine the viewport within the screen + + int w = data->win_w; + int h = data->win_h; + + if ((w * nes_ppu_scan_h) > (h * nes_ppu_scan_w)) { + w = (h * nes_ppu_scan_w) / nes_ppu_scan_h; + } else { + h = (w * nes_ppu_scan_h) / nes_ppu_scan_w; + } + + data->view.x = (data->win_w - w) / 2; + data->view.y = (data->win_h - h) / 2; + data->view.w = w; + data->view.h = h; } } if (0 == status) { - data->renderer = SDL_CreateRenderer(data->window, -1, 0); + data->renderer = SDL_CreateRenderer( + data->window, -1, + SDL_RENDERER_ACCELERATED | + SDL_RENDERER_PRESENTVSYNC + ); if (NULL == data->renderer) { fprintf(stderr, "SDL: Failed to create renderer\n"); SDL_DestroyWindow(data->window); @@ -545,14 +574,16 @@ static int sdl_render(nes_Renderer* rend, nes_ppu* ppu) { REND_LOG("Scanline %3d -> Postrender\n", ppu->scanline); SDL_UnlockTexture(data->texture); - SDL_RenderCopy(data->renderer, data->texture, NULL, NULL); + SDL_RenderCopy(data->renderer, data->texture, + NULL, &data->view); SDL_LockTextureToSurface(data->texture, NULL, &data->target); sdl_overlay_frame( &rend->overlay, &data->font, data->renderer, - data->win_w / nes_ppu_render_w, - data->win_h / nes_ppu_render_h + data->view.x, data->view.y, + data->view.w / nes_ppu_render_w, + data->view.h / nes_ppu_render_h ); SDL_RenderPresent(data->renderer); @@ -567,15 +598,18 @@ static int sdl_render(nes_Renderer* rend, nes_ppu* ppu) { static void sdl_redraw_frame(nes_Renderer* rend, int dim) { sdl_render_data* data = (sdl_render_data*)rend->data; + if (dim) { SDL_SetTextureAlphaMod(data->texture, 0x7F); SDL_SetTextureBlendMode(data->texture, SDL_BLENDMODE_BLEND); - SDL_RenderClear(data->renderer); } + SDL_RenderClear(data->renderer); + SDL_UnlockTexture(data->texture); - SDL_RenderCopy(data->renderer, data->texture, NULL, NULL); + SDL_RenderCopy(data->renderer, data->texture, + NULL, &data->view); SDL_LockTextureToSurface(data->texture, NULL, &data->target); if (dim) { @@ -593,9 +627,10 @@ static void sdl_draw_text(nes_Renderer* rend, const char* str, int x, int y, uint32_t color) { sdl_render_data* data = (sdl_render_data*)rend->data; - render_string(data->renderer, x, y, - data->win_w / nes_ppu_render_w, - data->win_h / nes_ppu_render_h, + render_string(data->renderer, + x, y, data->view.x, data->view.y, + data->view.w / nes_ppu_render_w, + data->view.h / nes_ppu_render_h, &data->font, str, color); }