Integer scale X axis corrections (#17151)

* Integer scale X axis corrections

* Integer scale: Fall back to normal scale when content is larger than viewport
This commit is contained in:
sonninnos 2024-11-02 18:40:11 +02:00 committed by GitHub
parent da5ecaa45a
commit 273178b979
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -2392,6 +2392,13 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
if (content_width < 2 || content_height < 2) if (content_width < 2 || content_height < 2)
return; return;
/* Use regular scaling if there is no room for 1x */
if (content_width > width || content_height > height)
{
video_viewport_get_scaled_aspect(vp, width, height, ydown);
return;
}
content_width = (content_width > width) ? width : content_width; content_width = (content_width > width) ? width : content_width;
content_height = (content_height > height) ? height : content_height; content_height = (content_height > height) ? height : content_height;
@ -2481,6 +2488,7 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
float overscale_ratio = 0; float overscale_ratio = 0;
uint16_t content_width_ar = content_width; uint16_t content_width_ar = content_width;
uint8_t overscale_w = 0; uint8_t overscale_w = 0;
uint8_t overscale_h = 0;
uint8_t i = 0; uint8_t i = 0;
/* Reset width to exact width */ /* Reset width to exact width */
@ -2490,6 +2498,27 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
overscale_w = (width / content_width) + !!(width % content_width); overscale_w = (width / content_width) + !!(width % content_width);
/* Maintain aspect ratio when only touching X */
if (axis >= VIDEO_SCALE_INTEGER_AXIS_X)
{
content_height = (unsigned)roundf(content_width / aspect_ratio);
overscale_h = (height / content_height) + !!(height % content_height);
/* Use regular scaling if there is no room for 1x */
if (content_width > width || content_height > height)
{
video_viewport_get_scaled_aspect(vp, width, height, ydown);
return;
}
if (scaling == VIDEO_SCALE_INTEGER_SCALING_SMART)
max_scale_h = ((int)(height - content_height * overscale_h) < -(int)(height * 0.20f)) ? overscale_h - 1 : overscale_h;
else if (scaling == VIDEO_SCALE_INTEGER_SCALING_OVERSCALE)
max_scale_h = overscale_h;
else
max_scale_h = overscale_h - 1;
}
/* Populate the ratios */ /* Populate the ratios */
for (i = 1; i < overscale_w + 1; i++) for (i = 1; i < overscale_w + 1; i++)
{ {
@ -2504,7 +2533,7 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
} }
/* Pick the nearest ratio */ /* Pick the nearest ratio */
if (overscale_ratio - target_ratio <= target_ratio - underscale_ratio) if (overscale_ratio > 0 && overscale_ratio - target_ratio <= target_ratio - underscale_ratio)
max_scale_w = i; max_scale_w = i;
else if (i > 1) else if (i > 1)
max_scale_w = i - 1; max_scale_w = i - 1;
@ -2520,13 +2549,17 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
if ( content_width_ar - content_width_diff == (int)content_width / 2 if ( content_width_ar - content_width_diff == (int)content_width / 2
&& content_width_diff < 20 && content_width_diff < 20
&& scale_w_ratio - target_ratio > 0.25f && scale_w_ratio - target_ratio > 0.25f)
)
half_w = -1; half_w = -1;
else if (axis == VIDEO_SCALE_INTEGER_AXIS_XHALF
&& content_width_diff > (int)content_width / 2
&& content_width * max_scale_w < width)
half_w = 1;
} }
/* Special half height scale for hi-res */ /* Special half height scale for hi-res */
if (axis == VIDEO_SCALE_INTEGER_AXIS_YHALF_XHALF) if ( axis == VIDEO_SCALE_INTEGER_AXIS_YHALF_XHALF
|| axis == VIDEO_SCALE_INTEGER_AXIS_XHALF)
{ {
if ( max_scale_h == (height / content_height) if ( max_scale_h == (height / content_height)
&& content_height / 300 && content_height / 300
@ -2546,10 +2579,6 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp,
padding_x = width - content_width * (max_scale_w + (half_w * 0.5f)); padding_x = width - content_width * (max_scale_w + (half_w * 0.5f));
padding_y = height - content_height * (max_scale_h + (half_h * 0.5f)); padding_y = height - content_height * (max_scale_h + (half_h * 0.5f));
/* No Y padding when only touching X */
if (axis >= VIDEO_SCALE_INTEGER_AXIS_X)
padding_y = 0;
} }
else else
{ {