삽질하는플머

아랍어는 숫자도 골떄려~

탐구생활/Uniscribe

유니코드 문자열 내에 "아랍어 | 숫자 | 영문" 순서로 들어있는 경우 화면표시는 "숫자 | 아랍어 | 영문" 이 된다.
생각해보면 어차피 아랍사람들도 숫자를 사용할 테고...이 경우 자기네 어순 배열에 맞게 적어갈 것이다. 물론 전체적으로는 RTL로 진행하다가 숫자부분만 LTR로... 날 죽여라~~~ 

ScriptLayout 이 원래 이 일을 해 주어야 하는데... 처음에 호출하는 ScriptItemize 의 인자값인 SCRIPT_CONTROL 과 SCRIPT_STATE 에 뭔가 비밀이 있을 것 같아 이리저리 뜯어맞춰봐도 제대로 된 표시를 얻을 수 없었다.

우연히 읽게 된 재미난 문서.
http://maxradi.us/documents/uniscribe/

MSDN에는 SCRIPT_CONTROL 값 대신 NULL을 넘겨도 관계없다고 되어있지만, 실제 이렇게 할 경우 RTL 정보를 제대로 얻을 수 없다는 언급이 있다. 응?? RTL?? 난 지금까지 catch22.net 의 강좌대로 클러스터의 요소가 배열증가에 따라 감소하는지 여부로 RTL을 판단했었는데??

아무튼 시키는대로 0으로 초기화한 구조체를 넘겨주니까, ScriptItemize로 얻은 ItemRun 의 ScriptAnalysis 정보에 fRTL 값이 제대로 설정된다. 그리고 그 옆에 fLayoutRTL 이라는 플래그도 눈에 띄네~~ 오오~~ 이거 혹시 이거 레이아웃에 쓰이는 RTL 정보 아냐??

ScriptLayout을 호출할 때 지금까지 썼던 ScriptAnalysis 의 uBidiLevel 대신 이 fLayoutRTL 을 넘겨줘 보았다. uBidiLevel은 ScriptItemize 호출시 SCRIPT_STATE에 지정한 값이 그대로 튀어나오길래 이상하다고 생각하고 있었거덩. 이렇게 하니 제대로 된 LogiclaToVisual 정보가 뽑힌다. 뒷발로 쥐밟은 격이지만 아무튼 만쉐~~!!



밑에 작은 숫자로 찍힌 값이 실제로 찍어야 하는 ItemRun의 순서.
저녁먹기 전까지 최대의 고민이었던 공백분해도 자연스러워졌다.


이제 각 ItemRun을 이 순서대로 재배치해서 찍어주면 일단 출력은 마무리된다. 그룹화된 클러스터 정보를 기반으로 캐릭, 단어, 줄바꿈까지 구현하면 대충 쓸만해 질 것이다.

체력고갈이다. 오늘은 그만 달리자...