아래아한글 1.x의 화면용 폰트 출력하기

이 프로그램은 아래아한글 1.5x가 사용하던 화면용 한글 비트맵 글꼴(확장자가 SFT)을 읽어서 한글을 화면에다 찍어 줍니다.

과거부터 컴퓨터에서 한글을 출력하기 위해 많은 사람들이 애썼습니다. 특히 도스 시절에는 초성 8벌, 중성 4벌, 종성 4벌로 구성된 일명 “한글 도깨비” 형 11520바이트짜리 비트맵 글꼴이 크게 대중화하여 널리 쓰였고, 제가 개발한 날개셋 한글 입력기 역시 이 글꼴을 사용하고 있습니다. 이 정도 크기의 조합 규칙은 출판용으로 쓰기에는 부족했지만 16*16 정도의 화면용으로는 봐 줄만 했습니다.

글꼴 디자이너는 각 용도별로 쓰이는 자소의 형태는 고칠 수 있지만, 위와 같은 조합 방식이라는 큰 틀 자체는 고칠 수 없었습니다.

하지만 아래아한글은 매 글자를 일일이 그리지 않고도 한글을 더 미려하게 표현하기 위한 시도를 그 열악한 도스 시절부터 했습니다. 한글 글꼴은 자체적으로 조합 테이블을 내장하여, 각 자소의 자형뿐만 아니라 자소를 조합하는 방식도 글꼴 파일이 지정할 수 있게 한 것입니다.

(...) 아래아한글 1.3L에서부터 폰트 파일의 포맷이 바뀌기 시작했다. 영문 폰트는 그대로였지만 한글 폰트의 내용이 바뀌었다. (…) 그렇게 나뉜 폰트 파일의 헤더에는 그 폰트의 조합 테이블이 담겼다. 따라서 이 조합 테이블을 바꾸면 각 폰트에 적당한 폰트 조합 규칙을 적용할 수 있었다.

조합 테이블은 보통 3차원 조합 테이블이라고 불리는데, 테이블이 말 그대로 3차원 배열로 되어 있고, 또 그 난해성을 나타내는 뉘앙스로 3차원 조합 테이블이라고 칭해졌다. 이 조합 테이블에서부터 ‘벌’이라는 것이 사라졌다. 대신 그룹이라는 것이 등장했다.

물론 이 그룹은 벌과는 전혀 다른 개념이다. 초성, 중성, 종성별로 비슷한 특징을 가지는 폰트를 하나로 묶는 것이 이 그룹이다. 예를 들어 한글 글꼴의 ㄱ과 ㅋ은 여러 가지 점에서 비슷한 특징을 가진다. 전체 글자 폰트에 낱자 폰트에 조합되는 위치나 모양이 상당히 유사하다. 따라서 이 두 개의 폰트를 같은 그룹으로 결정하는 것이 보통이다.

이런 식으로 분리한 각 그룹에 대해 조합 시 어떤 낱자를 고르는지를 3차원 조합 테이블이 포함하고 있다. 각 폰트에 대해서 그룹을 나누는 것도 달라질 수 있으므로 이를 잘 이용하기만 하면 조합형 폰트로도 완성형 폰트와 거의 유사한 만큼의 아름다운 문서를 얻을 수 있는 것이다.

그 구체적인 내용은 난해하고 복잡하므로 생략하겠다. 폰트를 디자인하는 입장에서 보았을 경우에도 3차원 조합 테이블을 염두에 두고 폰트를 만든다는 것은 정말 쉬운 일이 아니기 때문에 여기서 폰트 테이블을 상세히 설명하는 것은 큰 의미를 갖지 못할 것이다. 필자의 견해로는 이 3차원 조합 테이블을 비전문가도 쉽게 이용할 수 있도록 해 주는 적당한 보조 프로그램이 나오기 전에는 널리 활용되기 어렵지 않을까 생각한다.

여하튼 1.3L의 폰트에서부터 각 폰트 파일은 고유의 조합 규칙을 독립적으로 내부에 포함하고 있었다. 필자가 만든 아래아한글 1.5의 필기체도 이 조합 테이블을 이용한 조합형 폰트이다. (...)

-- <월간 한글과컴퓨터> 1993년 12월호 특집 제 2부, <한글 폰트 심층 분석> (강 형석, 한글과 컴퓨터 개발 1실) 중에서
(☞ 아래아한글의 필기체 개발과 얽힌 흥미로운 에피소드도 있습니다.)

아래아한글 1.x는 FED.EXE라고 간단한 비트맵 글꼴 편집기를 제공하고 있었습니다. 하지만 한글 글꼴 파일 포맷이 바뀌면서 이제 이 파일들은 사용자가 곧장 고칠 수가 없게 되었으며, 사실 20년에 가까운 세월이 흐른 지금까지도 전문 글꼴 디자이너가 아닌 일반인들은 조합 테이블까지 고칠 수 있는 손쉽고 편리한 한글 글꼴 제작 프로그램은 거의 접하지도 못하고 있습니다.

예전의 ‘벌’이 하던 일을 3차원 조합 테이블은 모두 할 수 있으며, ‘벌’이 할 수 없는 훨씬 더 정교한 조합 규칙도 만들 수 있습니다. 즉, 후자가 더 큰 집합입니다. 가령 ‘한’과 ‘할’에서 ㅏ의 길이를 살짝 다르게 하는 것은 예전의 도깨비 8*4*4벌 글꼴로는 불가능하지만 아래아한글의 글꼴은 이를 구현하고 있습니다. 아래의 실행 결과를 참고하십시오. 날개셋 편집기의 ‘바탕’과 아래아한글의 ‘명조’는 언뜻 보기에는 거의 같지만 저런 데에서 차이가 있습니다.

아이디어는 이렇습니다. 현대 한글이 원래는 초성 19, 중성 21, 종성 27개씩인데 그룹으로 분류하여 소수의 덩어리로 줄입니다. 가령 아래아한글의 명조체는 내부적으로 초성 2(ㄱ과 ㅋ / 기타), 중성 11, 종성 3개(무받침 / ㄴ / 기타)의 그룹이 존재합니다. 그래서 어떤 한글의 각 성분이 어느 그룹에 속하냐에 따라 2*11*3 = 총 66개의 가짓수가 나오는데, 그 모든 경우에 대해 같은 ㄱ이라도 어떤 ㄱ을 쓰고 같은 ㅏ라도 어떤 모양을 쓸 것인지 세 성분별로 번호를 일일이 지정해 주는 것입니다. (소스 코드에서 gdata 배열 참고)

이것은 2350자를 일일이 그리는 것보다는 덜 고달프지만 조합 테이블 로직을 설계하고 가짓수를 일일이 따지는 것이 굉장히 복잡하고 힘든 작업입니다. 오늘날 한글 11172자를 모두 표현할 수 있는 한글 글꼴들은 내부적으로 다 이런 3차원 조합 테이블이라는 개념을 써서 만들어지며, 출판용 명조체 수준인 글꼴의 경우 한 초성 자소가 8개와는 비교가 되지 않는 무려 50~60가지가 되는 경우도 빈번하답니다.

이 프로그램은 순수하게 저 혼자 파일 포맷을 분석하여 작성하였습니다. 도스 시절에 이런 일을 저보다 먼저 한 사람이 있지는 않나 궁금합니다. 다행히 구조가 그렇게 복잡하고 까다롭지는 않았습니다.

소스 코드, 실행 파일, 글꼴 파일들 받기 (src20_hwp1sft.zip, 33K)


프로그램 실행 결과

압축 파일이 같이 들어있는 hanmy.sft (명조), hango.sft (고딕), hansm.sft (샘물), hanpl.sft (필기) 중 하나를 매개변수로 주고 프로그램을 실행한 후, 자형을 보고 싶은 한글을 한 글자씩 입력하여 엔터를 누르면 됩니다. 이 프로그램은 콘솔에서 텍스트 형태로 자형의 모습을 출력해 줍니다.

위의 두 글자는 명조체의 결과이며, 아래 두 글자는 필기체의 결과입니다.

? 한
. . . . . . . . . . . . . . . .
. . . . . . . . . . ####. . . .
. . . ####. . . . . . ####. . .
. . . . ####. . . . . ####. . .
. ##############. . . ####. . .
. . . ######. . . . . ##########
. . ####. ####. . . . ####. . .
. . ####. ####. . . . ####. . .
. . . ######. . . . . ####. . .
. . . . . . . . . . . ##. . . .
. . . . . ####. . . . . . . . .
. . . . . . ####. . . . . . . .
. . . . . . ####. . . . . . . .
. . . . . . ####. . . . ##. . .
. . . . . . . ##############. .
. . . . . . . . . . . . . . . .
? 할
. . . . . . . . . . . . . . . .
. . . . . . . . . . ####. . . .
. . . ####. . . . . . ####. . .
. . . . ####. . . . . ####. . .
. ##############. . . ####. . .
. . . ######. . . . . ##########
. . ####. ####. . . . ####. . .
. . ####. ####. . . . ####. . .
. . . ######. . . . . ##. . . .
. . . . . . . . . . . . . . . .
. . . . . ################. . .
. . . . . . . . . . . ##. . . .
. . . . . ##############. . . .
. . . . . ####. . . . . . . . .
. . . . . . ##############. . .
. . . . . . . . . . . . . . . .

? 똠
. . . . . . . . . . . . . . . .
. ########################. . .
. . ####. . . ####. . . . . . .
. . ####. . . ####. . . . . . .
. . ####. . . ####. . . ####. .
. . . ########. ########. . . .
. . . . . . . ####. . . . . . .
. . . . . . . ####. . . . . . .
. ############################.
. . . . . . . . . . . . . . . .
. . . . ####. . . ####. . . . .
. . . . ####. . ######. ##. . .
. . . . ####. ############. . .
. . . . . ######. . ####. . . .
. . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . .
? 깝
. . . . . . . . . . . . . . . .
. . . . . . . . . . . ####. . .
################. . . ####. . .
. . . ####. . ####. . ####. . .
. . . ####. . ####. . ##########
. . . ####. . ####. . ####. . .
. . ####. . ####. . . ####. . .
. . ####. . ####. . . ####. . .
. ####. . ####. . . . ####. . .
. . . . . . ####. . . . . . . .
. . . . . . ####. . . . ####. .
. . . . . . ####. ##########. .
. . . . . . ########. . ####. .
. . . . . . ####. ##########. .
. . . . . . . ####. ######. . .
. . . . . . . . . . . . . . . .