Вопрос или проблема
Из документов Xfce:
В случае, если вы хотите переопределить значение DPI (точек на дюйм), рассчитанное X-сервером, вы можете выбрать флажок и использовать спин-бокс, чтобы указать разрешение, которое будет использоваться при отображении шрифтов на вашем экране.
Но как X-сервер выполняет свои расчеты? Какие предположения делаются в процессе и могут ли некоторые параметры быть переопределены?
Он может знать, сколько пикселей у меня на дисплее, но этого достаточно?
Насколько я знаю, начиная с версии 1.7, xorg
по умолчанию установлен на 96 dpi
. Он не рассчитывает ничего, пока вы не укажете DisplaySize
через конфигурационные файлы Xorg
. Также не надейтесь на вывод xdpyinfo
.
Мой ноутбук работает на Intel SandyBridge. Вытяжка из моего Xorg.0.log
на свежей установке Archlinux:
(==) intel(0): DPI установлено на (96, 96)
выполнение
xdpyinfo | grep -E 'dimensions|resolution'
возвращает:
размеры: 1600x900 пикселей (423x238 миллиметров)
разрешение: 96x96 точек на дюйм
что далеко от правды. Я знаю, что размер моего экрана составляет 344x193
мм, так что, очевидно, xdpyinfo
вычисляет физический размер на основе разрешения пикселей (1600x900
) и стандартного 96 DPI
. Если я добавлю
........
DisplaySize 344 193
........
в /etc/X11/xorg.conf.d/monitor.conf
и перезагружу, Xorg.0.log
правильно сообщает:
(**) intel(0): Размеры дисплея: (344, 193) мм
(**) intel(0): DPI установлено на (118, 118)
Тем не менее, xdpyinfo | grep -E 'dimensions|resolution'
всегда возвращает:
размеры: 1600x900 пикселей (423x238 миллиметров)
разрешение: 96x96 точек на дюйм
Тем не менее, никаких визуальных изменений, так как я использую Gnome, и 96 DPI
также жестко закодирован в gnome-settings-daemon
. После патча последнего, я могу наслаждаться своим родным 118 DPI
. Но даже после всего этого, xdpyinfo
по-прежнему возвращает:
размеры: 1600x900 пикселей (423x238 миллиметров)
разрешение: 96x96 точек на дюйм
Как X-сервер вычисляет DPI?
DPI X-сервера определяется следующим образом:
- Параметр командной строки
-dpi
имеет наивысший приоритет. - Если он не используется, то используется настройка
DisplaySize
в конфигурационном файле X для вывода DPI, учитывая разрешение экрана. - Если
DisplaySize
не задан, используются значения размера монитора из DDC для вывода DPI, учитывая разрешение экрана. - Если DDC не указывает размер, по умолчанию используется 75 DPI.
Он может знать, сколько пикселей у меня на дисплее, но этого достаточно?
Нет, он не только знает виртуальный размер экрана в пикселях, но (обычно) также физический размер дисплея в миллиметрах. Вы можете проверить размеры вашего дисплея, выполнив следующее в терминальном окне:
~ $ xdpyinfo | grep dimension
размеры: 1366x768 пикселей (361x203 миллиметров)
Расчет, который выполняет ваш X-сервер, выглядит следующим образом:
- 1366 пикселей, деленные на 361 миллиметр, умноженные на 25.4 миллиметра на дюйм = 96.11191136 точек на дюйм (DPI).
- 768 пикселей, деленные на 203 миллиметра, умноженные на 25.4 миллиметра на дюйм = 96.09458128 точек на дюйм.
Вы можете проверить, какой DPI вычислил ваш X-сервер, используя следующую команду:
~ $ xdpyinfo | grep resolution
разрешение: 96x96 точек на дюйм
Хорошо выглядит, не так ли?
Для дальнейшего чтения:
Когда этот вопрос был задан в первый раз, Xserver не вычислял DPI экрана – он использовал DPI для вычисления размера экрана, учитывая, что единственное, что он точно знает, это размер экрана в пикселях. Запасной вариант был “96”, потому что это было “достаточно близко” к очевидной физической плотности пикселей на приличных мониторах той эпохи, а также “достаточно близко” к набору шрифтов 100dpi в основной коллекции шрифтов X11. Старые рабочие монитор были всего лишь около 70dpi, поэтому многие 75dpi растровые шрифты также были в оригинальных шрифтах X11.
Согласно этому ответу более современные драйверы Xorg, возможно, могут определять физический размер экрана, в этом случае они могут вычислить очевидный DPI; или физический размер может быть указан в конфигурации.
Если в конечном итоге Xserver все еще не знает физический размер вашего экрана, вы должны указать правильный физический DPI экрана, используя параметр -dpi N
Xserver, например, в ~/.xserverrc
или в командной строке startx
:
startx -- -dpi 330
Если размеры и значения DPI, отображаемые xdpyinfo
, не совпадают с физическими значениями для вашего экрана, и предположим, что не был применен какой-либо глобальный коэффициент масштабирования, значит, что-то настроено неправильно.
Вы также можете установить значение ресурса DPI для библиотеки Xft, чтобы оно совпадало, т.е. поместите следующее в свой ~/.Xdefaults
или ~/.Xresources
и т.д.:
Xft.dpi: 330
Предостережение: если вы используете GNOME, может быть демон настроек, который перезаписывает ваши ресурсы Xft, если вы также не отредактируете соответствующий конфигурационный файл для него.
Точки на дюйм = Точки (пиксели) / Дюймы (физический размер монитора).
Ответ или решение
Как X-сервер рассчитывает DPI?
X-сервер, который управляет графической подсистемой в Unix-подобных операционных системах, использует несколько шагов для определения значения DPI (точек на дюйм), которое впоследствии применяется для рендеринга шрифтов и графики. DPI представляет собой измерение плотности пикселей на экране и является важным параметром для корректного отображения информации. Рассмотрим процесс вычисления DPI подробнее.
Шаги вычисления DPI
-
Приоритет параметров командной строки: Наивысший приоритет имеет параметр
-dpi
, указанный при запуске X-сервера. Если он задан, сервер использует указанное значение DPI. -
Настройка DisplaySize: Если параметр
-dpi
не указан, X-сервер обращается к конфигурации в файле настроек, где может быть указано значениеDisplaySize
. Это значение представляет собой физические размеры дисплея (обычно в миллиметрах). На основе данной информации и разрешения экрана X-сервер вычисляет DPI. -
Использование DDC: Если
DisplaySize
не задано, X-сервер может использовать информацию о размере монитора, полученную через DDC (Display Data Channel), если таковая доступна. -
Резервный вариант: Если ни одно из вышеуказанных значений не доступно, используется стандартное значение DPI, равное 75 DPI. Это значение является устаревшим, но иногда оказывается полезным для совместимости с более старыми системами и приложениями.
Условия и предположения
X-сервер принимает во внимание как разрешение экрана в пикселях, так и физические размеры дисплея для вычисления DPI. Например, если у вас дисплей с разрешением 1600×900 пикселей и известными размерами 344×193 мм, расчет будет выглядеть следующим образом:
- Для ширины: ( \text{DPI} = \frac{\text{1600 пикселей}}{\text{344 мм}} \times 25.4 \approx 118 )
- Для высоты: ( \text{DPI} = \frac{\text{900 пикселей}}{\text{193 мм}} \times 25.4 \approx 118 )
Таким образом, X-сервер вычислит DPI в 118 для обоих направлений.
Варианты переопределения
Пользователь может установить собственное значение DPI, используя настройки конфигурации X-сервера или параметры командной строки. Например:
- Параметр
DisplaySize
можно добавить в файл конфигурации/etc/X11/xorg.conf.d/monitor.conf
, чтобы переопределить DPI на значение, связанное с реальными размерами дисплея. - Также можно использовать файл
~/.Xresources
или~/.Xdefaults
, чтобы установитьXft.dpi
на желаемое значение, что будет пересчитывать DPI для шрифтов, использующих Xft.
Однако стоит учитывать, что некоторые графические окружения, такие как GNOME, могут переопределять эти значения через свои настройки, что может привести к несоответствиям. В таком случае потребуется вмешательство в настройки самого окружения для корректного отображения.
Заключение
В результате, X-сервер опирается на комбинацию информации о разрешении экрана и физических размерах, чтобы вычислить значение DPI. Благодаря этому обеспечивается качественное отображение графики и текстов, соответствующее реальным параметрам устройства. Для получения точных значений и оптимального отображения важно правильно настраивать параметры конфигурации и учитывать настройки используемого графического окружения.