아래에서 퍼옴
http://includes.egloos.com/1482679

GDI 의 DrawText 같은 텍스트 출력 API 들은 우선 그 출력 품질이 좋지 못하고 특정크기 이하에서는 anti-aliasing 이 적용되지 않는다. (워드패드에서 12pt 크기의 글자와 40pt 글자의 품질을 비교해 보시라..) 무엇보다 DC 엑세스는 느리다!! 해서 어제는 난데없이 FreeType 라이브러리를 게임에 붙이는 작업을 했었다. 튜토리얼이 잘 되어 있에서 별 무리 없이 끝나긴 했지만 덕분에 알게 된 사실 한가지.

ttf 폰트는 저마다 인코딩 타입이 다르다. 완성형으로 되어 있는 폰트도 있고 유니코드로 되어 있는 폰트도 있다. 폰트쪽에 영 관심이 없다 보니 오늘 첨 알았다. -_-;;; 어쨌든 FreeType 은 glyph index(해당 글자의 인덱스) 를 넘겨주고 이미지를 넘겨받는 식인데 가장 해피한 경우는 "유니코드 ttf 폰트" 일 경우다. 이건 그냥 유니코드를 넘겨주면 글자 이미지가 튀어 나온다.

하지만 "완성형 ttf 폰트" 에서는 작업이 좀 골때리게 된다. 영문같은 경우에는 그냥 ASCII 코드를 넘겨주면 되지만 완성형 한글같은 경우 한글 2byte 한글자의 인덱스를 넘겨줘야 한다. 인덱스라 함은 완성형 한글 2 byte 를 하나의 숫자, 그것도 big-endian 으로 바꾼것을 의미한다. 간략하게 유니코드 한자에서 glyph index 를 얻어내는 코드를 살펴보자.

wcahr_t *szString = L"한글입니다~";

 for( size_t n = 0; n < len; ++n )
 {
    // 한글인경우
    if( szString[n] >= 0xAC00 && code_point <= 0xD743 )
    {
       // 우선 해당 유니코드 글자를 완성형으로 바꾼다.
       WideCharToMultiByte( 949, 0, &szString[n], 1, (LPSTR)&code, sizeof(code), "*", NULL );      // byte order 를 뒤집어 준다. -_-;
      code = htons( code );
     }
     glyph_index = FT_Get_Char_Index( face, code );
  }
예제 코드는 Win32 API 를 사용했지만 Unicode -> KSC-5601 변환 코드가 있다면 어느것을 써도 무방하다. 참고로 조합형 폰트가 없으리란 법은 없기에 face 의 인코딩 타입을 살펴보고 코드페이지를 적절히 바꿔 주어야 한다.

덧. FreeType 2.1.10 을 C++ 에서 사용시 LNK2001 : _otv_module_class 에러가 나는경우 해결책
제작자 아저씨는 아래와 같이 얘기하고 있다. -_-

the 'otvalid' module cannot be compiled as found in 2.1.10 because we're using legal C preprocessing tricks that are not supported by the Visual C++ compiler.

from http://www.mail-archive.com/freetype-devel@nongnu.org/msg00219.html


본인은 그래서 해당 모듈을 제거해 버리고 썼다. -_-;;;
===================
본인도 제거하고 썼다... -ㅡ..

음 ? 나두 제거하고 ? ㅋㅋ

'게임 개발' 카테고리의 다른 글

멀티코어 컴파일 옵션  (0) 2010.03.18
존카맥의 멀티코어 프로그래밍에 대한 의견  (0) 2010.03.18
FreeType2 개요 번역  (0) 2010.03.17
Scaleform GFx 분석  (0) 2010.03.17
은, 는, 이, 가 알아내기 44032  (0) 2010.03.17
Posted by 노을삼킨별
,