Since you didn't specify the OS, I feel free to assume it's GNU/Linux.
In that case, there is `xrandr`

command, with the `--transform`

option.
Have fun! (:

From `xrandr`

man page (check out the other options, like `--out`

):

```
--transform a,b,c,d,e,f,g,h,i
```

Specifies a transformation matrix to apply on the output. Automatically a bilinear filter is selected. The mathematical form corresponds to:

```
a b c
d e f
g h i
```

The transformation is based on homogeneous coordinates. The matrix multiplied by the coordinate vector of a pixel of the output gives the transformed coordinate vector of a pixel in the graphic buffer. More precisely, the vector (x y) of the output pixel is extended to 3 values *(x y w)*, with 1 as the *w* coordinate and multiplied against the matrix. The final device coordinates of the pixel are then calculated with the so-called homogenic division by the transformed *w* coordinate. In other words, the device coordinates *(x'y')* of the transformed pixel are:

```
x' = (ax + by + c) / w' and
y' = (dx + ey + f) / w' ,
with w' = (gx + hy + i) .
```

Typically, `a`

and `e`

corresponds to the scaling on the *X* and *Y* axes, `c`

and `f`

corresponds to the translation on those axes, and `g`

, `h`

, and `i`

are respectively 0, 0 and 1. The matrix can also be used to express more complex transformations such as keystone correction, or rotation. For a rotation of an angle *T*, this formula can be used:

```
cos T -sin T 0
sin T cos T 0
0 0 1
```

As a special argument, instead of passing a matrix, one can pass the string `none`

, in which case the default values are used (a unit matrix without filter).