static void sdl_refresh_viewport(sdl2_video_t *vid) { int win_w, win_h; SDL_GetWindowSize(vid->window, &win_w, &win_h); vid->vp.x = 0; vid->vp.y = 0; vid->vp.width = win_w; vid->vp.height = win_h; vid->vp.full_width = win_w; vid->vp.full_height = win_h; if (g_settings.video.scale_integer) gfx_scale_integer(&vid->vp, win_w, win_h, g_extern.system.aspect_ratio, vid->video.force_aspect); else if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct rarch_viewport *custom = &g_extern.console.screen.viewports.custom_vp; vid->vp.x = custom->x; vid->vp.y = custom->y; vid->vp.width = custom->width; vid->vp.height = custom->height; } else if (vid->video.force_aspect) { float delta; float device_aspect = (float)win_w / win_h; float desired_aspect = g_extern.system.aspect_ratio; if (fabsf(device_aspect - desired_aspect) < 0.0001f) { /* If the aspect ratios of screen and desired aspect ratio are * sufficiently equal (floating point stuff), assume they are * actually equal. */ } else if (device_aspect > desired_aspect) { delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f; vid->vp.x = (int)roundf(win_w * (0.5f - delta)); vid->vp.width = (unsigned)roundf(2.0f * win_w * delta); } else { delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f; vid->vp.y = (int)roundf(win_h * (0.5f - delta)); vid->vp.height = (unsigned)roundf(2.0f * win_h * delta); } } vid->should_resize = false; sdl_refresh_renderer(vid); }
static void d3d_calculate_rect(void *data, unsigned width, unsigned height, bool keep, float desired_aspect) { d3d_video_t *d3d = (d3d_video_t*)data; if (g_settings.video.scale_integer) { struct rarch_viewport vp = {0}; gfx_scale_integer(&vp, width, height, desired_aspect, keep); d3d_set_viewport(d3d, vp.x, vp.y, vp.width, vp.height); } else if (!keep) d3d_set_viewport(d3d, 0, 0, width, height); else { if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const rarch_viewport_t &custom = g_extern.console.screen.viewports.custom_vp; d3d_set_viewport(d3d, custom.x, custom.y, custom.width, custom.height); } else { float device_aspect = static_cast<float>(width) / static_cast<float>(height); if (fabsf(device_aspect - desired_aspect) < 0.0001f) d3d_set_viewport(d3d, 0, 0, width, height); else if (device_aspect > desired_aspect) { float delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f; d3d_set_viewport(d3d, int(roundf(width * (0.5f - delta))), 0, unsigned(roundf(2.0f * width * delta)), height); } else { float delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f; d3d_set_viewport(d3d, 0, int(roundf(height * (0.5f - delta))), width, unsigned(roundf(2.0f * height * delta))); } } } }
static void psp_update_viewport(psp1_video_t* psp) { int x, y; float device_aspect = ((float)SCEGU_SCR_WIDTH) / SCEGU_SCR_HEIGHT; float width = SCEGU_SCR_WIDTH; float height = SCEGU_SCR_HEIGHT; x = 0; y = 0; if (g_settings.video.scale_integer) { gfx_scale_integer(&psp->vp, SCEGU_SCR_WIDTH, SCEGU_SCR_HEIGHT, g_extern.system.aspect_ratio, psp->keep_aspect); width = psp->vp.width; height = psp->vp.height; } else if (psp->keep_aspect) { float desired_aspect = g_extern.system.aspect_ratio; float delta; #if defined(HAVE_MENU) if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct rarch_viewport *custom = &g_extern.console.screen.viewports.custom_vp; x = custom->x; y = custom->y; width = custom->width; height = custom->height; } else #endif { if ((fabsf(device_aspect - desired_aspect) < 0.0001f) || (fabsf((16.0/9.0) - desired_aspect) < 0.02f)) { /* If the aspect ratios of screen and desired aspect * ratio are sufficiently equal (floating point stuff), * assume they are actually equal. */ } else if (device_aspect > desired_aspect) { delta = (desired_aspect / device_aspect - 1.0f) / 2.0f + 0.5f; x = (int)roundf(width * (0.5f - delta)); width = (unsigned)roundf(2.0f * width * delta); } else { delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f; y = (int)roundf(height * (0.5f - delta)); height = (unsigned)roundf(2.0f * height * delta); } } psp->vp.x = x; psp->vp.y = y; psp->vp.width = width; psp->vp.height = height; } else { psp->vp.x = psp->vp.y = 0; psp->vp.width = width; psp->vp.height = height; } psp->vp.width += psp->vp.width&0x1; psp->vp.height += psp->vp.height&0x1; psp_set_screen_coords(psp->frame_coords, psp->vp.x, psp->vp.y, psp->vp.width, psp->vp.height, psp->rotation); psp->should_resize = false; }