배경
컴퓨터에서 글자(폰트)를 표현하기 위해서는 크게 비트맵(Bitmap), 벡터(Vector)형식이 있습니다.
비트맵은 픽셀의 집합으로 구성되며 벡터는 점과 점사이 선에 규칙으로 수학적으로 표현됩니다.
True Type Font는 1980년대 후반 Apple과 마이크로소프트에 의해 개발된 2차 베지에 곡선을 사용한 글씨체 외곽선 표준(outline font standard)으로, macOS, Windows 등의 운영체제에서 글꼴(font)를 정의, 저장하는 가장 표준적인 방법입니다.
https://developer.apple.com/fonts/TrueType-Reference-Manual
대표적으로 Helvetica, Times Roman이 있습니다.
현재는 True Type에서 파생된 OpenType(3차 베지에 곡선)기반의 폰트들을 주로 사용되지만 여전히 무료 글꼴, 저렴한 3rd party 기반 글꼴 등에서 꾸준히 사용되고 있습니다.
True Type Font 구조
True Type Font 파일에는 컴퓨터 화면에서 각각의 문자(glyph) 혹은 문자들을 그리는 방법이 저장되어 있습니다.
각 문자의 외곽선은 직선(1차 베지에 곡선)과 2차 배지에 곡선들의 집합으로 정의되며 TTF 파일에는 글자의 외곽선을 이루는 베지에 곡선들의 제어점들이 저장되어 있습니다. 또한 여러 문자들을 같이 표기할 때, 가로쓰기 / 세로쓰기 시 문자들 간의 간격, 문자의 줄 안에서의 위치, 크기 등 문자를 디지털로 출력하기 위한 정보도 포함되어 있습니다.
이러한 정보들은 이진 데이터의 테이블 형태로 저장되고, 각 테이블의 tag와 위치(offset)을 저장한 테이블이 파일 앞부분에 위치합니다.
간략화된 True Type font 프린터 만들기
간략화된 True Type font 파일에서 0~9, A~Z, a~z의 외곽선 정보를 읽어서, 입력에 따라 font를 그려주는 프로그램 만들기
간략화된 True Type font파일은 문자의 총 개수 NumGlyph, 문자가 표현될 크기 BBox, 문자에 선 개수(A의 경우 외곽선 1, 내부 삼각형 1 총 2개), 외곽선 내 점과 선에 정보로 이루어져 있습니다.
1. 주어진 파일에 폰트 구조 데이터 정리
struct FontData{
vector<float> BBox;
int NumContours = 0;
vector<pair<int, vector<float>>> Contours[4]; // [contour]{type, [x0, y0, x1, y1 ...]} type(degree) 2 = Line, 3 = Curve
};
2. 1차, 2차 베지에 곡선 그리기
void Draw1Bezier(float x1, float y1, float x2, float y2)
{
glBegin(GL_LINE_STRIP);
for (float t = 0; t <= 1.0; t += 0.01f)
{
float x = (1 - t) * x1 + t * x2;
float y = (1 - t) * y1 + t * y2;
glVertex2f(x, y);
}
glEnd();
}
void DrawCurve(float x1, float y1, float x2, float y2, float x3, float y3) // Draw 2 Bezier
{
glBegin(GL_LINE_STRIP);
{
for (float t = 0; t <= 1.0; t += 0.005f)
{
float x = (1 - t) * (1 - t) * x1 + 2 * (1 - t) * t * x2 + t * t * x3;
float y = (1 - t) * (1 - t) * y1 + 2 * (1 - t) * t * y2 + t * t * y3;
glVertex2f(x, y);
}
}
glEnd();
}
그리는거는 바로 넣어서 그려도 되고 버퍼에 넣어서 작업하는 것도 좋을 것 같습니다. 생각보다 간단
* 결과물
'강의 > 컴퓨터 그래픽스' 카테고리의 다른 글
Global Illumination (0) | 2024.05.08 |
---|---|
Texture Mapping (0) | 2024.05.05 |
Illumination Models & Shading (0) | 2024.04.04 |
Meshes (0) | 2024.04.02 |
Subdivision Curves and Surfaces (0) | 2024.04.01 |