회사에서 일을 하다보니 폰트하고 마주치는 경우가 많이 있더군요. 마주치다보니 폰트란 놈이 꽤 복잡하게 구성되어 있는 것을 알게 되었습니다. 처음에는 무작정 부딪쳤으나 자세히 알지 않으면 안되겠길래 MS의 The TrueType instruction set(http://www.microsoft.com/typography/OTSPEC/ttinst.htm)을 번역하여 조금씩 올리려고 합니다. 컴쟁이들이 일반적으로 쓰는 용어는 그대로 번역없이 한글로 ^^;; 표기 하였습니다. 번역에 문제가 있거나 이상한 부분 있으면 말씀해주세요.
The TrueType instruction set
트루타입 글자가 화면에 그려질 때, 폰트는 폰트파일 안의 명령어들을 사용하여 여러 힌트를 넌지시 알려줍니다. 트루타입 명령어 셑은 Glyph 외곽에 대하여 전체 또는 특정 크기와 해상도를 통제할 수 있는 강력한 수단을 제공합니다. 명령어들은 화면의 해상도에서 읽기 쉽게 보여지는 것이 가장 중요한 문제입니다 다음의 문서들은 트루타입 명령어 셑과 힌트들에 상세하게 다루고 있습니다.
Instruction Glyphs
이 챕터는 Glyph 명령과 관련된 기본적인 작업을 전체적으로 살펴봅니다.
Choosing a scan conversion setting
트루타입 폰트 명령어에서 내릴 수 있는 하나의 결정사안은 스캔 변환 모드(Scan conversion mode)를 선택하는 것입니다. 폰트 디자이너들은 빠른 스캔 변환 모드(fast scan conversion mode)와 드롭아웃 컨트롤 스캔 변환 모드(dropout control scan conversion mode) 사이에서 선택할 수 있습니다. 이 선택은 Graphics State의 scan_control 변수를 설정함으로 이루어집니다. 인터프리터는 드롭아웃 컨트롤 모드가 사용될지를 결정하기 전에 세가지 조건을 고려합니다.
- Glyph이 회전하였는가?
- Glyph이 늘여져(stretched)있는가?
- 현제 설정되?있는 ppem이 특정 ppem 값보다 작은가?
드롭아웃 컨트롤 모드를 완전히 꺼버리는 것 또한 가능합니다.
Controlling ronding
트루타입 인터프리터는 어떠한 값이 라운딩(rounded, 반올림?원형?둥글게? 이하 라운딩 ^^)될지 결정하기 위해서 round_state를 사용합니다. 명령어들은 Graphcis State 변수의 round_state의 값을 사용하여 이를 결정합니다. round_state의 설정은 인터프리터에서 어떻게 라운딩되야할 지를 결정해줍니다.명령어 셑은 미리 정의되어 있는 원형 상태를 grid, pixel centers(half grid)또는 grid 또는 pixel centers 모두에 대하여 라운딩하기 쉽게 만들어져 있습니다. 또한 반올림을 하거나 반내림을 하는 것도 모두 가능하게 되어 있습니다. 만약 미리 정의된 충분한 반올림 옵션이 없는 경우에는 라운딩 메소드(rounding method)에서 면, 경계, 끝의 선택이 가능하게하거나 매우 정확하게 값을 라운딩 값을 처리할 수 있는 SROUND 명령이 제공됩니다. S45ROUND는 SROUND처럼 동일하게 정확한 설정을 허락합니다만 x-y 평면에서 45도 각도의 움직임만을 사용할 수 있게 되어 있습니다.
다수의 명령어들이 특정 지점으로 움직이기 전에 그들이 얻은 값들에 대해서 라운딩합니다.
MDRP, MIRP, MIAP, MDAP, ROUND 등 어떠한 명령어를 사용하더라도 그 효과는 control_value_cut_in과 함께 Graphcis state의 round_state 값에 의하여 영향을 받습니다. ROFF 명령은 라운딩을 끌 수 있으나 명령어가 삽입된 값에 대하여 계속하여 살펴보는 것을 허락합니다.
Points
점의 외곽선은 좌표 그리드에서의 그들의 위치와 커브 포인트(curve points)가 켜지거나 꺼져있는 여부에 따라서 명세됩니다. 점을 다루는 것은 그것의 공간 상에서의 위치와 커브 포인트의 상태를 다루는 것을 의미합니다. 인터프리터는 현재 Glyph을 구성하고 있는 점들의 집합을 다루거나 집합안에 특정 점들을 언급하기 위해서 zones와 레퍼런스를 사용합니다.
Zones
모든 점 폰트 스케일러 인터프리터 참조(Any point the font scaler interpreter references)들은 잠재적으로 Glyph 서술을 만드는 집합인 두 개의 zone 중 한 곳에 있습니다. 이러한 참조되는 점들 중 하나는 zone1(Z1)입니다. Z1에서는 항상 현재 인터프리트되고 있는 Glyph을 가지고 있습니다.
두번째는 zone 0(Z0)라고 부르며 zone1의 어떠한 glyph 안의 실제 점들에 대응하지 못하는 점의 좌표를 일시적으로 저장하기 위해서 사용됩니다. Zone 0는 glyph에 존재하지 않는 점을 생성해야할 필요가 있을 때 또는 만약 임시의 점의 좌표를 기억하고 있을 필요가 있을 때 유용합니다. zone0의 점은 MIAP와 MIRP 명령에 의하여 유용한 점들로 옮겨지고, gep0에서 Z0 포인트로 셑팅됩니다. 때때로, Z0에서 폰트를 위한 key metric positions로 설정하는데 유용할 수 있습니다.
Zone pointers
세 개의 zone 포인터들인 gep0, gep1, gep2는 znoe0 또는 zone1을 레퍼런스하는데 사용됩니다. 초기에는 모든 세 개의 점들이 zone1을 가리킵니다.
Reference points
Zone 포인터들은 점들을 접근하는데 사용된다. 레퍼런스 점들은 그룹내의 특정 점들에 대한 접근을 제공합니다. 인터프리터는 세 개의 번호가 붙여진 레퍼런스 점들을 사용합니다: rp0, rp1, 그리고 rp2. 각각은 zone1의 어떠한 glyph의 외곽 점들 중 하나이거나 zone0 안의 어떠한 점의 값으로 설정될 수 있습니다.
다음의 Figure 2-2에서처럼, 두 개의 레퍼런스 점들이 동일한 외곽 점을 나타낼 수도 있습니다.
총괄하여 zone 포인터들과 레퍼런스 점들은 Graphics State에 속합니다. 이들 값들은 명령어들을 사용하여 변경될 수 있습니다. 많은 TrueType 명령어들은 그들의 동작을 상세히 설명하기 위해서 zone 포인터들과 레퍼런스 점들에 의존합니다.
Phantom points
마이크로소프트의 rasterizer v1.7 또는 이 후의 버전은 폭과 높이를 통제하기 위해서 glyph의 모든 선들의 끝인 네 개의 “유령 점들(phantom point)을 추가하였습니다.
만약 glyph의 외형 전체를 나타내는데 “n”개의 점들이 필요하다면(이 경우, 외형 점들의 숫자는 0부터 n-1이 사용됩니다.), scaler는 n, n+1, n+2, n+3의 점들을 더할 것입니다. 점 “n”에는 문자의 시작점이 위치할 것이고, 점 “n+1”에는 앞쪽 폭(advanced width)의 점이, 점 “n+2”에는 꼭대기의 시작점이, 점 “n+3”에는 앞쪽 높이(advanced height) 점이 위치할 것입니다. Figure2-1과 2-2 그림을 통해서 살펴보면 2-1에서는 (17, 18, 19, 20)이 2-2에서는 (27, 28, 29, 30)이 여기에 해당합니다.
모든 네 개의 점들은 glyph 명령인 side bearing, advance width, advance height에 동반하여 생기는 TrueType 명령어들에 제어됩니다. side bearing과 advance width, advance height들은 이러한 유령 점들을 사용하여 계산됩니다. 그리고 이들은 디바이스의 특징에 의해서 glyph에 따른 폭과 넓이가 grid에 적합한 결과로 반영되기 때문에 디바이스 의존적인 폭과 넓이라 불립니다. 디바이스 의존적인 폭과 넓이들은 유령 점들에 적용된 명령어에 따라 다르거나 똑같을 수 있습니다.
유령 점인 n +2나 n+3과 관련되어 있는 높이를 계산하는 TrueType 명령어들을 사용하기 전에는 GETINFO[]를 사용하여 rasterizer가 MS rasterizer v1.7이상의 버전인지를 체크해야 합니다.
댓글 없음:
댓글 쓰기