@@ -259,36 +259,12 @@ func update_ui_scale() -> void:
259259 var window := get_window ()
260260 if not window .is_node_ready ():
261261 await window .ready
262- var old_scale_factor := window .content_scale_factor
263-
264- # Get window size without the decorations.
265- var usable_screen_size := Vector2i (DisplayServer .screen_get_usable_rect (
266- DisplayServer .window_get_current_screen ()).size - \
267- window .get_size_with_decorations () + window .size )
268-
269- # Presumably the default size would always be enough for the contents.
270- var window_default_size := Vector2i (
271- ProjectSettings .get_setting ("display/window/size/viewport_width" ),
272- ProjectSettings .get_setting ("display/window/size/viewport_height" ))
273-
274- # How much can the default size be increased before it takes all usable screen space.
275- var max_expansion := Vector2 (usable_screen_size ) / Vector2 (window_default_size )
276- var max_scale := snappedf (minf (max_expansion .x , max_expansion .y ) - 0.125 , 0.25 )
277- if OS .get_name () == "Android" :
278- # This is a temporary fix for smaller UI scale on Android.
279- # TODO Update this logic after moving to Godot 4.4
280- max_scale *= 1.1
281- var final_scale := minf (Configs .savedata .ui_scale * _calculate_auto_scale (), max_scale )
282- var resize_factor := final_scale / old_scale_factor
283-
284- if not OS .get_name () in ["Android" , "Web" ]:
285- # TODO Check later if this workaround is still necessary for Windows.
286- if OS .get_name () != "Windows" or window .mode == Window .MODE_WINDOWED :
287- # The window's minimum size can mess with the size change, so we set it to zero.
288- window .min_size = Vector2i .ZERO
289- window .size *= resize_factor
290- window .min_size = window_default_size * final_scale
291- window .content_scale_factor = final_scale
262+ if Configs .savedata .auto_ui_scale :
263+ window .content_scale_factor = _calculate_auto_scale ()
264+ else :
265+ var final_scale := minf (Configs .savedata .ui_scale , 4.0 )
266+ window .content_scale_factor = final_scale
267+
292268
293269func open_update_checker () -> void :
294270 var confirmation_dialog = ConfirmDialog .instantiate ()
@@ -325,44 +301,25 @@ func open_export() -> void:
325301 Translator .translate ("Export" ), FileUtils .open_export_dialog .bind (svg_export_data ))
326302
327303func _calculate_auto_scale () -> float :
328- if not Configs .savedata .auto_ui_scale :
329- return 1.0
330-
331- # Credit: Godots (MIT, by MakovWait and contributors)
332-
333- var screen := DisplayServer .window_get_current_screen ()
334- if DisplayServer .screen_get_size (screen ) == Vector2i ():
335- return 1.0
336-
337- # Use the smallest dimension to use a correct display scale on portrait displays.
338- var smallest_dimension := mini (DisplayServer .screen_get_size (screen ).x ,
339- DisplayServer .screen_get_size (screen ).y )
340-
341- var dpi := DisplayServer .screen_get_dpi (screen )
342- if dpi != 72 :
343- if dpi < 72 :
344- return 0.75
345- elif dpi <= 96 :
346- return 1.0
347- elif dpi <= 120 :
348- return 1.25
349- elif dpi <= 160 :
350- return 1.5
351- elif dpi <= 200 :
352- return 2.0
353- elif dpi <= 240 :
354- return 2.5
355- elif dpi <= 320 :
356- return 3.0
357- elif dpi <= 480 :
358- return 4.0
359- else : # dpi > 480
360- return 5.0
361- elif smallest_dimension >= 1700 :
362- # Likely a hiDPI display, but we aren't certain due to the returned DPI.
363- # Use an intermediate scale to handle this situation.
364- return 1.5
365- return 1.0
304+ var dpi := DisplayServer .screen_get_dpi (DisplayServer .window_get_current_screen ())
305+
306+ if dpi <= 120 :
307+ return 0.75 # ldpi
308+ elif dpi <= 160 :
309+ return 1.0 # mdpi (baseline)
310+ elif dpi <= 240 :
311+ return 1.5 # hdpi
312+ elif dpi <= 320 :
313+ return 2.0 # xhdpi
314+ elif dpi <= 480 :
315+ return 3.0 # xxhdpi
316+ elif dpi <= 640 :
317+ return 4.0 # xxxhdpi
318+ else :
319+ return 5.0 # Beyond xxxhdpi
320+
321+ return 1.0 # Default fallback scale
322+
366323
367324# Helpers
368325
0 commit comments