2011-11-28 4 views
5

포스트 스크립트 글꼴의 높이 (오름차순 공간)와 깊이 (디 센더의 공간)를 예상하는 포스트 스크립트 코드를 찾고 있습니다. 글꼴의 테두리 상자 (FontBBox)를이 용도로 사용할 수 있습니까? '포스트 스크립트 글꼴의 높이와 깊이를 결정하는 방법?

다음은 내 질문에 대한 배경 지식입니다. 글꼴의 글리프가 기준선에 있습니다. 분명히 디 센더가있는 글리프는 기준선 아래에 도달 할 것이며 레이아웃에서 충분한 공간을 제공 할 수 있도록 기준 디 센더가 얼마나 아래에 도달 할 수 있는지 알고 싶습니다.

나는 PostScript code that renders a given string to check its dimension을 보았습니다. 오히려 주어진 글꼴에 대한 일반적인 대답에 관심이 있습니다.

답변

7

글쎄, 이미 두 개의 "바로 가기"를 발견했습니다. FontBBox는 글꼴의 모든 글리프 경계 상자를 함께 겹쳐서 표시합니다. false charpath flattenpath pathbbox은 지정된 문자열에 대한 상자를 제공합니다.

유형 3 (사용자 정의) 글꼴의 경우 이것은 예상 할 수있는 모든 것입니다. 하지만 더 많이 사용되는 유형 1 글꼴의 경우 글꼴과 "메트릭"파일 (다른 응용 프로그램의 경우)이라는 두 가지 통계 정보가 있습니다.

그러나 이것은 내가 잘 모르는 부분입니다. 그래서 나는 (Adobe Type 1 매뉴얼에서) 읽을 것이고 나중에이 대답을 확장 할 것입니다.

편집 : 사실, 이것이 일반적으로 가장 좋은 방법 일 수 있습니다.

여기에 /Private 사전의 유형 1 글꼴에서/BlueValues라는 이름으로 세로 맞춤 값 배열입니다. 그러나 그 글꼴이 그들을 보증한다는 보장은 없습니다. 배열의 첫 번째 숫자는 베이스 오버 슈트입니다. 이것은 기준선 아래로 내려가는 'O'와 같은 글자의 아래쪽 가장자리입니다. 그리고 배열의 가장 큰 값은 어 센더 높이 오버 슈트 또는 캡 높이 오버 슈트 (둘 중 더 높은 것) 중 하나입니다. 그러나 어떤 개인적인 특성든지이 가치에 관계없이 음모를 꾸미지도 모른다 (그러므로, 보증 없음).

반면에 FontBBox 자체는 인코딩 벡터를 통해 액세스 할 수 있는지 여부에 상관없이 글꼴에있는 "특수"문자의 경계 상자를 반영 할 수 있습니다 (즉, show은 아니지만 그 (것)들은 glyphshow이어야한다).

따라서 가장 좋은 방법은 사용하려는 모든 문자로 구성된 pathbbox 문자열을 사용하는 것입니다. 이것은 존재할 수도 있지만 당신의 목적과 무관 한 다른 모든 문자의 기여도를 무시할 것입니다. flattenpath을 잊어 버리지 말고 커브 ("실제"테두리 상자 바깥에있을 수 있음)에서 제어점을 제거하십시오.

4

luser droog의 대답은 상당히 완벽하고 의심 할 여지없이 확실한 것처럼 보입니다.하지만 표준 글꼴에 사용할 수있는 수직 공간을 결정하는 가장 간단한 방법이라고 생각하지 않아 newline을 만들 수있었습니다.

ghostscript rendering of test.ps


하루 후, 다시보고, 그리고하면 영업 이익은 치료 싶어 실현 : gs test.ps과 실행의

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

결과 : 여기에 내가 생각 해낸 것입니다 상승 기와 하강 기는 분리되어있다.

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

gs -sDEVICE=pnggray -g640x480 -o/tmp/descender.png descender.ps의 결과 : line under lowest descender

그래서 여기에 단지 사용하여 센더의 그림입니다
관련 문제