This patch change the --scale parameter to <x>x<y>[-n] where "-n" is
optional flag to request xrandr to use nearest filter instead of the default
bilinear filter.

known bug: switching between bilinear and nearest filter without
changing scale factor do nothing.
---
 xrandr.c | 25 ++++++++++++++++++-------
 1 file changed, 18 insertions(+), 7 deletions(-)

diff --git a/xrandr.c b/xrandr.c
index 366f6dc..e5fd39f 100644
--- a/xrandr.c
+++ b/xrandr.c
@@ -132,7 +132,7 @@ usage(void)
            "      --below <output>\n"
            "      --same-as <output>\n"
            "      --set <property> <value>\n"
-           "      --scale <x>x<y>\n"
+           "      --scale <x>x<y>[-n]\n"
            "      --scale-from <w>x<h>\n"
            "      --transform <a>,<b>,<c>,<d>,<e>,<f>,<g>,<h>,<i>\n"
            "      --off\n"
@@ -2875,18 +2875,29 @@ main (int argc, char **argv)
        if (!strcmp ("--scale", argv[i]))
        {
            double  sx, sy;
+           char c0, c1;
+           int n_scan;
            if (!config_output) argerr ("%s must be used after --output\n", 
argv[i]);
            if (++i >= argc) argerr ("%s requires an argument\n", argv[i-1]);
-           if (sscanf (argv[i], "%lfx%lf", &sx, &sy) != 2)
-               argerr ("failed to parse '%s' as a scaling factor\n", argv[i]);
+           n_scan = sscanf (argv[i], "%lfx%lf%c%c", &sx, &sy, &c0, &c1);
+           if (n_scan != 2 && n_scan != 4)
+               argerr ("failed to parse '%s' as a scaling factor %d\n", 
argv[i], n_scan);
+           if(n_scan == 4 && (c0 != '-' || c1 != 'n'))
+               argerr ("unknown sufix '%c%c' in '%s'\n", c0, c1, argv[i]);
            init_transform (&config_output->transform);
            config_output->transform.transform.matrix[0][0] = XDoubleToFixed 
(sx);
            config_output->transform.transform.matrix[1][1] = XDoubleToFixed 
(sy);
            config_output->transform.transform.matrix[2][2] = XDoubleToFixed 
(1.0);
-           if (sx != 1 || sy != 1)
-               config_output->transform.filter = "bilinear";
-           else
-               config_output->transform.filter = "nearest";
+           /* default transform to bilinear */
+           config_output->transform.filter = "bilinear";
+           /* if the screen is at his native resolution */
+           if(sx == 1 && sy == 1)
+                   config_output->transform.filter = "nearest";
+           /* if --scale <sx>x<sy> is suffixed by -n, force nearest transform 
*/
+           if(n_scan == 4 && c0 == '-' && c1 == 'n')
+           {
+                   config_output->transform.filter = "nearest";
+           }
            config_output->transform.nparams = 0;
            config_output->transform.params = NULL;
            config_output->changes |= changes_transform;
-- 
1.8.5.5

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to