Los DPI en pantalla en Windows y Linux
Los DPI (dots per inch o puntos por pulgada) es una medida de resolución de impresión que especifica cuántos puntos de tinta o tóner pone la impresora por cada pulgada de papel. Son valores típicos, por ejemplo, 300 DPI o 600 DPI. El término se usa incorrectamente en pantallas y en escáneres, aunque en realidad dichos usos están muy extendidos. En las primeras, el término correcto es el de PPI (pixels per inch o pixels por pulgada), y en los segundos, es el de SPI (samples per inch o muestras por pulgada). En castellano podemos usar PPP que lo mismo valdría para puntos-por-pulgada que para pixels-por-pulgada. Yo voy a usar DPI, que es el término que se usa en todos los diálogos de configuración de Windows y Linux.
En esta entrada, vamos a intentar entender qué supone un valor u otro de DPI en distintos entornos y cómo configurarlo:
Los DPI en Windows
En Windows, si vamos a las propiedades de la pantalla, opciones avanzadas, vemos que por defecto nos dice que está usando 96 DPI:
Pero esto no es exactamente cierto, porque en Windows, una fuente de 10 puntos tiene por defecto 10 puntos y una de 12 puntos tiene 12 independientemente del tamaño de la pantalla. Es decir, que a Windows le da igual que en un mismo monitor, sea el que sea, pongamos una resolución 640×480 (muy pocos DPI) o 1600×1200 (muchos DPI) que para él, en ambos casos estamos con una resolución de pantalla de 96 DPI.
Si por ejemplo elegimos personalizar los DPI que queremos en nuestro sistema y llegamos a este diálogo:
capturando el diálogo y ampliándolo, podemos comprobar que para Windows, 96 DPI equivale a un pixel por cada punto de las fuentes (he puesto pixels de diferentes colores por cada pixel de la fuente):
Si elegimos una resolución de 144DPI (tamaño un 150% superior al estándar):
vemos que una fuente de 10 puntos es representada con 15 pixels:
Aumentar los DPI en Windows no sólo sirve para aumentar el tamaño de las fuentes sino que también aumenta proporcionalmente el tamaño de diálogos, botones, iconos, etc. Es como simular tener una resolución más pequeña haciendo que todo ocupe más. O como hacer un zoom al escritorio. Veamos un ejemplo con el diálogo de Apariencia a 96 DPI y a 120 DPI donde vemos que en el segundo diálogo todo es proporcionalmente más grande que en el primero:
Y no lo confundamos con poner fuentes grandes. Podemos ver que el mismo diálogo con fuentes grandes en 96 DPI sólo tiene más grande eso, las fuentes, y no todas:
Últimamente es frecuente ver portátiles con una pantalla relativamente pequeña (p.e. 14.1″) y una resolución nativa relativamente alta (p.e. 1440×900) en los que, por defecto, las fuentes salen muy pequeñas. Excesivamente pequeñas para trabajar confortablemente con ellas sin forzar la vista. En teoría, es en estos casos en los que un aumento de los DPI es muy beneficioso.
Si embargo, no todas las aplicaciones de Windows están bien preparadas para trabajar con más DPI de los 96 estándar. Algunas simplemente trabajan como si estuvieran a 96 DPI, otras ponen fuentes grandes y dejan los iconos pequeños, otras pasan a tener los diálogos grandes pero las fuentes siguen siendo pequeñas. El propio Windows XP no se comporta bien del todo y cuando lo ponemos a 120DPI nos saca los iconos de la barra de tareas con un aliasing espantoso:
Y no sólo en la barra de tareas… comparemos el Explorer a 96 DPI y a 120 DPI:
Por tanto, ya vemos que Windows presupone, a menos que se le diga lo contrario, que todas las pantallas tienen una resolución fija de 96 DPI. No parece lo más óptimo, ya que si nos ponemos a hacer cuentas, veremos que las resoluciones reales no siempre son de 96DPI:
Portátil de 15.4″ con resolución nativa 1440×900 (16:10):
15.42=(16x)2+(10x)2 → Pantalla de 13.06"x8.16" → 110.27 DPI
Pantalla de 17″ con resolución nativa 1280×1024 (5:4):
172=(5x)2+(4x)2 → Pantalla de 13.27"x10.62" → 96.42 DPI
Pantalla de 22″ con resolución nativa 1680×1050 (16:10):
222=(16x)2+(10x)2 → Pantalla de 18.66"x11.66" → 90.05 DPI
Es decir, que para ver las fuentes con el mismo tamaño en el portátil de 15.4″ que en la pantalla de 17″ tendríamos que ajustar los DPI de en el Windows del portátil a 110. A menos que no podamos hacerlo porque el aspecto de Windows empeore drásticamente o directamente alguna aplicación no se pueda usar bien.
El tamaño de la pantalla es un dato que se puede obtener por EDID cuando tanto la pantalla como la tarjeta de vídeo lo soportan, pero parece que Windows no hace uso de tal dato para ajustar el tamaño de las fuentes a las dimensiones de nuestro monitor, sino que prefiere sacarnos un punto de la fuente por pixel para que la apariencia sea la mismo en todos los ordenadores que usemos a menos que cambiemos manualmente la resolución a usar.
Y es que en definitiva, pese a los problemas de visión que pueden encontrar muchos usuarios de pantallas con más de 96 DPI si no quieren/pueden aumentar dicho valor, para el resto de la comunidad de usuarios, el beneficio de usar una resolución estándar de 96 DPI es tener una interfaz con aspecto muy consistente que se ve exactamente igual en todos los monitores, tengan la resolución real que tengan.
Parece que en Windows Vista, sistema que yo no he probado (a ver si sigue siendo así por bastante tiempo), está bastante logrado que los usuarios de monitores con altas resoluciones puedan trabajar sin problema:
- High DPI Support in Windows Vista Aero
- Windows Vista DPI scaling: my Vista is bigger than your Vista
¿Por qué se usa ese valor de 96 DPI por defecto? Pues lo podemos leer en: Where does 96 DPI come from in Windows?
Resulta que algo antes de la salida de Windows 1.0 (1985), los primeros Macintosh 128K (1984) habían visto la luz con una pantalla de 9″ con resolución 512×342, es decir, 72 DPI y Apple decidió poner en ellos fuentes con un pixel por cada punto de la fuente, creando así un estándar.
Cuando salieron los primeros monitores VGA de IBM (1987) tenían una resolución de entre 70 y 74 DPI. Microsoft decidió entonces usar el valor de 96 DPI, un 33% más que la resolución del Macintosh, como valor estándar, para compensar la distancia del monitor a los ojos, de forma que las fuentes aparecieran algo más grandes y fáciles de leer en pantallas que realmente tenían menos DPI. Cuando apareció el IBM 8514 (1987), con resolución de 96 DPI en 1024×768, Microsoft decidió también hacerlo más grande en Windows, asignándole 120 DPI. Por eso, desde la época del Windows 3.1, que es el primero que estuvo realmente extendido, tenemos fuentes normales en 96 DPI que ocupan un pixel por punto y fuentes grandes en 120 DPI. No ha sido hasta la llegada de Windows 2000 y posteriores que los usuarios hayamos podemos especificar de cuántos DPI han de ser las fuentes de en nuestro sistema, dejando atrás por fin la exclusividad de las fuentes “normales” y “grandes”.
Por cierto, el autor de la entrada anterior también lamenta lo que yo comentaba antes, que muchas aplicaciones a lo largo de los años se han hecho usando esos 96 DPI y sin pensar que el usuario puede querer usar otra resolución:
Although screen PPI has remained fairly constant in the almost twenty years since this decision was made, there has been some marginal improvement. But, in this same timeframe, many, many applications have been written for Windows with 96 PPI. Unfortunately, many of these applications have made assumptions about the size of a pixel and many dialog boxes and web pages have been designed around 96 PPI. As newer displays have come along, some, especially laptops have higher pixel densities. Unfortunately if one adjusts for this by using PPIs besides 96, then there is a risk of some applications or web pages not working properly.
Los DPI en Linux
En Linux, en cambio, ni hay un valor de DPI por defecto, ni las aplicaciones gráficas están programadas para trabajar con un tamaño de fuente concreto por defecto. El valor que tengamos de DPI afectará únicamente a las fuentes del sistema, no a los diálogos, ventanas, iconos, temas de escritorio, etc. Los escritorios y gestores de ventanas modernos ya llevan utilidades para personalizar el estilo y el tamaño de todos esos elementos.
Y respecto a las fuentes, hay que tener en cuenta que ahora mismo son tres los toolkits de widgets que se usan en las X Windows: el Xaw (Athena Widgets toolkit), usado por las aplicaciones X “clásicas”, el GTK+, base de las aplicaciones GNOME y el Qt, base de las aplicaciones KDE. Vamos a ver cómo configurar los DPI en el sistema y posteriormente iremos viendo cómo afecta tal configuración a cada toolkit.
La forma más fácil para que el servidor X asigne el valor de DPI adecuado es que tanto la tarjeta de vídeo como el monitor soporten el EDID y el monitor informe a la tarjeta de vídeo sobre sus dimensiones, como podemos ver en este extracto de un /var/log/Xorg.0.log
:
(--) NVIDIA(0): Connected display device(s) on GeForce 6600 at PCI:1:0:0: (--) NVIDIA(0): HP w22 (DFP-0) (--) NVIDIA(0): HP w22 (DFP-0): 155.0 MHz maximum pixel clock (--) NVIDIA(0): HP w22 (DFP-0): Internal Single Link TMDS (II) NVIDIA(0): Assigned Display Device: DFP-0 (II) NVIDIA(0): Validated modes: (II) NVIDIA(0): "1680x1050" (II) NVIDIA(0): "1280x1024" (II) NVIDIA(0): "1024x768" (II) NVIDIA(0): "800x600" (II) NVIDIA(0): "640x480" (II) NVIDIA(0): Virtual screen size determined to be 1680 x 1050 (--) NVIDIA(0): DPI set to (90, 88); computed from "UseEdidDpi" X config (--) NVIDIA(0): option
Podemos ver los datos exactos de dimensiones y DPI en la salida del xdpyinfo
:
# xdpyinfo [...] screen #0: dimensions: 1680x1050 pixels (474x303 millimeters) resolution: 90x88 dots per inch [...]
Se puede deshabilitar la lectura de datos por DDC poniendo la opción “NoDDC
” en la sección Display
del /etc/X11/xorg.conf
.
Si no es posible obtener esta información, siempre podemos coger una regla, medir la zona visible de nuestro monitor en milímetros y poner sus dimensiones en el parámetro DisplaySize
de la sección Monitor
del fichero xorg.conf
:
DisplaySize width height This optional entry gives the width and height, in millimetres, of the picture area of the monitor. If given this is used to calculate the horizontal and vertical pitch (DPI) of the screen.
Yo, por ejemplo, pondría:
Section "Monitor" Identifier "Generic Monitor" Option "DPMS" DisplaySize 474 303 EndSection
Otra opción es pasarle el parámetro -dpi
al servidor X, como leemos en el “man Xserver
“:
-dpi resolution sets the resolution for all screens, in dots per inch. To be used when the server cannot determine the screen size(s) from the hardware.
Esta opción se la podemos pasar al servidor X a través del startx
:
$ startx -- -dpi 100
A través del xdm
poniendo en el /etc/X11/xdm/Xservers
algo como:
:0 local /usr/bin/X :0 vt7 -dpi 100 -nolisten tcp
A través del kdm
poniendo en el /etc/kde3/kdm/kdmrc
algo como:
ServerArgsLocal=-nolisten tcp -dpi 100
A través del gdm
poniendo en el /etc/gdm/gdm.conf
algo como:
[server-Standard] name=Standard server command=/usr/bin/X -dpi 100 -audit 0
o en el diálogo de configuración de la pantalla de login de GNOME:
Para ver si se está usando el parámetro -dpi
, podemos hacer un simple ps
:
# ps -ef | grep X root 3047 3046 0 19:30 tty7 00:00:11 /usr/bin/X :0 -dpi 96 -audit 0 -auth /var/lib/gdm/:0.Xauth -nolisten tcp vt7
Los valores de DisplaySize
tienen preferencia sobre las dimensiones obtenidas por DDC para calcular los DPI, como podemos leer en Release Notes for X11R6.8: Overview of X11R6.8:
Several drivers uses DDC information to set the screen size and pitch. This can be overridden by explicitly resetting it to the and non-DDC default value 75 with the -dpi 75 command line option for the X server, or by specifying appropriate screen dimensions with the “DisplaySize” keyword in the “Monitor” section of the config file.
Sin embargo, como esto lo determina el driver, a veces ocurre al revés, como veo en algunos casos:
Incluso yo, que uso el driver cerrado de NVidia, experimento tal cosa, ya que este driver usa un parámetro propietario para decidir si usa el EDID o no, el “UseEdidDpi
“, como leemos en el README NVidia: Appendix Y. Dots Per Inch.
La opción -dpi
, si se especifica, tiene preferencia sobre el valor calculado, bien sea por EDID/DDC, bien sea por el DisplaySize
. Y, en cualquier caso, como ya decía antes, podremos ver el valor que finalmente se está usando en la salida del xdpyinfo
(a diferencia del anterior, este ejemplo de xdpyinfo
es con -dpi 96
):
$ xdpyinfo | egrep 'dimensions|resolution' dimensions: 1680x1050 pixels (445x278 millimeters) resolution: 96x96 dots per inch
Si no hay ni -dpi
ni DisplaySize
ni DDC, se usa por defecto un valor de 75 DPI.
Este valor de DPI que muestra el xdpyinfo
es el valor de DPI base del servidor X. Todas las aplicaciones X clásicas (p.e. xterm, xcalc, xedit, etc.) pueden usarlo, así como el viejo sistema de fuentes en el que, entre otros parámetros, los DPI horizontales y verticales son un parámetro de la fuente, como podemos ver, por ejemplo, en las descripciones de las fuentes que encontramos en /usr/share/fonts/X11/75dpi/fonts.dir
:
courO08-ISO8859-1.pcf.gz -adobe-courier-medium-o-normal–8-80-75-75-m-50-iso8859-1
También lo podemos ver en el xfontsel
:
Pero aún tenemos más posibilidades para especificar los DPI en KDE y en GNOME sin alterar el valor de DPI que a usa el servidor X:
Configuración de los DPI en KDE (Control Center):
KDE guarda la configuración de los DPI en el fichero ~/.kde/share/config/kcmfonts
:
[General] dontChangeAASettings=false forceFontDPI=96
Configuración de los DPI en GNOME (Preferences → Font → Details):
GNOME guarda la configuración de los DPI en el fichero ~/.gconf/desktop/gnome/font_rendering/%gconf.xml
:
<?xml version="1.0"?> <gconf> <entry name="dpi" mtime="1193470800" type="float" value="96"> </entry> </gconf>
O, lo que es lo mismo:
$ gconftool-2 --get /desktop/gnome/font_rendering/dpi 96
¿Qué es lo que hacen en concreto estos valores?
Dentro del esfuerzo del proyecto Freedesktop.org por hacer comunes e interoperables muchas áreas de diferentes escritorios, actualmente Linux usa fontconfig, una librería creada por por Keith Packard que permite gestionar y utilizar las fuentes del sistema de una forma centralizada para todos los escritorios y aplicaciones. La librería fontconfig puede ser usada tanto para renderizar las fuentes de un texto a imprimir como para sacarlas en pantalla, en cuyo caso se usa la librería Xft, que funciona por encima de la anterior.
Pues bien, la librería Xft usa el X Resource Xft.dpi
para configurar los DPI de las fuentes en pantalla. Dicho X Resource es usado, creado y modificado tanto por KDE como por GNOME al configurar los DPI en las pantallas que hemos mostrado anteriormente. Podemos consultarlo con el comando xrdb
:
$ xrdb -query | grep dpi Xft.dpi: 96
Y si quisiéramos, también podríamos poner el valor de Xft.dpi
que nos interesara en el fichero ~/.Xresources
.
OpenOffice a 96 DPI:
OpenOffice a 120 DPI:
Si en KDE/GNOME/.Xresources
no tenemos un valor configurado de DPI, el valor del servidor X (-dpi
, DisplaySize
, EDID/DDC) será el que se usará. Eso es muy fácil que ocurra en KDE porque por defecto no tiene un valor de DPI asignado.
En GNOME, el valor de DPI que tengamos en la configuración será propagado por el proceso gnome-settings-daemon
a todas las aplicaciones a través de XSETTINGS
y de Xft.dpi
. Ya es cosa de la distribución elegir si el valor de DPI es fijo (p.e. 96 DPI) y se deja a la elección al usuario que lo cambie si quiere, o si se elige un valor de entre unos predeterminados a partir de los valores de DPI que proporciona el servidor X, o si a menos que se especifique uno manualmente siempre se use uno calculado. Por ejemplo, en Debian Etch, vemos que aunque borremos el valor por defecto, se sigue usando 96 DPI:
$ gconftool-2 --unset /desktop/gnome/font_rendering/dpi $ gconftool-2 --get /desktop/gnome/font_rendering/dpi 96
En Ubuntu solían tener 96 DPI por defecto, pero en Ubuntu Gutsy se ve que han decidido que el proceso gnome-settings-daemon
use la resolución del servidor X, a menos que se le especifique una en la configuración de las fuentes, lo cual ha causado algún problemilla:
- Font sizes in Gutsy are affected by bad X.org DPI detection
- [Gutsy update] Gnome application font sizes too small to read
En openSUSE también andan andan dándole vuestas a estos temas:
Y es que hay un interesante debate en marcha en la comunidad de Linux sobre si se debe de usar un valor de DPI por defecto para proporcionar una aspecto consistente del escritorio en todas las máquinas, igual que hacen todos los Windows hasta el XP o si se debe usar un valor de DPI adaptado a las características de la pantalla, camino que parece estar marcando Windows Vista.
Ya hemos visto que la tendencia es a usar los DPI reales de la pantalla pero, por ejemplo, Billy Biggs da argumentos buenos a favor de usar 96 DPI como resolución estándar: Solving the Linux DPI Puzzle e incluso nos muestra ejemplos de los problemas que pueden aparecer en las fuentes con pequeños cambios en el valor de DPI.
Un interesante documento que habla a grandes trazos de cómo configurar los DPI en sistemas UNIX es: Mozilla DPI-related Font Size Issues on Unix. Pese a lo que se podría pensar por el título, no trata de cómo afecta el valor de DPI a las páginas mostradas, sino de cómo afecta a las fuentes de los menús, herramientas y bookmarks.
Los DPI en los navegadores
Cuando aumentamos los DPI en el sistema operativo para adecuarlo a las características de nuestra pantalla, tal y como hemos visto para Windows y Linux, podemos encontrarnos con que el texto del navegador no se ajusta a los DPI que hemos seleccionado. Como no es un tema sencillo, le dedicaremos la siguiente entrada:
:wq
Muy interesante el artículo, yo ni me había planteado esos problemas de las diferentes resoluciones y la verdad, aun no acabo de entender que pasa exactamente (con una relectura de tu artículo seguro que lo aclaro :P)
@Sagman ¡Gracias!
Hola, felicidades por el exelente articulo. Llegué a el, buscando explicación al problema de gutsy.
Segun lo que he entendido, el servidor X autodetecta mal el dpi y si tenemos habilitados a compiz con el tema de cairo para el decorador de ventanas, entonces, como el servidor X tiene mal configurada los dpi, cairo es posible que use esos datos para dibujar y sale solo el titulo con fuentes agrandadas.
gracias nuevamente, jose jorge
@jjlorenzo ¡Me alegro de que te haya resultado útil!
Gran Gran articulo, y vaya descubrimiento el de hoy con tu web, Felicidades.
He venido aquí después de instalar kde4 en ubuntu 7.10,… me ha durado menos de un día, pero después de quitar kde4 me ha dejado todo ubuntu (gnome vaya) con las fuentes muy pequeñas, he mirado de hacer todo lo de tu post y solo he conseguido recuperar el aspecto normal de Synaptic, porque supongo que la manera de mostrar los controles y fuentes va diferente.
Por ejemplo si en el apartado Apariencia de Ubuntu 7.10 quiero cambiar el tipo de suavizado a las fuentes, y tengo abierto a la vez Synaptic, Firefox, Nautilus, los cambios solo afectan a la ventana de Synaptic y el resto continua igual.
Tengo xorg.conf configurado con el driver propietario de nvidia (GeForece 7800 GT), y tanto con Compiz activado o desactivado (probando con fusion-icon) tengo el mismo problema.
Alguna idea? yo ya llevo intentandolo una semana y no hay manera.
@DA Gracias, me alegro de que haya gustado. Dices que cambias el tipo de suavizado, pero ¿has probado a cambiar los DPI? ¿Has mirado la salida de “
xrdb -query | grep dpi
“?Si el problema te ha venido tras instalar y eliminar KDE, puedes probar a mover todos los ficheros de configuración ocultos de
$HOME
, como.kde
,.gnome
,.gconf
a otro sitio temporalmente, reiniciar las X y ver si todo vuelve a estar bien y luego ir recuperando directorios hasta que encuentres el ficheros de configuración que te estaba dando problemas.