2011-11-28 14 views
5

Sto cercando il codice PostScript che stima l'altezza di un font PostScript (spazio per l'ascender) e la profondità (spazio per discensore). È possibile utilizzare il riquadro di delimitazione (FontBBox) per questo? `Come determinare l'altezza e la profondità di un font PostScript?

Ecco alcuni sfondi per la mia domanda: i glifi di un font sono posizionati su una linea di base. Ovviamente glifi con discendenti raggiungeranno la linea di base e voglio sapere fino a che punto i discensori della linea di base possono raggiungere in modo tale da fornire uno spazio sufficiente in un layout.

Ho visto PostScript code that renders a given string to check its dimension. Sono piuttosto interessato a una risposta generale per un determinato carattere.

risposta

7

Bene, hai già scoperto le due "scorciatoie". FontBBox dà il riquadro di delimitazione di tutti i glifi nel font sovrapposti insieme. false charpath flattenpath pathbbox indica la casella per una stringa specificata.

Per un tipo 3 (definito dall'utente), questo è tutto ciò che si può ragionevolmente aspettarsi di fare; ma per i tipi di carattere Type 1 più popolari, vi è una ricchezza di informazioni metriche sia nel che nel font e in un file "metriche" (per altre applicazioni).

Ma questa è la parte che non conosco molto bene. Quindi ho intenzione di leggere (nel manuale di Adobe Type 1) ed espandere questa risposta più tardi.

Modifica: In realtà, sembra che questi potrebbero essere i modi migliori in generale.

è un array di valori di allineamento verticale in un font Type 1, nel dizionario/Private, sotto il nome/BlueValues; ma non vi è alcuna garanzia che il carattere li onori. Il primo numero nell'array è il superamento della linea di base; questo è il bordo inferiore di lettere come 'O' che si abbassano sotto la linea di base. E il più grande valore dell'array sarà il superamento altezza ascensore o il limite cap-height (a seconda del valore più alto). Ma qualsiasi personaggio individuale può essere tracciato senza riguardo a questi valori (quindi, nessuna garanzia).

D'altra parte, il FontBBox in sé può riflettere il riquadro di delimitazione di eventuali caratteri "speciali" presenti nel font, anche se non sono accessibili attraverso il vettore di codifica (es. Non si possono show, ma deve glyphshow loro).

Quindi la soluzione migliore sarebbe probabilmente quella di prendere lo pathbbox di una stringa di tutti i caratteri che si intende utilizzare. Questo ignorerebbe il contributo di altri personaggi che potrebbero essere presenti ma non pertinenti al tuo scopo. E non dimenticare di flattenpath rimuovere i punti di controllo dalle curve (che potrebbero essere molto al di fuori del riquadro di delimitazione "reale").

4

La risposta del droog di luser sembra abbastanza completa e senza dubbio più robusta della mia, ma non ero soddisfatto che fosse il modo più semplice per determinare uno spazio verticale utilizzabile per un font standard che mi permettesse di creare un workable newline.ecco cosa mi si avvicinò con:

%!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 

risultato di correre con gs test.ps:

ghostscript rendering of test.ps


un giorno più tardi, guardando di nuovo, e si rese conto il PO voleva trattare ascendenti e discendenti separatamente. quindi ecco un esempio di usando solo i discendenti:

%!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 

e il risultato di gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps: line under lowest descender

Problemi correlati