삽질하는플머

다국어를 지원하는 TWideIniFile

탐구생활/Delphi
내가 만들고자 하는 물건은 이런 것.



어떤 아이디어가 떠오를 때, 동시에 같은 생각을 하는 사람이 100명이고 그 중 10명은 이미 만들고 있고, 한명은 벌써 완성했다는 옛 이야기가 있다. 그것이 진리임을 다시 깨닫게 되는 링크.

http://simplyplay.googlecode.com/svn-history/r59/trunk/WideIniFiles.pas

외부 저장만 UTF-8 로 바꿔주면 아주아주 쓸만할 듯.

하지만... 이미 만들었는걸... 앞으로는 찾아보고 만들자. 
윈도에서 저장된 UTF-8 문서의 경우 앞부분에 BOM이 따라붙으므로 이 부분은 건너뛰도록 하는 코드도 추가. 
저장시에도 BOM을 붙여준다. 



기존 게임용 문자 상자 (TextBox) 구현

탐구생활/Uniscribe
유니스크라이브 삽질에 비해 상대적으로 쉬워보이는 문자열 출력도 이것 저것 신경쓰려다 보니 계속 할 일이 생긴다.
모든 일이 다 그렇지만... 제대로 하려고 마음 먹으면 끝이 없는듯 하다.

게임에서 NPC 대화상자등을 만들 경우도 쉽게 하려면 화면너비 기준으로 일일이 잘라넣으면 되지만, UI 가 변경되거나 할 경우 다시 수정해야 하는 번거로움이 있다. 때문에 적절한 워드랩을 지원해주면 로컬라이징 작업이 많이 행복해진다.

유니스크라이브의 ScriptBreak() 함수를 쓰면 문자열의 특정 위치에서 캐럿이 위치할 수 있는지, 단어 분리점인지, 라인브레이크가 가능한지 등의 정보가 기록된 SCRIPT_LOGATTR 의 배열을 얻을 수 있다. 이 중 라인브레이크 정보를 써서 문자 상자 (TextBox) 를 만들어 보았다. 




상자의 폭을 줄이면 넘치는 글자는 다음줄로 흘러내려간다.




가운데 정렬.




우측 정렬.




우측 정렬 하면 빼놓을 수 없는 아랍어 테스트.




태국어의 단어단위 워드랩도 일단은 제대로 동작하는 것 처럼 보인다.
(뭔 뜻인지 알 수가 없으니 메모장과 비교해 볼 수 밖에...)




장평 150% + Blur:R2




장평 70% + Blur:R2




------

오래전 엘비스님과 태국어 출력에 대해 이야기하다 GPG에 올렸던 글이 생각났다.
http://www.gpgstudy.com/forum/viewtopic.php?p=106336

별다른 설정을 하지 않았음에도 윈도의 워드패드나 우분투의 GEdit 에서 워드 브레이크가 동작하는 것이 신기해서 올렸던 글이었다.
생각해보면 유니스크라이브라는 명칭을 처음 들었던 곳도 GPG였는데...

예를 들면 이런 고민의 흔적들...
http://www.gpgstudy.com/forum/viewtopic.php?p=25873 
솔직히 이렇게 "나는 이제 알지만 말해주기는 싫어" 같은 글들을 참 싫어한다. 그래도 험한 등산로 나뭇가지에 매어둔 리본정도의 역할은 되는 듯 하다. 적어도 어디로 가야하는지는 알려주니까.

당시 백업소스를 뒤져보니 리치에디트를 동적으로 생성하고 문자열을 복사해넣은 뒤 캐럿의 위치와 워드 브레이킹 정보를 얻는 코드도 있군. 크핫~~!

------

까칠한 PM 덕에 금칙어 처리도 신경써야 할 듯 하다. 수많은 정보를 처리해주고 복잡하게 꼬여있는 유니스크라이브가 왜 금칙어에 대해서는 무시하고 있을까... 아직 못찾은 것일지도 모르지. 으으...

기존 게임용 에디터 구현... 3.

탐구생활/Uniscribe
한 일

미루어두었던 패스워드 캐릭터 마무리.





테스트삼아 구현해 본 장평. 하나의 폰트로 여러가지 느낌을 줄 수 있어서 의외로 쓸만할 듯.
(자간의 경우는 출력오토마타 문자열에서 문제가 있어 일단 보류. 대학때 레포트의 비결이던 신명조 장평 95% 자간 -5 가 떠오르네.)
 





에디터에서는 써먹을 일이 거의 없겠지만, 글립 랜더링 옵션도 지정할 수 있게 함. 






이제 기획자들이 써먹을 수 있도록 루아스크립트 연동코드만 매달아주면 되겠다.

==============================
2010.8.3

루아 연동코드 추가 완료. 이제 당분간 마음 편하게 미루어두었던 삽질들을 할 수 있겠군.

기존 게임용 에디터 구현... 2.

탐구생활/Uniscribe
지난번에 이어서

한 일

힌두어, 태국어, 아랍어등 출력오토마타 문장에서의 백스페이스 처리.





우측정렬 구현.


IME 처리. 조합시 언더라인, 조합커서, 후보창위치 등.



선택박스 구현.
  (아랍어 등의 RTL 혼용 테스트. 머리 다 빠짐...)


  (컨트롤 + 화살표로 태국어 단어단위 선택 테스트.)






할 일

마우스 메시지 처리.
패스워드문자 구현.

우우... 선택박스에서 힘을뺐더니 귀차니즘이 밀려온다...

--------

마우스 메시지 처리 완료.

패스워드 처리를 위해 생각을 정리하다보니... 랜더링, 커서처리, 마우스처리등을 이중으로 관리하느라 구조가 지저분해진다. 내부문자열을 단순히 "*" 로 대체해서 찍기 위해 이런 수고를 하는 것 보다... 그냥 패스워드 처리 전용 에디터를 하나 더 만드는 편이 맞을 듯 싶다. (생각해보니 예전에도 같은 고민에 같은 결론을 내렸던 것 같다.)

최대길이값을 제한하는 코드만 추가하고 마무리짓자.


--------

MaxLength 처리 완료.
최대값 근방에서 IME 입력 다루기가 거지같네... 특히 일본어처럼 조합문자열이 복수인경우... 예전에도 이게 귀찮아서 안했었는데...

이제 깔끔한 마음으로 술먹으러 가야지...

기존 게임용 에디터 구현... 1.

탐구생활/Uniscribe

글립캐시 DLL을 사용한 에디트 컨트롤을 구현중. 수개월동안 머릿속에서만 돌아가던 물건이 조금씩 완성되는 기분은 참 좋다. 하긴 뭐... 이 맛에 코딩 하는거지만...



한 일.
출력 처리.
키다운 메시지 처리.
글자단위, 단어단위 캐럿 이동.
캐럿 이동에 따른 문자열 옵셋 처리.
복사/잘라내기/붙이기


할 일.
IME 메시지 처리.
마우스 메시지 처리.
선택박스 구현.
패스워드문자 구현.


사실 제일 난감한부분이 바로 "선택박스"인데... 예전에는 그냥 선택시작위치에서 선택된 양 만큼 역상시키면 그만이었지만 LTR, RTL이 뒤섞인 상황에서는 그게 말처럼 쉽지가 않다. 아래 이미지는 위의 문자열을 워드패드에서 선택해 본 것이다.



RTL인 아랍어는 선택상자가 좌측으로 뻗어나가다가 LTR인 영문을 만나 다시 우측으로 진행된 후 다시 아랍어를 만나 좌측으로 진행되고 있다. 유니스크라이브의 ScriptString API 에서는 ScriptStringOut을 쓰면 이 부분까지 자동으로 처리해주지만... 그저 군침만 흘릴 뿐... 

밤새 고민하면 내일쯤 대충 방법이 떠오르겠지 머~~