![Может ли кто-нибудь объяснить, как работает xrandr --scale?](https://rvso.com/image/231063/%D0%9C%D0%BE%D0%B6%D0%B5%D1%82%20%D0%BB%D0%B8%20%D0%BA%D1%82%D0%BE-%D0%BD%D0%B8%D0%B1%D1%83%D0%B4%D1%8C%20%D0%BE%D0%B1%D1%8A%D1%8F%D1%81%D0%BD%D0%B8%D1%82%D1%8C%2C%20%D0%BA%D0%B0%D0%BA%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20xrandr%20--scale%3F.png)
Из документов:
Changes the dimensions of the output picture. If the y value is
omitted, the x value will be used for both dimensions. Values
larger than 1 lead to a compressed screen (screen dimension big‐
ger than the dimension of the output mode), and values less than
1 lead to a zoom in on the output. This option is actually a
shortcut version of the --transform option.
Давай попробуем:
Когда я печатаю, --xrandr --output eDP 1.2x1.2
экран становится меньше примерно на 20% (это проверено)
Когда я печатаю, --xrandr --output eDP 0.8x0.8
экран становится просто огромным, гораздо больше, чем на 20% (это фальсифицирует документы)
Когда я печатаю, --xrandr --output eDP 1x1
он становится еще больше! Он увеличивается. Эти преобразования применяются относительно, как мне кажется... но если это так, то 1x1 должен сохранять его полностью статичным?
Когда я печатаю, --xrandr --output eDP 1.5x1.5
он снова становится меньше.но он все еще больше, чем--scale 1.2x1.2
, еще одно доказательство относительного масштабирования.
Когда я печатаю, --xrandr --output eDP 1.5x1.5
ничего не происходит. Подождите-ка, это значит, что эти преобразования не применяются относительно?
Когда я печатаю, --xrandr --output eDP 2x2
текст по сути возвращается к своему исходному размеру... который не имеет масштаба 2x! (исходный размер 1920x1080 при масштабе 1x).
Так же как --scale
и сокращение от --transform
, которое описывается как:
--transform a,b,c,d,e,f,g,h,i
Specifies a transformation matrix to apply on the output. A bi‐
linear filter is selected automatically unless the --filter pa‐
rameter is also specified. The mathematical form corresponds
to:
a b c
d e f
g h i
The transformation is based on homogeneous coordinates. The ma‐
trix multiplied by the coordinate vector of a pixel of the out‐
put 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 coordi‐
nate and multiplied against the matrix. The final device coordi‐
nates of the pixel are then calculated with the so-called ho‐
mogenic 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).
Итак, если я напишу `xrandr --output eDP --scale 1.5x1.5, это создаст матрицу преобразования следующим образом:
M =
1.5 0 0
0 1.5 0
0 0 1
где я использую * для обозначения скалярного произведения, а (x,y) — некоторые координаты
Таким образом, это будет равно:
w' = (0x + 0y + 1) = 1
x' = (1.5x + 0y + 1) / w' = 1.5x
y' = (0x + 1.5y + 1) / w' = 1.5y
Насколько я знаю, это влечет за собой линейное и относительное преобразование из последних координат x,y! Но подождите,если согласно документам, значения шкалы > 1 должныкомпрессвыходы, похоже, что это на самом деле расширяет выходы, поскольку (x,y) умножается на 1,5.
Я использую два монитора, если это что-то значит, я даже не вникаю в то, как это влияет на экранное пространство другого монитора.
решение1
Я пытаюсь вам помочь - вчера я читал документацию, и мне было трудно ее понять.
Я нарисовал вот эту картину ниже.
x'=x cos T + y -sin T + c | a b c
y'=x sin T + y cos T + f | d e f | g=0, h=0, i=1
x и y в пикселях режима вывода на ваш монитор
x' и y' в пикселях изображения на экране в графическом буфере
У меня есть один монитор: например, угол 10 градусов, масштаб 1,2 -> cos 10 x 1,2 = 1,1818, sin 10 x 1,2 = 0,2084
xrandr --output "DVI-D-0" --transform 1.1818,-0.2084,0,0.2084,1.1818,0,0,0,1
вывод вызова xrandr после этогоxrandr
Screen 0: minimum 8 x 8, current 2270 x 1677, maximum 32767 x 32767
DVI-D-0 connected primary 2176x930+0+0 (normal left inverted right x axis y axis) 531mm x 299mm
1920x1080 60.00*+
1680x1050 59.95
1600x1200 60.00
1440x900 59.89
1280x1024 75.02 60.02
1280x960 60.00
1152x864 75.00
1024x768 75.03 70.07 60.00
800x600 75.00 72.19 60.32 56.25
640x480 75.00 72.81 59.94
HDMI-0 disconnected (normal left inverted right x axis y axis)
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
Изображение в графическом буфере должно быть 2176x930
(2176 x cos 10 + 930 x sin 10) / 1,2 = 1920
но я не уверен насчет экрана (желтого) на картине!
Расстояние между верхним пикселем изображения в буфере и нижним экраном монитора составит:
2176 x sin 10 + 1080 x 1,2=1674,
но это включая пустой монитор, но если изображение выходит за пределы монитора, я бы поспорил, что картина правильная.
Вы можете вернуться к старым настройкам с помощью:
xrandr --output "DVI-D-0" --transform 1,0,0,0,1,0,0,0,1
сохраняйте все открытые файлы. Дважды у меня происходил сбой, из-за плохого входного сигнала монитор падал, и его приходилось перезагружать!