brunch

You can make anything
by writing

C.S.Lewis

by Cylogic Jan 07. 2018

폰트 포맷. 1(비트맵 폰트)

폰트 포맷의 이해

폰트는 크게 비트맵과 아웃라인 폰트로 나누어진다.

또 잘게 나누어 bitmap은 bdf, fnt, run-length 등등으로 나누어지고, 아웃라인은 postscript, CID,  truetype,  opentype 등등 수많은 분류체계를 만들어 놓고 있다.

새로운 OS가 만들어지고 그 OS를 뒷받침하는 새로운 체계가 만들어지는 것이야 어쩔 수 없다 해도 이리저리 바뀌어지는 폰트 포맷으로 인하여 생기는 오류를 찾아나가는 것이 폰트 제작자의 고통의 하나임을 토로하는 바이다.


* 비트맵 폰트 : 격자로 된 글자 틀에 점을 찍어 글자를 그리고 그 점의 위치를 저장하여 글꼴을 표현하는 방식의 폰트

-- 점 하나하나가 적절한 크기로 화면, 인쇄물에 표현되어 글자의 모양을 나타내게 된다.

biatmap 으로 한글 "가구"를 디자인한 형태

위의 그림은 글자 "가구"를 가로 세로 8개의 격자에 점을 찍어 디자인한 형태이다. 고해상도 글자를 디자인하려면 격자가 64 X 64, 128 x 128과 같은 격자에 글자를 디자인하면 된다.


비트맵 폰트는 글자의 포맷이 단순하고 누구나 쉽게 글자를 만들 수 있기는 하지만 글자의 크기를 확대, 축소 하기는 어렵다. 만일 디자인된 글자를 단순히 2배 4배와 같이 키운다면 같은 위치의 점을 사방에 여러 개 찍는 방식으로 확대할 수는 있지만 사선으로 그려진 "ㅅ"과 같은 글자에서는 선이 계단처럼 층져서 보이게 되고, 1.5배로 확대 것과 같은 미세한 크기 조정은 계산에 따라 소수점 자리가 반올림되는 방식에 따라 선의 굵기가 달라지는 문제가 발생하여 미려한 글자 인쇄물을 생산해 낼 수 없다.


그러나 초창기 대부분의 화면 폰트, 워드프로세서 폰트 등은 모두 비트맵 폰트였다. 고 해상도 출력물을 위해서 아래 설명하는 run length 형식으로 저장된 글꼴이 사용되기도 하였다.


1. 비트맵(bitmap) 폰트 - raw data


위의 보기와 같은 글꼴 디자인을 저장한 폰트 파일을 단순한 raw data 형태로 저장한다면, "가"자의 경우


0x00

0x84

0x14

0x16

0x14

0x14

0x14

0x14

와 같은 8 byte가 저장된다.

1개 byte내부의 8bit 하나하나에 점의 위치를 기록하여 저장하는 형태이다.

따라서 1개의 8x8 글자의 경우 1개 바이트씩이 필요한 줄이 8줄이므로, 8 byte가 필요하고, 각 글자의 위치는 별도의 index 없이 글자의 코드값에 글자의 크기(8 byte)를 대응하여 글자 데이터를 가져올 수 있다.

동일한 방식으로 계산하면 64 x 64 글자의 경우 하나의 줄이 8개 byte이고 그 줄이 64개가 필요하므로 한 글자 표현에 512 byte가 필요하게 된다.


2. 비트맵(bitmap) 폰트 - run length


고해상도 글자를 만들게 되면 글자의 크기에 따라 폰트 파일의 크기가 기하급수적으로 늘어나게 된다.


한글 완성자 2,350자를 저장하려면

8x8 사이즈 글자의 경우 8 x 2350= 18,800

64x64 사이즈 글자의 경우 512 x 2350 = 1,203,200  

256x256 사이즈 글자의 경우 8192 x 2350 = 19,251,200 바이트가 필요하게 된다.


256 x 256이라고 하여도 300 dpi 프린터에서 있는 그대로 출력할 경우 겨우 2.54cm(1inch / 72 point)의 크기에도 미치지 못하는 글자 사이즈의 한글 저장에 19Mb의 저장 공간이 필요한 것이다.

물론 압축기술을 사용하여 처리하면 훨씬 작은 사이즈에 저장할 수 있겠지만 어찌 되었건 하나의 사이즈를 표현하기 위하여 이러한 글자 파일을 별도로 저장하여 사용한다는 것은 하드디스크 및 메모리의 낭비였다.


그래서 나온 기법이 run length 저장 기법이다. 이 기법은 단순히 파일의 크기만을 줄여 주는 것이 아니라 약간의 확대, 축소에서도 출력물의 질을 일부 유지시켜주는 기능을 가지고 있다.


이 방식은 각 점의 위치를 별도로 저장하는 것이 아니라, 연속성이 있는 점이 있을 경우 그 시작점과 끝점, 또는 시작점과 길이 만을 저장하는 형태이다. 공백이 있는 라인의 경우는 데이터를 별도로 저장하지 않아도 된다.

위의 "가" 글자를 표현한다면,


2,2,3 (두 번째 줄, 두 번째 박스부터 3의 길이를 가지는 데이터)

2,6,1 (두 번째 줄, 여섯째 박스부터 1의 길이를 가지는 데이터)

3,4,1

3,6,1

4,4,1

4,6,2

5,4,1

5,6,1

6,4,1

6,6,1

7,4,1

7,6,1

8,4,1

8,6,1


위와 같이 표현된다. 이 자료만 봐서는 raw data 포맷보다 사이즈가 더 크다. 그러나 이러한 글자의 사이즈가 256x256의 사이즈를 가진다면 훨씬 적은 데이터로 글꼴 데이터를 저장하는 폰트를 만들 수 있다.

또한 길이와 좌표 데이터를 가지고 있으므로 글자의 확대 또는 축소에 따라 좌표와 길이에 적절한 곱셈을 하여 줄의 길이를 변경할 수 있다. 물론 축소의 경우보다 확대의 경우에는 더 많은 계산이 필요하고 효과는 높지 않다.


비트맵 폰트 기술은 이미 더 이상 사용되지 않는 기술이므로 이 정도의 설명으로 마무리하려고 한다.


그러나 아직도 소형 디지털 디바이스의 화면 폰트에서나, 지하철 전광판 등의 폰트는 비트맵 형식이 사용되고 있으며 그 글자의 디스플레이가 더 선명하고 효과적이라고 할 수 있다.


(2편에 계속)

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari