[gnome-settings-daemon/gnome-3-34] power: Fix rounding of brightness value



commit 0f92d19da6141c8295644b6edb80f38be7b5c46b
Author: Benjamin Otte <otte benjamin googlemail com>
Date:   Fri Oct 11 23:24:55 2019 +0000

    power: Fix rounding of brightness value
    
    We rounded properly for percentage to absolute value, but we always floored the other way around.
    
    The new code achieves this by always rounding. This way the following rule holds (assuming the the min 
value is 0 for this discussion)
      x = round (round (x * scale) / scale)
    with
      scale = (max - min) / 100
    and assuming that scale >= 1
    
    If scale < 1, the rule holds for the other direction.
    
    (cherry picked from commit db37493692fe5e49898f4ee969f5012ad31c3a21)

 plugins/power/gpm-common.c | 19 +++++++++----------
 1 file changed, 9 insertions(+), 10 deletions(-)
---
diff --git a/plugins/power/gpm-common.c b/plugins/power/gpm-common.c
index 0934a205..a7ca87fb 100644
--- a/plugins/power/gpm-common.c
+++ b/plugins/power/gpm-common.c
@@ -43,6 +43,13 @@
 #define UPS_SOUND_LOOP_ID                        99
 #define GSD_POWER_MANAGER_CRITICAL_ALERT_TIMEOUT  5 /* seconds */
 
+static int
+gsd_power_backlight_convert_safe (int value, int from_range, int to_range)
+{
+        /* round (value / from_range) * to_range */
+        return (value * to_range + from_range / 2) / from_range;
+}
+
 /* take a discrete value with offset and convert to percentage */
 int
 gsd_power_backlight_abs_to_percentage (int min, int max, int value)
@@ -50,26 +57,18 @@ gsd_power_backlight_abs_to_percentage (int min, int max, int value)
         g_return_val_if_fail (max > min, -1);
         g_return_val_if_fail (value >= min, -1);
         g_return_val_if_fail (value <= max, -1);
-        return (((value - min) * 100) / (max - min));
+        return gsd_power_backlight_convert_safe (value - min, max - min, 100);
 }
 
 /* take a percentage and convert to a discrete value with offset */
 int
 gsd_power_backlight_percentage_to_abs (int min, int max, int value)
 {
-        int steps, step_size;
-
         g_return_val_if_fail (max > min, -1);
         g_return_val_if_fail (value >= 0, -1);
         g_return_val_if_fail (value <= 100, -1);
 
-        steps = max - min;
-        step_size = 100 / steps;
-
-        /* Round for better precision when steps is small */
-        value += step_size / 2;
-
-        return min + (steps * value) / 100;
+        return min + gsd_power_backlight_convert_safe (value, 100, max - min);
 }
 
 #define GPM_UP_TIME_PRECISION                   5*60


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