From edcf4e5b1ada766d24883b2c8613a38144b4cde1 Mon Sep 17 00:00:00 2001 From: Martin Zikmund Date: Mon, 13 Nov 2023 18:17:15 +0100 Subject: [PATCH] fix: Ensure fractional DPI is avoided in HW GTK renderer --- .../GtkDisplayInformationExtension.cs | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Uno.UI.Runtime.Skia.Gtk/Extensions/GtkDisplayInformationExtension.cs b/src/Uno.UI.Runtime.Skia.Gtk/Extensions/GtkDisplayInformationExtension.cs index 701235a47304..3ec66480e7dc 100644 --- a/src/Uno.UI.Runtime.Skia.Gtk/Extensions/GtkDisplayInformationExtension.cs +++ b/src/Uno.UI.Runtime.Skia.Gtk/Extensions/GtkDisplayInformationExtension.cs @@ -55,7 +55,7 @@ public float LogicalDpi var nativeWindow = window.Window; if (nativeWindow is not null) { - _dpi = _dpiHelper.GetNativeDpi(); + _dpi = GetNativeDpi(); } } @@ -72,7 +72,24 @@ public float LogicalDpi private void OnDpiChanged(object? sender, EventArgs args) { - _dpi = _dpiHelper.GetNativeDpi(); + _dpi = GetNativeDpi(); _displayInformation.NotifyDpiChanged(); } + + private float GetNativeDpi() + { + var dpi = _dpiHelper.GetNativeDpi(); + + if (GtkHost.Current?.RenderSurfaceType == RenderSurfaceType.Software) + { + // Software rendering is not affected by fractional DPI. + return dpi; + } + + // We need to make sure that in case of fractional DPI, we use the nearest whole DPI instead, + // otherwise we get GuardBand related rendering issues. + var fractionalDpi = dpi / DisplayInformation.BaseDpi; + var wholeDpi = Math.Max(1.0, float.Floor(fractionalDpi)); + return wholeDpi * DisplayInformation.BaseDpi; + } }