2011-11-03 10 views
6

Uso QPainter::setRenderHint(QPainter::Antialiasing, true) para decirle a Qt que quiero que sea antialias para cualquier dibujo que haga (en este caso, texto dibujado con drawText()).QPainter :: rotar deshabilita el antialiasing de texto dibujado

Esto funciona bien y el texto se ve bien, hasta que quiera rotar el mapa de píxeles al que estoy dibujando, p.

Painter.translate(0, height()); 
Painter.rotate(-90); 

(para girar la QPainter 90 grados hacia la izquierda y traerlo de vuelta a la vista)

La llamada a rotate() parece desactivar el antialiasing para cualquier texto dibujado - el texto se dibuja en la rotación correcta pero sin antialiasing . Otras cosas parecen no verse afectadas, p. drawLine() todavía dibuja una línea muy antialiased.

¿Alguna idea de lo que estoy haciendo mal?

EDITAR: Como era de esperar, agregar el texto a una ruta y luego completar esa ruta me da texto rotatorio antialias. Preferiría evitar esta ruta si fuera posible.

EDITAR (otra vez): He intentado usar QFont::setStyleStrategy(QFont::PreferAntialias) en la fuente que estoy usando, sin ningún efecto. Sin embargo, algunos experimentos más muestran que una fuente básica como Arial todavía producirá texto antialias cuando se gira, mientras que mi fuente personalizada (Swiss721 BlkCn BT para cualquiera que esté interesado) no lo hará. Además, aunque este problema existe en Windows 7, no tengo el mismo problema cuando se ejecuta en Ubuntu. This FAQ article parecería sugerir que Qt busca que el sistema operativo host maneje el antialiasing de fuentes, entonces, ¿qué tipo de problemas podría tener Windows al manejar el renderizado de esta fuente en particular (que es un TrueType, como Arial)?

EDITAR (última vez, lo prometo): aumentar el tamaño de la fuente a 16pt o superior elimina el problema. Parecería que el problema es con la representación de mi fuente en particular por debajo de 16 puntos - tal vez algo que ver con lo que se menciona en el artículo de blog anterior ?:

En fuentes de Windows 2000 son por lo general no antialiased dentro de un cierto rango (por ejemplo tamaños 8-16) para hacer que el texto sea más nítido y legible.

+0

Creo que pude haber respondido mi propia pregunta aquí, pero si alguien tiene más información o información relacionada, todavía estaría muy interesado. – sjwarner

Respuesta

2

hecho, he tenido ocasión de estar en esta parte del código Qt hace poco, y creo que el comportamiento que está viendo está relacionado con los dos siguientes errores en Qt:

Si recuerdo correctamente (no 100%) seguro, lo que realmente está viendo es la pérdida de la representación de ClearType en Windows. Cuando se aplica una transformación, Qt obtiene los píxeles del glifo de una manera que arroja la información ClearType, por lo que las cosas se ven más irregulares.

Si desea ver el código usted mismo, el lugar más probable es /src/gui/text/qfontengine_win.cpp. También podría intentar desactivar ClearType y ver si se ven similares.

+1

Eso tiene mucho sentido Dave, gracias. Desactivar cleartype hace que los personajes se dibujen con píxeles idénticos cuando se rotan. [Este hilo del foro] (http://forum.xda-developers.com/archive/index.php/t-280037.html) (especialmente los comentarios de Ingvarr) así como el [artículo de Wikipedia] (http://en.wikipedia.org/wiki/Cleartype#How_ClearType_works) explican cómo el principio subyacente que hace que ClearType funcione también lo limita a trabajar solo con texto horizontal. – sjwarner

0

Una "conjetura" se refiere a su RenderHint. Utiliza QPainter::Antialiasing aquí. Docu: "Indica que el motor debe antialias bordes de las primitivas si es posible". Primitivos como líneas, rectas, etc. Pruebe QPainter::TextAntialiasing en su lugar.

Nota: Los RenderHints son banderas, por lo que puede bit-O si es necesario (y suena como es).

+0

Sin suerte, me temo Robin, gracias de todos modos. – sjwarner

Cuestiones relacionadas