[mutter] monitor-config: Handle fractional scale precision loss



commit 41eea5a9429e48577fbd97ebf277431b6fee5c1c
Author: Jonas Ådahl <jadahl gmail com>
Date:   Fri Jun 9 15:51:14 2017 +0800

    monitor-config: Handle fractional scale precision loss
    
    When calculating sizes given some size and a fractional logical monitor
    scale with precision loss, round the result of the floating point
    calculation to the closest integer, as otherwise we might end up with
    result smaller by 1 if there was a loss of precision when calculating
    the scale.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=765011

 src/backends/meta-monitor-config-manager.c |    6 ++++--
 src/backends/meta-monitor-config-store.c   |    4 ++--
 src/backends/meta-monitor-manager.c        |    4 ++--
 3 files changed, 8 insertions(+), 6 deletions(-)
---
diff --git a/src/backends/meta-monitor-config-manager.c b/src/backends/meta-monitor-config-manager.c
index 5ff4fd0..81abb65 100644
--- a/src/backends/meta-monitor-config-manager.c
+++ b/src/backends/meta-monitor-config-manager.c
@@ -981,8 +981,10 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig    *logical_monitor
   switch (layout_mode)
     {
     case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
-      expected_mode_width *= logical_monitor_config->scale;
-      expected_mode_height *= logical_monitor_config->scale;
+      expected_mode_width = roundf (expected_mode_width *
+                                    logical_monitor_config->scale);
+      expected_mode_height = roundf (expected_mode_height *
+                                     logical_monitor_config->scale);
       break;
     case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
       break;
diff --git a/src/backends/meta-monitor-config-store.c b/src/backends/meta-monitor-config-store.c
index aa0310b..6ed1943 100644
--- a/src/backends/meta-monitor-config-store.c
+++ b/src/backends/meta-monitor-config-store.c
@@ -453,8 +453,8 @@ derive_logical_monitor_layout (MetaLogicalMonitorConfig    *logical_monitor_conf
   switch (layout_mode)
     {
     case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
-      width /= logical_monitor_config->scale;
-      height /= logical_monitor_config->scale;
+      width = roundf (width / logical_monitor_config->scale);
+      height = roundf (height / logical_monitor_config->scale);
       break;
     case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
       break;
diff --git a/src/backends/meta-monitor-manager.c b/src/backends/meta-monitor-manager.c
index aed4604..099a48e 100644
--- a/src/backends/meta-monitor-manager.c
+++ b/src/backends/meta-monitor-manager.c
@@ -1968,8 +1968,8 @@ derive_logical_monitor_size (MetaMonitorConfig           *monitor_config,
   switch (layout_mode)
     {
     case META_LOGICAL_MONITOR_LAYOUT_MODE_LOGICAL:
-      width /= scale;
-      height /= scale;
+      width = roundf (width / scale);
+      height = roundf (height / scale);
       break;
     case META_LOGICAL_MONITOR_LAYOUT_MODE_PHYSICAL:
       break;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]