TrueType 폰트를 구성하는 글자 하나하나를 Glyph(글립)이라한다.
글립을 나타내기 위해 TrueType 폰트는 외곽선(contour)의 함수를 이용하는데, Bezier Spline곡선이 이용된다. Bezier Spline은 연속된 Bezier Curve로 TrueType 폰트는 이와 같이 수학적 함수를 이용하여 폰트를 그리기 때문에 비트맵 폰트가 가지고 있는 약점(폰트의 크기를 변경할 때 계단현상이 발생한다)을 극복하고 매끄러운 글꼴을 화면이나 프린터에 인쇄할 수 있다.
TrueType 폰트에서 사용하는 Quadratic Bezier Curve의 함수식은 아래와 같다.
위의 함수식을 이용하여 아래와 같이 곡선이 그려진다.
Construction of a quadratic Bézier curve | Animation of a quadratic Bézier curve, t in [0,1] |
함수식에서 알 수 있듯이 Quadratic Bezier Curve는 두개의 끝 점과 하나의 컨트롤점으로 이루어진다. Bezier Spline은 이 곡선이 연속해서 이어져있는 모양이며 TrueType의 외곽선(Contour)은 Bezier Spline이 폐곡선을 이룬다.
아래 그림은 외곽선의 함수로 이루어진 TrueType 글꼴이 화면에 그려지는 과정을 보여준다.
손글씨를 TrueType 폰트로 만들기 위해서는 손으로 쓴 글씨의 외곽선을 추출한 후 외곽선을 표현할 수 있는 함수를 찾아야 하는데 이를 Curve Fitting이라 한다. Curve Fitting이 완료되면 TrueType 폰트의 Specification에서 정의한 Glyf Table의 형식에 맞게 글립 정보를 구성해주어야 한다.
TrueType Specification에서 정의하는 글립은 Simple형과 Composite형으로 구분할 수 있다.
Simple Glyph는 외곽선을 함수를 정의하는 포인트 만으로 구성되어 있는 글립을 의미한다. Composite형은 여러개의 Component로 구성되는데 각 Component는 Simple Glyph과 동등하다. Composite는 이미 정의된 Component를 재활용하여 Component의 조합으로 새로운 Glyph을 만들어낸다.
이번프로젝트에서 우리가 만들고자하는 글립은 영문자 알파벳과 숫자인데(Alphanumeric) Alphanumeric에선 Component형 글립을 만들만한 문자가 없다. 따라서 이번 프로젝트에서 만들어낸 글립은 모두 Simple형이다.
TrueType Specification에서 Simple Glyph를 위한 테이블은 아래와 같이 정의되어있다.
Simple과 Component형 모두 아래의 해더를 가진다.
Type |
Name |
Description |
SHORT |
numberOfContours |
If the number of contours is greater than or equal to zero, this is a single glyph; if negative, this is a composite glyph. |
FWord |
xMin |
Minimum x for coordinate data. |
FWord |
yMin |
Minimum y for coordinate data. |
FWord |
xMax |
Maximum x for coordinate data. |
FWord |
yMax |
Maximum y for coordinate data. |
Simple형은 위의 해더 아래에 다음의 테이블이 따라온다.
Type |
Name |
Description |
USHORT |
endPtsOfContours[n] |
Array of last points of each contour; n is the number of contours. |
USHORT |
instructionLength |
Total number of bytes for instructions. |
BYTE |
instructions[n] |
Array of instructions for each glyph; n is the number of instructions. |
BYTE |
flags[n] |
Array of flags for each coordinate in outline; n is the number of flags. |
BYTE or SHORT |
xCoordinates[ ] |
First coordinates relative to (0,0); others are relative to previous point. |
BYTE or SHORT |
yCoordinates[ ] |
First coordinates relative to (0,0); others are relative to previous point. |
flag필드를 구성하는 비트는 다음과 같은 의미를 가진다.
Flags |
Bit |
Description |
On Curve |
0 |
If set, the point is on the curve; otherwise, it is off the curve. |
x-Short Vector |
1 |
If set, the corresponding x-coordinate is 1 byte long, not 2. |
y-Short Vector |
2 |
If set, the corresponding y-coordinate is 1 byte long, not 2. |
Repeat |
3 |
If set, the next byte specifies the number of additional times this set of flags is to be repeated. In this way, the number of flags listed can be smaller than the number of points in a character. |
This x is same (Positive x-Short Vector) |
4 |
This flag has two meanings, depending on how the x-Short Vector flag is set. If x-Short Vector is set, this bit describes the sign of the value, with 1 equalling positive and 0 negative. If the x-Short Vector bit is not set and this bit is set, then the current x-coordinate is the same as the previous x-coordinate. If the x-Short Vector bit is not set and this bit is also not set, the current x-coordinate is a signed 16-bit delta vector. |
This y is same (Positive y-Short Vector) |
5 |
This flag has two meanings, depending on how the y-Short Vector flag is set. If y-Short Vector is set, this bit describes the sign of the value, with 1 equalling positive and 0 negative. If the y-Short Vector bit is not set and this bit is set, then the current y-coordinate is the same as the previous y-coordinate. If the y-Short Vector bit is not set and this bit is also not set, the current y-coordinate is a signed 16-bit delta vector. |
Reserved |
6 |
This bit is reserved. Set it to zero. |
Reserved |
7 |
This bit is reserved. Set it to zero. |
아래 그림은 손글씨의 외곽선을 추출하여 일정한 간격으로 샘플링하여 만든 글립의 모양이다. 아직 curve fitting은 완료되지 않았지만 글자의 모양이 잘 나타나고 있는것을 볼 수 있다.
'SSM > 손글씨A2Z' 카테고리의 다른 글
Introduction to Handwritten font A2Z (0) | 2008.12.31 |
---|