Suavizador (antialias) de fuentes 32 bits

Started by lamashino, November 14, 2011, 01:02:41 PM

Previous topic - Next topic

0 Members and 1 Guest are viewing this topic.

lamashino

Hola,
    Os adjunto un programa de línea de comandos que permite suavizar las aristas de las fuentes de 32 bits. Para poder usarlo debéis generar las fuentes con esa profundidad. Utiliza el algoritmo Scale3X del GIMP (lo he adaptado directamente de su código fuente).
    Empleo 32 bits porque las aristas que quedan en el fondo también se suavizan con un nivel de alpha adecuado.
    Lo ideal sería aplicar una algoritmo tipo "Cleartype", pero como no tengo el código fuente, pues no sé cómo implementarlo.
   Comentarios, sugerencias...  :)
   


josebita


Outlaw

"Life is cheap when the bounty is high"

lamashino

He encontrado un problemilla, que no sé si es fallo de la función "write".

Al utilizar el programa que suaviza las fuentes, se generan los valores alpha correctamente en el fichero de las fuentes. Sin embargo, al utilizar "write" no se tiene en cuenta ese valor de alpha.

Entiendo que debe ser fallo de "write", porque si utilizo la función "write_in_map", sí tiene en cuenta correctamente los valores alpha de la fuente...

Así que, deduzco que el fallo puede estar en la implementación del "write".

¿Alguien que sepa del tema?

lamashino

Me autocorrijo :). Estoy aún haciendo pruebas para ver si es así.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

lamashino

Necesito que alguien me explique qué falla en el siguiente programa!

Lo que quiero hacer es modificar el alpha de todos los píxeles de una imagen PNG que tiene canal alpha.

Lo que yo hago es leer cada píxel de la imagen y cambiarle el alpha, con lo que debería verse la misma imagen más transparente. Sin embargo lo que sucede es que los píxeles se ven más grises.

Sin embargo, cuando se modifica el "alpha" en los procesos, sí se aplica correctamente.

Adjunto el código fuente con los archivos, por si alguien puede encontrar el error. Quizás sea que no se modifica el alpha de esa manera...

SplinterGU

dame unos dias y lo veo... quizas hoy a la noche lo pueda ver... y te respondo... ahora estoy sin tiempo.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

lamashino

#9
No sé si será eso. He estado mirando la implementación de la función "gr_put_pixel" en el código fuente y por lo que entiendo, lo que se hace es mezclar el color del píxel que le paso a la función con el color que hay en la imagen. Así, si el fondo de la imagen es el color (0,0,0) u otro cualquiera, lo mezcla con el negro a partes iguales y hace que se oscurezca el color del píxel que yo quiero poner en esa posición, en vez de poner el píxel original más transparente.

A continuación te señalo dónde creo que puede estar el problema en la función "gr_put_pixel":

    r = (( color & 0x00ff0000 ) * _f+ (( *ptr & 0x00ff0000 ) * _f2 ) ) >> 8 ;
    r = (255*_f + (0*_f2)) >> 8 = (15300 + 0 ) >> 8 = 59

Con lo que el rojo se oscurece y no se consigue un rojo más transparente, que es lo que debería ser.
En la wikipedia viene cómo mezclar colores. Quizás sea así:

alfa1 = alfa_pixel_nuevo
alfa2 = alfa_pixel_anterior

Alfa_final = alfa1 + alfa2 - (alfa1*alfa2/255)
rojo_final = (rojo_nuevo*alfa1 + rojo_anterior*alfa2 - (rojo_anterior*alfa1*alfa2)/255) / Alfa_final

y lo mismo para los demás colores.

Se complica un poco, pero he probado la fórmula con algunos valores y parece que funciona.
La referencia de la wikipedia es: http://en.wikipedia.org/wiki/Alpha_compositing

De la wikipedia he modificado la fórmula para que use valores para el alfa y el rojo de 0 a 255, en vez de 0.0 a 1.0.

SplinterGU

el algoritmo de mezcla de colores anda bien, por ahora no lo voy a tocar, porque puedo hacer cagadas (pero lo voy a revisar con tiempo)

el problema es que no tenes que las funciones de pixels no tienen flags (se podria agregar) se necesitaria un NO_COLOR_KEY... pero lo que tenes que hacer es acceder a los datos del mapa directamente mediante punteros y modificarlo directamente.
Download Lastest BennuGD Release: http://www.bennugd.org/node/2

lamashino

Sí, tienes razón. Lo mejor es acceder directamente, puesto que lo que quiero hacer es modificar su valor sin que se mezclen con otros valores que hubiera antes.

De todos modos, sería interesante agregar un flag o crear un función que escriba directamente el color que le pasemos.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2

lamashino

Sí, sería lo suyo añadirle un parámetro.

De todos modos, ya lo he Solucionado: accediendo directamente a través del puntero devuelto por "map_buffer" funciona sin problemas. He creado una función "put_pixel_32" que sobreescribe el pixel en la posición que le indica.

SplinterGU

Download Lastest BennuGD Release: http://www.bennugd.org/node/2