Quellcode durchsuchen

Run in fullscreen with proper letterboxing

master
Nathaniel Walizer vor 11 Monaten
Ursprung
Commit
c83415b6c9
3 geänderte Dateien mit 54 neuen und 18 gelöschten Zeilen
  1. +7
    -6
      src/sdl_overlay.c
  2. +3
    -3
      src/sdl_overlay.h
  3. +44
    -9
      src/sdl_render.c

+ 7
- 6
src/sdl_overlay.c Datei anzeigen

@@ -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);



+ 3
- 3
src/sdl_overlay.h Datei anzeigen

@@ -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);



+ 44
- 9
src/sdl_render.c Datei anzeigen

@@ -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);
}



Laden…
Abbrechen
Speichern