2011-05-22 9 views
6

Estoy escribiendo un programa opengl que usa freetype2 como motor de representación de texto.¿Por qué siempre hay algo de ruido en el texto representado de freetype?

Utilizando su representación subpixel de LCD, encontré que siempre hay algunos píxeles de ruido en el resultado representado, ¿por qué está sucediendo eso? Además, aunque el manual dice que el modo LCD generará un búfer con un ancho de un múltiplo de 3, a menudo encuentro que el ancho es 3n + 1 o 3n + 2, y es inconsistente con el face->glyph->bitmap->width.

enter image description here

+0

Trata de compensar la paridad con el +1 y +2. –

+0

¿Cómo está la paridad de compensación +2? No cambia la paridad. – trVoldemort

+0

Vea mi comentario sobre la respuesta de Lie Ryan (y acéptelo si lo desea, no necesito representante). –

Respuesta

3

En realidad, después de horas de pruebas y pruebas, me di cuenta de que los datos de glifos rasterizados tienen algunos bytes no relevantes llamados padding. Ilustrativamente, de formación de imágenes a continuación es una datos de glifo en un tampón: (o/x son datos significativos, mientras que . son no relevante)

0 1 2 3 4 5 6 7 
0 o x o x o x . . 
1 x o x o x o . . 
2 o x o x o x . . 
3 x o x o x o . . 
4 o x o x o x . . 

hay tres números que describen el tamaño de esta memoria intermedia, los dos primeros son obvias :

rows = 5 //since there are 5 rows 
width = 6 //since each row has 6 bytes of data 

Sin embargo, en realidad hay una tercera:

pitch = 8 //the actual width of rows, including "padding" 

Si ignora esta propiedad del aficionado como yo, y tengo la idea equivocada de que el width es el ancho real, estará representando una forma de glifo distorsionada o traducida.

Mi comprensión de este 'relleno' es como dice Dhaivat Pandya, es una compensación. Sin embargo, no es una compensación por la paridad (obviamente +2 no cambia la paridad) por defecto es una compensación para hacer que el ancho real sea un múltiplo de 4. Pero sí, puede cambiar el 4 en 2 o incluso 1. Supongo formando una matriz de datos con su ancho un múltiplo de 4, se puede cargar más rápido, por ejemplo, para cargarse en longint en lugar de byte.

Pero aún así, la perspicacia de R.. realmente me impresionó. Creo que ustedes no pueden imaginar que podría cometer un error tan básico.

+1

Tener una "longitud" distinta de la "zancada" (o "paso" aquí) es un patrón de diseño bastante común en las API que manejan una serie de elementos fijos en un búfer en bruto. Como nota, por lo general es para un acceso alineado más rápido. Los datos de mapa de bits a menudo se almacenan con relleno de alineación de esta manera (ya que el "ancho" de una imagen puede ser cualquier número entero), y si usted hace gráficos, los datos de los vértices también pueden serlo. –

2

nunca he utilizado la biblioteca FreeType, así que no puedo hablar por experiencia personal, pero tal vez el "ruido" es porque el ancho de texto o su cálculo del texto superior izquierda de coordenadas se fuera ¿por uno?

+0

Esto es correcto. No se supone que el píxel enmarcado de la imagen sea el píxel situado más a la derecha de la línea en la que se muestra. En cambio, es el píxel más a la izquierda de la siguiente línea. El puntero de OP al comienzo de la imagen está desactivado en un píxel. –

Cuestiones relacionadas