static void sdl_refresh_viewport(sdl2_video_t *vid) { int win_w, win_h; settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); 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 (settings->video.scale_integer) video_viewport_get_scaled_integer(&vid->vp, win_w, win_h, global->system.aspect_ratio, vid->video.force_aspect); else if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct video_viewport *custom = &global->console.screen.viewports.custom_vp; if (custom) { 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 = global->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(d3d_video_t *d3d, unsigned width, unsigned height, bool keep, float desired_aspect) { settings_t *settings = config_get_ptr(); global_t *global = global_get_ptr(); if (settings->video.scale_integer) { struct video_viewport vp = {0}; video_viewport_get_scaled_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 (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const video_viewport_t *custom = &global->console.screen.viewports.custom_vp; if (custom) d3d_set_viewport(d3d, custom->x, custom->y, custom->width, custom->height); } else { float device_aspect = ((float)width) / ((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 d3d_calculate_rect(void *data, unsigned *width, unsigned *height, int *x, int *y, bool force_full, bool allow_rotate) { float device_aspect = (float)*width / *height; d3d_video_t *d3d = (d3d_video_t*)data; settings_t *settings = config_get_ptr(); video_driver_get_size(width, height); gfx_ctx_translate_aspect(&device_aspect, *width, *height); *x = 0; *y = 0; if (settings->video.scale_integer && !force_full) { struct video_viewport vp = {0}; video_viewport_get_scaled_integer(&vp, *width, *height, video_driver_get_aspect_ratio(), d3d->keep_aspect); *x = vp.x; *y = vp.y; *width = vp.width; *height = vp.height; } else if (d3d->keep_aspect && !force_full) { float desired_aspect = video_driver_get_aspect_ratio(); #if defined(HAVE_MENU) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { video_viewport_t *custom = video_viewport_get_custom(); if (custom) { *x = custom->x; *y = custom->y; *width = custom->width; *height = custom->height; } } else #endif { float delta; 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; *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)); } } } }
static void vita2d_gfx_set_viewport(void *data, unsigned viewport_width, unsigned viewport_height, bool force_full, bool allow_rotate) { gfx_ctx_aspect_t aspect_data; unsigned width, height; int x = 0; int y = 0; float device_aspect = (float)viewport_width / viewport_height; struct video_ortho ortho = {0, 1, 1, 0, -1, 1}; settings_t *settings = config_get_ptr(); vita_video_t *vita = (vita_video_t*)data; video_driver_get_size(&width, &height); aspect_data.aspect = &device_aspect; aspect_data.width = viewport_width; aspect_data.height = viewport_height; video_context_driver_translate_aspect(&aspect_data); if (settings->video.scale_integer && !force_full) { video_viewport_get_scaled_integer(&vita->vp, viewport_width, viewport_height, video_driver_get_aspect_ratio(), vita->keep_aspect); viewport_width = vita->vp.width; viewport_height = vita->vp.height; } else if (vita->keep_aspect && !force_full) { float desired_aspect = video_driver_get_aspect_ratio(); #if defined(HAVE_MENU) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct video_viewport *custom = video_viewport_get_custom(); /* Vukan has top-left origin viewport. */ x = custom->x; y = custom->y; viewport_width = custom->width; viewport_height = custom->height; } else #endif { float delta; 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; x = (int)roundf(viewport_width * (0.5f - delta)); viewport_width = (unsigned)roundf(2.0f * viewport_width * delta); } else { delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f; y = (int)roundf(viewport_height * (0.5f - delta)); viewport_height = (unsigned)roundf(2.0f * viewport_height * delta); } } vita->vp.x = x; vita->vp.y = y; vita->vp.width = viewport_width; vita->vp.height = viewport_height; } else { vita->vp.x = 0; vita->vp.y = 0; vita->vp.width = viewport_width; vita->vp.height = viewport_height; } vita2d_set_projection(vita, &ortho, allow_rotate); /* Set last backbuffer viewport. */ if (!force_full) { vita->vp.width = viewport_width; vita->vp.height = viewport_height; } #if 0 vita->vp.x = (float)vita->vp.x; vita->vp.y = (float)vita->vp.y; vita->vp.width = (float)vita->vp.width; vita->vp.height = (float)vita->vp.height; vita->vp.minDepth = 0.0f; vita->vp.maxDepth = 1.0f; RARCH_LOG("Setting viewport @ %ux%u\n", viewport_width, viewport_height); #endif }
static void vita2d_gfx_update_viewport(vita_video_t* vita) { int x = 0; int y = 0; float device_aspect = ((float)PSP_FB_WIDTH) / PSP_FB_HEIGHT; float width = PSP_FB_WIDTH; float height = PSP_FB_HEIGHT; settings_t *settings = config_get_ptr(); if (settings->video.scale_integer) { video_viewport_get_scaled_integer(&vita->vp, PSP_FB_WIDTH, PSP_FB_HEIGHT, video_driver_get_aspect_ratio(), vita->keep_aspect); width = vita->vp.width; height = vita->vp.height; } else if (vita->keep_aspect) { float desired_aspect = video_driver_get_aspect_ratio(); if ( (vita->rotation == ORIENTATION_VERTICAL) || (vita->rotation == ORIENTATION_FLIPPED_ROTATED)) { device_aspect = 1.0 / device_aspect; width = PSP_FB_HEIGHT; height = PSP_FB_WIDTH; } #if defined(HAVE_MENU) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { struct video_viewport *custom = video_viewport_get_custom(); if (custom) { x = custom->x; y = custom->y; width = custom->width; height = custom->height; } } else #endif { float delta; 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; 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); } if ( (vita->rotation == ORIENTATION_VERTICAL) || (vita->rotation == ORIENTATION_FLIPPED_ROTATED) ) { x = (PSP_FB_WIDTH - width) * 0.5f; y = (PSP_FB_HEIGHT - height) * 0.5f; } } vita->vp.x = x; vita->vp.y = y; vita->vp.width = width; vita->vp.height = height; } else { vita->vp.x = vita->vp.y = 0; vita->vp.width = width; vita->vp.height = height; } vita->vp.width += vita->vp.width&0x1; vita->vp.height += vita->vp.height&0x1; vita->should_resize = false; }
static void psp_update_viewport(psp1_video_t* psp) { float device_aspect = ((float)SCEGU_SCR_WIDTH) / SCEGU_SCR_HEIGHT; float width = SCEGU_SCR_WIDTH; float height = SCEGU_SCR_HEIGHT; int x = 0; int y = 0; if (g_settings.video.scale_integer) { video_viewport_get_scaled_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 delta; float desired_aspect = g_extern.system.aspect_ratio; #if defined(HAVE_MENU) if (g_settings.video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { const struct video_viewport *custom = &g_extern.console.screen.viewports.custom_vp; if (custom) { 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; }
static void psp_update_viewport(psp1_video_t* psp, video_frame_info_t *video_info) { int x = 0; int y = 0; float device_aspect = ((float)SCEGU_SCR_WIDTH) / SCEGU_SCR_HEIGHT; float width = SCEGU_SCR_WIDTH; float height = SCEGU_SCR_HEIGHT; settings_t *settings = config_get_ptr(); if (settings->bools.video_scale_integer) { video_viewport_get_scaled_integer(&psp->vp, SCEGU_SCR_WIDTH, SCEGU_SCR_HEIGHT, video_driver_get_aspect_ratio(), psp->keep_aspect); width = psp->vp.width; height = psp->vp.height; } else if (psp->keep_aspect) { #if defined(HAVE_MENU) if (settings->uints.video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { x = video_info->custom_vp_x; y = video_info->custom_vp_y; width = video_info->custom_vp_width; height = video_info->custom_vp_height; } else #endif { float delta; float desired_aspect = video_driver_get_aspect_ratio(); 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; }
static void wiiu_gfx_update_viewport(wiiu_video_t* wiiu) { int x = 0; int y = 0; float width = wiiu->vp.full_width; float height = wiiu->vp.full_height; settings_t *settings = config_get_ptr(); float desired_aspect = video_driver_get_aspect_ratio(); if(wiiu->rotation & 0x1) desired_aspect = 1.0 / desired_aspect; if (settings->video.scale_integer) { video_viewport_get_scaled_integer(&wiiu->vp, wiiu->vp.full_width, wiiu->vp.full_height, desired_aspect, wiiu->keep_aspect); } else if (wiiu->keep_aspect) { #if defined(HAVE_MENU) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { struct video_viewport *custom = video_viewport_get_custom(); if (custom) { x = custom->x; y = custom->y; width = custom->width; height = custom->height; } } else #endif { float delta; float device_aspect = ((float)wiiu->vp.full_width) / wiiu->vp.full_height; 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; 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); } } wiiu->vp.x = x; wiiu->vp.y = y; wiiu->vp.width = width; wiiu->vp.height = height; } else { wiiu->vp.x = wiiu->vp.y = 0; wiiu->vp.width = width; wiiu->vp.height = height; } float scale_w = wiiu->color_buffer.surface.width / 854.0; float scale_h = wiiu->color_buffer.surface.height / 480.0; wiiu_set_position(wiiu->position, &wiiu->color_buffer, wiiu->vp.x * scale_w, wiiu->vp.y * scale_h, (wiiu->vp.x + wiiu->vp.width) * scale_w, (wiiu->vp.y + wiiu->vp.height) * scale_h); wiiu->should_resize = false; DEBUG_LINE(); }
void gl1_gfx_set_viewport(gl1_t *gl1, video_frame_info_t *video_info, unsigned viewport_width, unsigned viewport_height, bool force_full, bool allow_rotate) { gfx_ctx_aspect_t aspect_data; int x = 0; int y = 0; float device_aspect = (float)viewport_width / viewport_height; unsigned height = video_info->height; aspect_data.aspect = &device_aspect; aspect_data.width = viewport_width; aspect_data.height = viewport_height; video_context_driver_translate_aspect(&aspect_data); if (video_info->scale_integer && !force_full) { video_viewport_get_scaled_integer(&gl1->vp, viewport_width, viewport_height, video_driver_get_aspect_ratio(), gl1->keep_aspect); viewport_width = gl1->vp.width; viewport_height = gl1->vp.height; } else if (gl1->keep_aspect && !force_full) { float desired_aspect = video_driver_get_aspect_ratio(); #if defined(HAVE_MENU) if (video_info->aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { /* GL has bottom-left origin viewport. */ x = video_info->custom_vp_x; y = height - video_info->custom_vp_y - video_info->custom_vp_height; viewport_width = video_info->custom_vp_width; viewport_height = video_info->custom_vp_height; } else #endif { float delta; 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; x = (int)roundf(viewport_width * (0.5f - delta)); viewport_width = (unsigned)roundf(2.0f * viewport_width * delta); } else { delta = (device_aspect / desired_aspect - 1.0f) / 2.0f + 0.5f; y = (int)roundf(viewport_height * (0.5f - delta)); viewport_height = (unsigned)roundf(2.0f * viewport_height * delta); } } gl1->vp.x = x; gl1->vp.y = y; gl1->vp.width = viewport_width; gl1->vp.height = viewport_height; } else { gl1->vp.x = gl1->vp.y = 0; gl1->vp.width = viewport_width; gl1->vp.height = viewport_height; } #if defined(RARCH_MOBILE) /* In portrait mode, we want viewport to gravitate to top of screen. */ if (device_aspect < 1.0f) gl1->vp.y *= 2; #endif glViewport(gl1->vp.x, gl1->vp.y, gl1->vp.width, gl1->vp.height); gl1_set_projection(gl1, &gl1_default_ortho, allow_rotate); /* Set last backbuffer viewport. */ if (!force_full) { gl1->vp_out_width = viewport_width; gl1->vp_out_height = viewport_height; } #if 0 RARCH_LOG("Setting viewport @ %ux%u\n", viewport_width, viewport_height); #endif }
static void ctr_update_viewport(ctr_video_t* ctr) { int x = 0; int y = 0; float device_aspect = ((float)ctr->vp.full_width) / ctr->vp.full_height; float width = ctr->vp.full_width; float height = ctr->vp.full_height; settings_t *settings = config_get_ptr(); if (settings->video.scale_integer) { video_viewport_get_scaled_integer(&ctr->vp, ctr->vp.full_width, ctr->vp.full_height, video_driver_get_aspect_ratio(), ctr->keep_aspect); width = ctr->vp.width; height = ctr->vp.height; } else if (ctr->keep_aspect) { #if defined(HAVE_MENU) if (settings->video.aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { struct video_viewport *custom = video_viewport_get_custom(); if (custom) { x = custom->x; y = custom->y; width = custom->width; height = custom->height; } } else #endif { float delta; float desired_aspect = video_driver_get_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; 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); } } ctr->vp.x = x; ctr->vp.y = y; ctr->vp.width = width; ctr->vp.height = height; } else { ctr->vp.x = ctr->vp.y = 0; ctr->vp.width = width; ctr->vp.height = height; } ctr_set_screen_coords(ctr); ctr->should_resize = false; }