Lo hice y lo entendí

El blog de Vicente Navarro
27 oct

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:

Windows Display Advanced Properties

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:

Windows 96 DPI

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):

Fuente de 10 puntos en 96 DPI en Windows

Si elegimos una resolución de 144DPI (tamaño un 150% superior al estándar):

Windows 144 DPI

vemos que una fuente de 10 puntos es representada con 15 pixels:

Fuente de 10 puntos en 144 DPI en Windows

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:

Apariencia Windows 96 DPI

Apariencia Windows 120 DPI

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:

Apariencia Windows 96 DPI - Fuentes grandes

Ú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:

Windows Takbar 120DPI

Y no sólo en la barra de tareas… comparemos el Explorer a 96 DPI y a 120 DPI:

Explorer Win 96 DPI Explorer Win 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:

¿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:

GNOME login setting

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:

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 Fonts

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 (PreferencesFontDetails):

GNOME Font Rendering 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:

OO 96DPI

OpenOffice a 120 DPI:

OO 120DPI

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:

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

Entradas relacionadas

6 Comentarios a “Los DPI en pantalla en Windows y Linux”

  • Sagman dice:

    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)

  • jjlorenzo dice:

    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!

  • DA dice:

    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.

Tema LHYLE09, creado por Vicente Navarro