fix: integer resolution when scaling (#251)

This commit is contained in:
christoph-heinrich
2022-09-23 23:04:28 +02:00
committed by GitHub
parent ca1780f111
commit cc75e8d15f

View File

@@ -391,7 +391,7 @@ end
--[[ STATE ]] --[[ STATE ]]
local display = {width = 1280, height = 720, aspect = 1.77778} local display = {width = 1280, height = 720, scale_x = 1, scale_y = 1}
local cursor = {hidden = true, x = 0, y = 0} local cursor = {hidden = true, x = 0, y = 0}
local state = { local state = {
os = (function() os = (function()
@@ -443,6 +443,7 @@ local state = {
playlist_pos = 0, playlist_pos = 0,
margin_top = 0, margin_top = 0,
margin_bottom = 0, margin_bottom = 0,
hidpi_scale = 1,
} }
local thumbnail = {width = 0, height = 0, disabled = false} local thumbnail = {width = 0, height = 0, disabled = false}
@@ -1262,13 +1263,11 @@ mp.set_key_bindings({
--[[ STATE UPDATES ]] --[[ STATE UPDATES ]]
function update_display_dimensions() function update_display_dimensions()
local dpi_scale = mp.get_property_native('display-hidpi-scale', 1.0) local scale = (state.hidpi_scale or 1) * options.ui_scale
dpi_scale = dpi_scale * options.ui_scale local real_width, real_height = mp.get_osd_size()
local scaled_width, scaled_height = round(real_width / scale), round(real_height / scale)
local width, height, aspect = mp.get_osd_size() display.width, display.height = scaled_width, scaled_height
display.width = width / dpi_scale display.scale_x, display.scale_y = real_width / scaled_width, real_height / scaled_height
display.height = height / dpi_scale
display.aspect = aspect
-- Tell elements about this -- Tell elements about this
Elements:trigger('display') Elements:trigger('display')
@@ -2619,7 +2618,7 @@ function WindowBorder:render()
local ass = assdraw.ass_new() local ass = assdraw.ass_new()
local clip = '\\iclip(' .. self.size .. ',' .. self.size .. ',' .. local clip = '\\iclip(' .. self.size .. ',' .. self.size .. ',' ..
(display.width - self.size) .. ',' .. (display.height - self.size) .. ')' (display.width - self.size) .. ',' .. (display.height - self.size) .. ')'
ass:rect(0, 0, display.width, display.height, { ass:rect(0, 0, display.width + 1, display.height + 1, {
color = options.background, clip = clip, opacity = options.window_border_opacity, color = options.background, clip = clip, opacity = options.window_border_opacity,
}) })
return ass return ass
@@ -2972,16 +2971,17 @@ function Timeline:render()
-- Thumbnail -- Thumbnail
if not thumbnail.disabled and thumbnail.width ~= 0 and thumbnail.height ~= 0 then if not thumbnail.disabled and thumbnail.width ~= 0 and thumbnail.height ~= 0 then
local scale = options.ui_scale * state.hidpi_scale local scale_x, scale_y = display.scale_x, display.scale_y
local border, margin_x, margin_y = 2, 10, 5 local border, margin_x, margin_y = math.ceil(2 * scale_x), round(10 * scale_x), round(5 * scale_y)
local thumb_x_margin, thumb_y_margin = (border + margin_x) * scale, (border + margin_y) * scale local thumb_x_margin, thumb_y_margin = border + margin_x, border + margin_y
local thumb_width, thumb_height = thumbnail.width, thumbnail.height
local thumb_x = round(clamp( local thumb_x = round(clamp(
thumb_x_margin, cursor.x * scale - thumbnail.width / 2, thumb_x_margin, cursor.x * scale_x - thumb_width / 2,
display.width * scale - thumbnail.width - thumb_x_margin display.width * scale_x - thumb_width - thumb_x_margin
)) ))
local thumb_y = round(tooltip_anchor.ay * scale - thumb_y_margin - thumbnail.height) local thumb_y = round(tooltip_anchor.ay * scale_y - thumb_y_margin - thumb_height)
local ax, ay = thumb_x / scale - border, thumb_y / scale - border local ax, ay = (thumb_x - border) / scale_x, (thumb_y - border) / scale_y
local bx, by = (thumb_x + thumbnail.width) / scale + border, (thumb_y + thumbnail.height) / scale + border local bx, by = (thumb_x + thumb_width + border) / scale_x, (thumb_y + thumb_height + border) / scale_y
ass:rect(ax, ay, bx, by, { ass:rect(ax, ay, bx, by, {
color = options.foreground, border = 1, border_color = options.background, radius = 3, opacity = 0.8, color = options.foreground, border = 1, border_color = options.background, radius = 3, opacity = 0.8,
}) })
@@ -4082,12 +4082,9 @@ function update_cursor_position()
end end
end end
local dpi_scale = mp.get_property_native('display-hidpi-scale', 1.0)
dpi_scale = dpi_scale * options.ui_scale
-- add 0.5 to be in the middle of the pixel -- add 0.5 to be in the middle of the pixel
cursor.x = (cursor.x + 0.5) / dpi_scale cursor.x = (cursor.x + 0.5) / display.scale_x
cursor.y = (cursor.y + 0.5) / dpi_scale cursor.y = (cursor.y + 0.5) / display.scale_y
Elements:update_proximities() Elements:update_proximities()
request_render() request_render()