2011-11-28 37 views
5

Estoy buscando un código PostScript que calcule la altura de una fuente PostScript (espacio para el ascendedor) y la profundidad (espacio para el descendente). ¿Se podría usar el cuadro delimitador de una fuente (FontBBox) para esto? `¿Cómo se determina la altura y la profundidad de una fuente PostScript?

Aquí hay algunos antecedentes para mi pregunta: los glifos de una fuente están en una línea base. Obviamente, los glifos con descendentes llegarán por debajo de la línea de base y quiero saber a qué distancia por debajo de la línea de base pueden llegar los descensores, de modo que pueda proporcionar suficiente espacio en un diseño.

He visto PostScript code that renders a given string to check its dimension. Estoy bastante interesado en una respuesta general para una fuente determinada.

Respuesta

7

Bien, ya has descubierto los dos "accesos directos". El FontBBox da el cuadro delimitador de todos los glifos superpuestos en la fuente. false charpath flattenpath pathbbox da la caja para una cadena especificada.

Para una fuente Tipo 3 (definida por el usuario) esto es todo lo que puede esperar razonablemente hacer; pero para las fuentes Tipo 1 más populares, hay una gran cantidad de información de métrica tanto en la fuente como en un archivo "métricas" (para otras aplicaciones).

Pero esta es la parte que no conozco muy bien. Así que voy a leer (en el manual de Adobe Type 1) y ampliar esta respuesta más adelante.

Edit: En realidad, parece que estas pueden ser las mejores formas en general.

Hay es una matriz de valores de alineación vertical en una fuente Tipo 1, en el diccionario/Privado, con el nombre/BlueValues; pero no hay garantía de que la fuente los honre. El primer número en la matriz es sobreimpulso base; este es el borde inferior de letras como 'O' que se sumergen por debajo de la línea de base. Y el valor más grande en la matriz será el sobregiros de altura de subida o sobreimpulso de altura de la tapa (el que sea mayor). Pero cualquier carácter individual puede trazarse sin tener en cuenta estos valores (por lo tanto, no hay garantía).

Por otro lado, el propio FontBBox puede reflejar el cuadro delimitador de cualquier carácter "especial" presente en la fuente, independientemente de si son accesibles a través del vector de codificación (es decir, no puede show, pero debe glyphshow ellos).

Así que la mejor opción sería tomar el pathbbox de una cadena de todos los caracteres que tiene la intención de utilizar. Esto ignoraría la contribución de cualquier otro personaje que pueda estar presente pero que sea irrelevante para su propósito. Y no se olvide de flattenpath para eliminar los puntos de control de las curvas (que pueden estar muy lejos del cuadro delimitador "real").

4

luser La respuesta de droog parece bastante completa y sin duda más sólida que la mía, pero no estaba satisfecho de que fuera la forma más simple de determinar un espacio vertical utilizable para una fuente estándar que me permitiera crear un newline viable.esto es lo que ocurrió:

%!ps-nonconforming 
/inch {72 mul} bind def 
/Helvetica 10 selectfont 
1 inch 10 inch moveto 
/fontheight currentfont dup /FontBBox get dup 3 get % top 
exch 1 get sub % top - bottom 
exch /FontMatrix get 3 get mul def % adjusted by height multiplier 
/lineheight fontheight 1.2 mul def % add 20% for line spacing 
/newline {0 lineheight neg rmoveto} bind def % negate height to move downwards 
gsave (lineheight:) show lineheight 20 string cvs show grestore 
newline gsave (that worked!) show grestore 
showpage 

resultado de ejecutar con gs test.ps:

ghostscript rendering of test.ps


un día más tarde, mirando a esto otra vez, y se dio cuenta el PO quería tratar ascendentes y descendentes por separado. así que aquí tiene una ilustración de simplemente utilizando los trazos descendentes:

%!ps-nonconforming 
/inch {72 mul} bind def 
/Helvetica 30 selectfont 
1 inch 2 inch moveto 
/descender currentfont dup /FontBBox get 1 get % bottom (negative number!) 
exch /FontMatrix get 3 get mul def % adjusted by height multiplier 
% first draw a gray line at base of text 
gsave 7.5 inch 0 rlineto 0.5 setgray stroke grestore 
gsave (descender:) show descender 20 string cvs show (pixels) show grestore 
gsave 0 descender 1 sub rmoveto % one pixel below lowest descender 
7.5 inch 0 rlineto 0 setgray stroke grestore 
showpage 

y el resultado de gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps: line under lowest descender

Cuestiones relacionadas