2012-05-24 14 views
5

He estado trabajando en mi propio renderizador de fuentes de mapa de bits y aunque creo que puedo tener el espaciado entre caracteres correctamente, no estoy seguro de cómo puedo determinar la ubicación y del carácter . Por ejemplo, si la letra 'a' tenía una colocación y de 0, entonces ¿qué tendría '*' o ','? He estado usando la función winapi GetCharABCWidthsFloatW para determinar el espaciado entre caracteres, ¿hay alguna otra función que pueda usar para determinar algún tipo de desplazamiento y?Determinar la ubicación y de un carácter para representar texto

Estoy haciendo un mejor ajuste en mis imágenes de mapa de bits, por lo que no siempre son del mismo tamaño.

+0

¿Los mapas de bits de la fuente no tienen la misma altura? –

+0

Buen punto, estoy haciendo un mejor ajuste en mis imágenes de mapa de bits, por lo que no siempre son del mismo tamaño ... – jack

+0

¿Tal vez tenga algún tipo de tabla de compensación? Con el desplazamiento desde la línea base, puede usar la misma tabla para colocar también letras como 'g'. –

Respuesta

0

Cada carácter en sí debe ser desplazado en la dirección y por las API de reproducción de texto correctamente (TextOut, DrawText, etc.), por lo que debe tener un desplazamiento constante. Siempre obtengo las métricas de la cadena "Ag" usando GetTextExtentPoint32 para obtener las métricas en general, además puedes probar GetTextMetrics.

+0

Miré en 'GetTextMetrics' pero necesito obtener información específica de carácter, y esa era la información de la fuente. ¿Cómo puedo usar la información de 'GetTextExtentPoint32' para compensar el y? – jack

0

GetTextMetrics es la respuesta correcta. Pero demorge puede haber querido decir que los campos que necesita usar para la coordenada Y son tmAscent (observe la estructura)

La altura total es tmHeight. tmAscent es la distancia desde la parte superior a la línea de base. Y tmDescent es la distancia entre la línea de base y la parte inferior de la fuente.

Por lo tanto, en la mayoría de los casos, desea agregar tmAscent si su coordenada (x, y) hace referencia a la esquina superior izquierda del texto. Si la coordenada y es la parte inferior, entonces resta tmDescent (el + o - también depende de si invertiste la ventana, pero puedes probar y ver lo que obtienes).

Esa información funciona ya sea que escribas una "a" , un "*" o una "j". La línea de base es la misma para todos los personajes.

+0

¿Cómo puedo saber cuánto tiene un personaje específico para un ascenso o un descenso? Escribo un personaje en un mapa de bits, luego creo un mejor mapa de bits por personaje y lo guardo. Entonces en el mapa de bits es uno mismo, cada uno tiene una altura diferente. – jack

+0

Todos los caracteres de una fuente tienen el mismo Ascenso y descenso. Si desea optimizar el mapa de bits, tendrá que hacer un trabajo adicional por su cuenta (es decir, hacer un recorte automático en el mapa de bits resultante). Además, no puede crear realmente un rectángulo pequeño y esperar que el personaje encaje perfectamente (a menos que lo use en un terminal como fuente, como Courier). La mayoría de las fuentes "se filtran" por todo el lugar. Es realmente difícil calcular la caja correcta. –

0

Si lo entiendo correctamente: los mapas de bits para cada glifo son de la misma altura inicialmente. A continuación, recorta todo el espacio disponible alrededor de cada glifo para crear un mapa de bits mínimo para cada personaje.

La respuesta en este caso es simple. Cuando crea el mapa de bits recortado, recuerde cuántos píxeles elimina de la izquierda y la parte superior (o la izquierda y la parte inferior, dependiendo de cómo esté posicionando los glifos). Cuando dibuje los mapas de bits puede ajustar las coordenadas usando los valores guardados.

Sin embargo, si está tratando de usar las métricas de fuente para determinar cuánto recortar de cada mapa de bits, no puede.

0

general información de la fuente:

Lo que estamos buscando es cómo normalizar la colocación del texto a la "línea de base" o el "origen" (mismo concepto). Puede hacer esto con el ascenso (ascendente) o el descenso (descendente) dependiendo de su sistema de coordenadas.

http://www.freetype.org/freetype2/docs/tutorial/step2.html

que proporciona un buen conjunto de imágenes de ejemplo relacionados con la tipografía.

mapa de bits general información de la fuente:

Ahora, con respecto de una imagen de mapa de bits a la forma más fácil de asegurarse de que están todos alineados correctamente es tener la misma altura para la representación de mapa de bits de cada personaje en su hoja de sprites (los anchos deben ser diferentes, sin embargo, según el ancho real del personaje).Si haces esto, entonces simplemente puedes alinear todo en función de esa altura compartida.

Sin embargo, si está recortando el espacio en blanco excesivo alrededor de un carácter, necesitará almacenar los valores recortados en alguna estructura junto con el glifo para que pueda determinar el desplazamiento. Si una API hace esto por usted, es probable que tenga un método ascendente/descendente, origen/línea base o tipo de altura de línea donde puede obtener las dimensiones completas basadas en un carácter para que pueda hacer esto correctamente.

Api información específica
Editar: Basado en otras respuestas aquí están los enlaces pertinentes para su API pregunta específica:

GetTextMetrics:
http://msdn.microsoft.com/en-us/library/dd144941(v=vs.85).aspx

TEXTMETRIC struct:
http://msdn.microsoft.com/en-us/library/dd145132(v=vs.85).aspx

tmAscent o tmDescent se puede usar para ayudar a compensar su coord inate

Cuestiones relacionadas