summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAaron Plattner <aplattner@nvidia.com>2012-04-23 12:41:15 -0700
committerAaron Plattner <aplattner@nvidia.com>2012-04-25 19:50:19 -0700
commit1e5a973ad2da9aaf3c025656db4ba83ff9e6c207 (patch)
treebec18614a273fda40d326804c0d405025585535d
parent45b21c41ef3abd73de11d1adc6f5475105e1a5b7 (diff)
Add a --scale-from option
A typical case for wanting to specify a scale on an output is making your framebuffer be one size and scaling it to fill an output of a different size. Instead of making the user calculate the scaling factors to be specified by --scale, add a new option, --scale-from, that lets the user specify the framebuffer size directly. Compute the appropriate transform to achieve the desired target size. Signed-off-by: Aaron Plattner <aplattner@nvidia.com> Reviewed-by: Andy Ritger <aritger@nvidia.com>
-rw-r--r--man/xrandr.man5
-rw-r--r--xrandr.c40
2 files changed, 45 insertions, 0 deletions
diff --git a/man/xrandr.man b/man/xrandr.man
index ba36ae3..ddc2804 100644
--- a/man/xrandr.man
+++ b/man/xrandr.man
@@ -41,6 +41,7 @@ xrandr \- primitive command line interface to RandR extension
.br
[\-\-panning \fIwidth\fPx\fIheight\fP[+\fIx\fP+\fIy\fP[/\fItrack_width\fPx\fItrack_height\fP+\fItrack_x\fP+\fItrack_y\fP[/\fIborder_left\fP/\fIborder_top\fP/\fIborder_right\fP/\fIborder_bottom\fP]]]]
[\-\-scale \fIx\fPx\fIy\fP]
+[\-\-scale-from \fIw\fPx\fIh\fP]
[\-\-transform \fIa\fP,\fIb\fP,\fIc\fP,\fId\fP,\fIe\fP,\fIf\fP,\fIg\fP,\fIh\fP,\fIi\fP]
[\-\-primary]
.br
@@ -199,6 +200,10 @@ Changes the dimensions of the output picture. Values superior to 1 will lead to
a compressed screen (screen dimension bigger than the dimension of the output
mode), and values below 1 leads to a zoom in on the output. This option is
actually a shortcut version of the \fI\-\-transform\fP option.
+.IP "\-\-scale-from \fIw\fPx\fIh\fP"
+Specifies the size in pixels of the area of the framebuffer to be displayed on
+this output.
+This option is actually a shortcut version of the \fI\-\-transform\fP option.
.IP \-\-primary
Set the output as primary.
It will be sorted first in Xinerama and RANDR geometry requests.
diff --git a/xrandr.c b/xrandr.c
index b7f468b..6683ceb 100644
--- a/xrandr.c
+++ b/xrandr.c
@@ -128,6 +128,7 @@ usage(void)
fprintf(stderr, " --same-as <output>\n");
fprintf(stderr, " --set <property> <value>\n");
fprintf(stderr, " --scale <x>x<y>\n");
+ fprintf(stderr, " --scale-from <w>x<h>\n");
fprintf(stderr, " --transform <a>,<b>,<c>,<d>,<e>,<f>,<g>,<h>,<i>\n");
fprintf(stderr, " --off\n");
fprintf(stderr, " --crtc <crtc>\n");
@@ -324,6 +325,7 @@ struct _output {
XRRPanning panning;
Bool automatic;
+ int scale_from_w, scale_from_h;
transform_t transform;
struct {
@@ -1166,6 +1168,30 @@ set_output_info (output_t *output, RROutput xid, XRROutputInfo *output_info)
copy_transform (&output->transform, &output->crtc_info->current_transform);
else
init_transform (&output->transform);
+ } else {
+ /* transform was already set for --scale or --transform */
+
+ /* for --scale-from, figure out the mode size and compute the transform
+ * for the target framebuffer area */
+ if (output->scale_from_w > 0 && output->mode_info) {
+ double sx = (double)output->scale_from_w /
+ output->mode_info->width;
+ double sy = (double)output->scale_from_h /
+ output->mode_info->height;
+ if (verbose)
+ printf("scaling %s by %lfx%lf\n", output->output.string, sx,
+ sy);
+ init_transform (&output->transform);
+ output->transform.transform.matrix[0][0] = XDoubleToFixed (sx);
+ output->transform.transform.matrix[1][1] = XDoubleToFixed (sy);
+ output->transform.transform.matrix[2][2] = XDoubleToFixed (1.0);
+ if (sx != 1 || sy != 1)
+ output->transform.filter = "bilinear";
+ else
+ output->transform.filter = "nearest";
+ output->transform.nparams = 0;
+ output->transform.params = NULL;
+ }
}
/* set primary */
@@ -2490,6 +2516,20 @@ main (int argc, char **argv)
output->changes |= changes_transform;
continue;
}
+ if (!strcmp ("--scale-from", argv[i]))
+ {
+ int w, h;
+ if (!output) usage();
+ if (++i>=argc) usage();
+ if (sscanf (argv[i], "%dx%d", &w, &h) != 2)
+ usage ();
+ if (w <=0 || h <= 0)
+ usage ();
+ output->scale_from_w = w;
+ output->scale_from_h = h;
+ output->changes |= changes_transform;
+ continue;
+ }
if (!strcmp ("--transform", argv[i])) {
double transform[3][3];
int k, l;