miércoles, 25 de septiembre de 2013

Mejorar renderizado de fuentes en Linux

Una de las cosas que noté en su día al empezar a usar Linux es que los textos "se veían mejor" en Windows. La solución que se podía encontrar por Internet era instalar las fuentes de Windows (msttcorefonts), pero ese no era el problema: las fuentes seguían viéndose menos nítidas que en Windows, al menos para mi gusto.

Años más tarde, y por un tema completamente diferente, me he enterado que el problema es el renderizador que utiliza Linux para el suavizado de las fuentes (el equivalente al ClearType de Microsoft). El renderizador se encarga entre otras cosas del suavizado de las fuentes para evitar que se vean los bordes de los caracteres. En esta imagen, sacada de este blog, se puede ver más claramente:


La imagen de la izquierda es una fuente normal, dibujada en la pantalla sin ningún tipo de suavizado. Es desde luego la forma más nítida de ver el texto, pero tiene el inconveniente de que se notan claramente los bordes dentados. Hay fuentes que se diseñan teniendo en cuenta esto, especialmente para programación, pero cada vez son menos usadas.

En la imagen central puede verse la misma fuente con un antialias estándar. También se denomina "suavizado con escala de grises". En este caso, en lugar de utilizar sólo el color base (en este caso el negro) tenemos disponibles 256 tonos de gris que, como vemos, se utilizan para suavizar el contorno de la fuente. El resultado, aunque algo menos nítido que el anterior, es mucho más agradable a la vista.

Por último, en la imagen de la derecha, tenemos el "suavizado de subpíxel" que mejora el suavizado de escala de grises anterior. Nuestro problema es que, debido al tamaño de los píxeles, los tonos de gris intermedios hacen que la fuente pierda nitidez al usar el método anterior. El suavizado de subpíxel intenta conseguir los resultados del suavizado con escala de grises pero perdiendo la mínima nitidez posible. Para ello se basa en una idea muy ingeniosa: cada píxel de un monitor está compuesto de tres subpíxeles con los colores primarios (RGB) cuya intensidad se regula para obtener el color final de ese píxel en concreto. Un píxel ampliado es muy similar al cuadrado de tres colores que puede verse en la esquina superior derecha de la imagen anterior.

La idea básica es que si queremos aumentar un poco el grosor de la fuente por la derecha, lo que haremos es usar un tono de rojo de modo que el subpíxel verde y el azul estén "apagados" y el rojo esté más o menos "encendido". Del mismo modo, si queremos aumentar un poco el grosor por la derecha, regularemos el subpíxel azul y apagaremos el verde y el rojo. Si queremos aumentar un poco más el grosor buscaremos un tono que encienda los subpíxeles verde y rojo o verde y azul según el caso, y de este modo tenemos tres veces más resolución horizontal con la misma pantalla.

En este concepto se basa Cleartype para Windows y el renderizador de fuentes de Linux en su opción por defecto. Adicionalmente, algunas distribuciones como Ubuntu han mejorado el renderizador para obtener textos más nítidos.

El problema es que hay distribuciones, como Debian, en las que las fuentes no se ven tan nítidas. Afortunadamente existe un proyecto llamado Infinality que introduce unos parches que mejoran el renderizado de los textos. De hecho, permiten incluso adoptar renderizados similares a los que se usan en MacOS, Ubuntu o Windows entre otros.

Las diferencias son notorias, como se puede ver en la imagen siguiente sacada de Webupd8:


Aunque en la imagen ya se nota suficiente, es cuando lo tienes instalado cuando te das cuenta de que todos los textos se ven mejor. Si queremos instalarlo, en el enlace anterior nos explican cómo, pero a grosso modo, en Ubuntu:

1. Añadimos el PPA correspondiente:
sudo add-apt-repository ppa:no1wantdthisname/ppa

2. Actualizamos los repositorios:
sudo apt-get update 
sudo apt-get upgrade

3. Instalamos Infinality 
sudo apt-get install fontconfig-infinality

4. Lo configuramos
sudo bash /etc/fonts/infinality/infctl.sh setstyle

Al ejecutar esta orden podremos elegir el estilo que queremos utilizar para el renderizado. Yo suelo escoger el de Ubuntu o el de Linux.


5. Reiniciamos o cerramos sesión para ver los cambios
Para instalar Infinality en el resto de distribuciones o para configuraciones más avanzadas, lo mejor es leerse el post original de Webupd8 (en inglés).