함초롬체에 옛한글 GSUB/GPOS 넣기

김도현의 이미지

한국텍학회/한글텍사용자그룹에서 한글과컴퓨터가 최근 공개한 함초롬체에 옛한글 GSUB/GPOS 테이블을 넣는 방법을 공개하였습니다. 이 글꼴의 라이선스가 완전히 명확한 것은 아니어서 수정된 글꼴 자체를 배포하는 대신에 우선 수정 방법을 공개한 것입니다. 다음 링크를 참조하세요.

http://www.ktug.or.kr/xe/?mid=KTUG_open_board&document_srl=7947

XeTeX, 오픈오피스, 맥의 TextEdit, 윈도즈의 MS 워드, 메모장 따위에서 미려한 옛한글을 사용할 수 있다고 합니다.

또한 일반적으로 GSUB/GPOS가 잘 작동하는지는 fontmatrix라는 어플에서 테스트할 수 있습니다.

문제는 리눅스 시스템상에서 일반적으로 동작하게 하는 건데요. 최근 pango 2.8이 릴리스되었습니다. 소스를 들여다보니 harfbuzz-ng가 포함되어 있어 오픈타입 레이아웃을 이미 지원하고 있더군요. 하지만 여전히 옛한글 GSUB은 작동하지 않고 있습니다. 이를 가능하게 하려면 소스의 어디를 고쳐야 하는지요? 그리 힘들 것 같지는 않은데 제가 프로그래밍에 문외한인지라 질답게시판은 아니지만 여쭤봅니다.

File attachments: 
첨부파일 크기
Image icon hcrgsubgpos.png48.76 KB
wkpark의 이미지

예전에 JN님(전병식님)이 GSUB패치를 만드셨던 것 같은데 unfonts-devel 메일링리스트에서 그 내용을 볼 수가 없겠네요....

제 하드디스크 어딘가에도 그 패치가 숨어있을 것 같은데;;

아무튼 수고하셨습니다~

한컴에서도 함초롬 글꼴 개발 2년여동안 하지 못한 일을 해버리셨네요 :)

스크린샷도 올려주시면 옛한글에 관심있는 많은 분들이 이 사실을 제대로 알게 될 것으로 생각됩니다~

온갖 참된 삶은 만남이다 --Martin Buber

김도현의 이미지

감사합니다. XeTeX을 이용한 사례를 첨부하였습니다.

오픈소스 오픈타입 레이아웃 엔진은 ICU와 Harfbuzz가 대표적인데, ICU 쪽은 좀 보수적인 경향이 있는 거 같아 앞으로 Harfbuzz에 기대를 걸어보려 합니다. XeTeX 개발자이자 Mozilla 개발자인 Jonathan Kew가 참여하고 있기도 하구요. Firefox 다음 버전에서는 CSS를 이용한 오픈타입 피쳐 선택이 가능하게 된다는 소문도 있습니다.

혹시 마지만 부분에 대해 궁금하신 분이 계실까 해서 링크를 첨가합니다.
http://hacks.mozilla.org/2009/10/font-control-for-designers/

김도현의 이미지

pango 옛한글 패치를 구글 검색으로 찾았습니다.

http://bbs.ktug.or.kr/jsboard/read.php?table=contrib&no=4764

그러나, 너무 오래된 패치라서 최신 pango 1.28에는 적용이 안 되는군요 :(

wkpark의 이미지

패치가 섞여있는건데

핵심은 feature를 켜는 것이였습니다. 그 나머지는 module/hangul/hangul-fc.c에 대한 패치인데, 방점 glyph가 없을 때를 판별 가짜 방점(?)이 아닌 진짜 방점 붙이는 부분으로 기억합니다..

feature 켜는 부분은 꽤 간단해서... 아래와 같은 부분이 그 패치인 것으로 생각됩니다.

+static const PangoOTFeatureMap gsub_features[] = {
+ {"ccmp", PANGO_OT_ALL_GLYPHS},
+ {"pdch", PANGO_OT_ALL_GLYPHS},
+ {"ljmo", PANGO_OT_ALL_GLYPHS},
+ {"vjmo", PANGO_OT_ALL_GLYPHS},
+ {"tjmo", PANGO_OT_ALL_GLYPHS}
+};
+
+static const PangoOTFeatureMap vertical_gsub_features[] = {
+ {"vert", PANGO_OT_ALL_GLYPHS},
+ {"ccmp", PANGO_OT_ALL_GLYPHS},
+ {"pdch", PANGO_OT_ALL_GLYPHS},
+ {"ljmo", PANGO_OT_ALL_GLYPHS},
+ {"vjmo", PANGO_OT_ALL_GLYPHS},
+ {"tjmo", PANGO_OT_ALL_GLYPHS}
+};
+

온갖 참된 삶은 만남이다 --Martin Buber

wkpark의 이미지

tone mark 처리 부분은 추가하지 않은 채 gsub만 적용되도록 한 패치입니다.
예전 패치를 거의 그대로 가져온 것입니다. (tone mark 처리 제외)

댓글 첨부 파일: 
첨부파일 크기
파일 gsub.patch3.85 KB

온갖 참된 삶은 만남이다 --Martin Buber

김도현의 이미지

고맙습니다.
잘 아시겠지만 pdch는 표준이 아니므로 빼버려야 할 것입니다.
또 세로쓰기에서 vert는 obsolete 되었고 vrt2에 의하여 대체되었습니다.
옛날 폰트를 위해 vert를 남겨두더라도 vrt2가 없을 때만 예외적으로 사용돼야 합니다.

그건 그렇고...
올려주신 패치를 적용해서 컴파일하는 데까진 문제가 없었으나 원하는 결과를 얻지 못했습니다.
제가 뭘 잘못한 건지... 쩝.
pango-view --text='가나다ᄒᆞᆫ라마바' --font='HCR Batang 48' --language=ko
해도 U+1100 자소로만 표시되고 있네요. 저만 그런 건지 궁금합니다.

wkpark의 이미지

테스트해 안해보고 컴파일 잘 되길래 패치 올렸던 것이구요. 방금 gedit로 은바탕/함초롬바탕으로 테스트해보니 잘 되는군요.

pango-view로 해도 잘 됩니다.

Fedora 11 / pango-1.24.5-1 + pango 최신 + patch된 hangul-fc.so (모듈만 복사함)

댓글 첨부 파일: 
첨부파일 크기
Image icon gedit-hcr.png32 KB
Image icon hcr-pangoview.png12.33 KB

온갖 참된 삶은 만남이다 --Martin Buber

wkpark의 이미지

원래 JN님의 패치를 pango trunk에 거의 그대로 적용한 패치입니다.

댓글 첨부 파일: 
첨부파일 크기
파일 pango-gsub-20100403.patch10.64 KB

온갖 참된 삶은 만남이다 --Martin Buber

김도현의 이미지

아무래도 최근 pango 내부에 무언가 큰 변화가 있었던 것 같습니다.

저로선 pango 1.26과 1.28 두 경우 다, ccmp까지만 적용된 것이 보일 뿐 ljmo, vjmo, tjmo는 먹지 않고 있네요.

마침 제게 오래된 기계가 하나 있고 pango 1.20이 깔려 있길래, 여기다 JN님 패치를 적용해서 테스트해봤더니 비로소 잘 되는 것을 확인할 수 있었습니다.

어쩌면 pango 레이아웃 엔진이 몇 달 전에 harfbuzz에서 harfbuzz-ng로 교체된 것과 관련이 있을지도 모르겠습니다.

이 문제의 원인을 밝혀내지 않고서는 pango측에 패치를 보내기 곤란할 것 같군요...

wkpark의 이미지

1.26 1.28이라고 해도 minor 버전 업데이트 수준같은데 그런 큰 변화가 있었을지 싶군요.

$ strace pango-view 어쩌고 2> log

명령으로 실행해보시면 한글 pango모듈이 제대로 적재되고 있는 지 확인하실 수 있습니다.

예를 들어서 pango/tests 디렉토리에서 pango-view를 실행하니 그 디렉토리에 있는 pangorc파일을 읽으면서

------
...
open("...생략.../pango.my/modules/./hangul/.libs/pango-hangul-fc.so", O_RDONLY) = 4
...
------
과 같이 pango-hangul-fc.so 파일이 제대로 로딩되는 것을 알 수 있습니다.

그리고 일부러 한글 모듈을 제거하거나, 모듈 path를 엉뚱한 위치로 돌린 다음에 pango-view로 테스트해보니 ccmp는 기본으로 항상 적용이 되는군요.

$ strace pango-view --text='ᄀᄀ 사ᄅᆞᆷ마다' --font='HCR Batang 48' --language=ko 2>log

댓글 첨부 파일: 
첨부파일 크기
Image icon pango-err.png9.67 KB

온갖 참된 삶은 만남이다 --Martin Buber

김도현의 이미지

말씀하신 문제는 아닙니다. pango-hangul-fc.so는 분명 읽혀지고 있습니다.

어쨌든 이번엔 1.24.5 버전을 다운받아 시도해봤는데 GSUB이 제대로 적용된 것을 확인하였습니다. 그러나 1.26은 제대로 되지 않습니다. 따라서 pango 1.24에서 1.26 사이에 무슨 변화가 생겼음이 분명합니다. 아니면 단순히 버그가 끼여들어갔을 가능성도 있습니다.

wkpark의 이미지

그렇군요. LD_LIBRARY_PATH를 라이브러리 패스 지정해서 trunk버전을 돌려보니 아무런 오류도 나오지 않고 정상적으로 라이브러리가 로딩되는데도 원하는 결과가 안나오네요.
arabic이나 thai 언어는 *-lang.c 파일이 있는데 한국어는 없는데 이것과 관련된 것일지도..

하지만 로그를 추적해보면 arabic-lang.c는 꽤 오래전에 추가된 것이군요...

온갖 참된 삶은 만남이다 --Martin Buber

wkpark의 이미지

간단히 디버깅을 해보니 문자열을 잘못 쪼개고 있는 것 같습니다. 예전 라이브러리를 사용할 경우 글자의 개수에 관계 없이 모든 문자집합이 한 덩어리로 되는데 비해서
최신 pango를 사용하면 클러스터링이 분해가 되어서 각 덩어리가 랜더링되고 있습니다.

예를 들자면, 예전 라이브러리의 경우는 "ㄱ+ㄱ+ㄱ+ㅏ+ㅇ"의 경우 모두 5개가 한 덩어리가 되는데,
최신 라이브러리를 사용하면 3 / 2로 두개로 쪼개어집니다.

그 결과 최신 라이브러리의 경우는 "ᄀᄀ갱"의 경우는 ccmp조차도 제대로 적용이 안되는군요.

-------
일단 이 쪼개는 부분을 비활성화시키려면 다음과 같이 합니다. (이것은 임시방편이므로 근본적 해결책은 아닙니다)

--- a/pango/pango-context.c
+++ b/pango/pango-context.c
@@ -1459,7 +1459,7 @@ itemize_state_process_run (ItemizeState *state)

itemize_state_fill_shaper (state, shape_engine, font);
}
- state->item = NULL;
+ //state->item = NULL;
}

static void
---------
이것을 적용하고 나면 모든 feature가 pango라이브러리가 예전처럼 다시 동작하게 됩니다.

온갖 참된 삶은 만남이다 --Martin Buber

김도현의 이미지

네, 덩어리로 쪼개기는 이전 팡고에 비해 regression 되었군요.
초성·중성·종성 사이를 잘라선 절대 안 되는데 말이죠... 일단 버그로 판단됩니다.

어쨌든 패치를 적용하니 오픈타입 피처들이 작동하긴 합니다만 함초롬에 대해선 뭔가 불완전하네요.
첨부파일은 은바탕 스냅샷 버전과 함초롬을 동일한 입력텍스트를 비교한 것입니다.
두 글꼴의 차이점이라면 함초롬에서 contextual chaining substitution이 사용된 것 정도입니다.

댓글 첨부 파일: 
첨부파일 크기
Image icon pango-compare-unbatang-hcrbatang.png129.12 KB
wkpark의 이미지

네 단순히 위의 간단한 패치로는 작동이 안되더군요.

어제 계속 테스트해보니 pango-context.c에 대한 최근의 두번의 패치를 원상복귀시키면 모든 것이 정상작동되는 것을 확인했습니다.

첨부하는 패치는 최근의 두번의 패치를 되돌린 것입니다. 패치를 살펴보시면 WIDTH가 변화하면 changed로 판단하고 덩어리를 분리시키는데 여기서 오류가 발생하게 되는 것이였습니다.

로그를 살펴보면 최근 pango-context.c의 변화에 대한 두개의 패치는 다음과 같습니다.

---------
commit ac2ce962e9c257657eeceaf08d6aeeddd6faaa83
Author: Behdad Esfahbod
Date: Wed Jul 22 16:24:43 2009 -0400

Bug 410169 – gravity problem with Common chars https://bugzilla.gnome.org/show_bug.cgi?id=410169

Only show wide chars (as in g_unichar_iswide()) upright.
This improves rendering of 1) digits in CJK context, and 2) Narrow
Hangul characters.

New public API:

pango_gravity_get_for_script_and_width()

commit a9a416de60ce42fea78e8283253d07a018bf2778
Author: Behdad Esfahbod
Date: Wed Jul 22 13:39:41 2009 -0400

Bug 589113 – Some characters rotated incorrectly in vertical text https://bugzilla.gnome.org/show_bug.cgi?id=589113

Always show full-width Unicode characters upright.
---------

댓글 첨부 파일: 
첨부파일 크기
파일 width.patch3.65 KB

온갖 참된 삶은 만남이다 --Martin Buber

wkpark의 이미지

패치를 되돌리지 않고 width를 판별하는 부분을 고쳐봤습니다. 이 패치를 사용하니 첫가끝 자모가 더이상 덩어리로 쪼개지지 않고 잘 되는 것 같습니다.

댓글 첨부 파일: 
첨부파일 크기
파일 zerowidth.patch497바이트

온갖 참된 삶은 만남이다 --Martin Buber