[완료]freetype2 한글 깨짐 문제입니다.

poplinux의 이미지

MIPS 기반의 uclinux 에서 작업중입니다.

우선 freetype-2.3.7 버전을 크로스 컴파일하여 라이브러리를 설치했습니다.

일전에 다른 플랫폼에서 사용하던 완성형 폰트와 폰트를 사용하기 위해 작성해 두었던 api 를 가져와서 테스트를 진행했습니다. (모두 이전 플랫폼에서 정상적으로 사용하던 녀석들입니다.)

우선 영문은 아무런 문제없이 화면에 출력됩니다.

문제는 한글인데, 제가 알기론 freetype 자체에서 한글을 지원하는 것으로 알고 있었는데 화면에 박스 형태로 깨져서 표현이 됩니다.

웹을 검색한 결과 freetype 은 기본이 유니코드를 지원하기 때문에 유니코드 폰트를 사용해야 한다라는 정보를 구할 수 있었습니다.

현재 제가 사용중인 폰트는 완성형 폰트이고 euc-kr 환경입니다. 이 상황에서 freetype 을 사용하기 위해서는 어떤 방향으로 방법을 찾아가야 할까요?

송효진의 이미지

php gd 에서 charmap 부분을 봤습니다.
비슷하게 따라하면 될거라 생각합니다.

http://php.net/ 의 최신 소스를 풀어서
ext/gd/ 에서 찾아보시면 big5 와 jis 를 처리하는 부분이 나옵니다.

emerge money
http://wiki.kldp.org/wiki.php/GentooInstallSimple - 명령어도 몇개 안되요~
http://xenosi.de/

rOseria의 이미지

폰트마다 인코딩 타입이 있는 것으로 알고 있습니다. FT_Face->charmap->encoding 쪽을 보시면 될거 같습니다.
----
한 발자국, 한 발자국 - 언젠가는 도약하리라 ~

----
한 발자국, 한 발자국 - 언젠가는 도약하리라 ~

poplinux의 이미지

인코딩 정보 같은 것은 명확히 넘어간 것을 확인했습니다.

디버거로 다음과 같이 출력이 됩니다.

(gdb) p *font_face->charmap
$5 = {face = 0x100080a8, encoding = FT_ENCODING_WANSUNG, platform_id = 3, encoding_id = 5}

코드를 따라가다보니 결국 다음과 같이 인덱스를 얻어 내는 것을 확인했습니다.

glyph_index = FT_Get_Char_Index(face, char_code);

freetype 설명서를 보니까 FT_Get_Char_Index 의 리턴값이 0 이 나오면 해당 코드를 찾지 못했다는 뜻이더군요.

결국 char_code 를 넘겨 주는 방법이 잘못되었던가 그 전단계 셋팅 쪽에 문제가 있을 것 같습니다.

그런데 제가 사용하려고 하는 것은 완성형 캐릭터 셋인데 이 캐릭터 셋은 어디에 들어가 있는 거지요?

libc? libcharset? 아니면 여기서는 freetype?

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

poplinux의 이미지

해결했습니다.

완성형 한글의 인덱스를 얻기 위해서는 한글일 경우엔 다음과 같이 2Byte 로 변경해서 보내줘야 합니다.

 1  unsigned short target[size]
 
 2  for(i=0;i<num_chars;n++){
 3  if(text[n] >= 0xB0){ /* 한글 */
 4    target[new_num]  = (text[n++]) << 8;
 5    target[new_num] |= text[n];
 6    new_num++;
 7  }else{    /* ASCII */
 8    target[new_num++] = text[n];
 9  }
10 }

위 알고리즘만 보면 아주 간단한 내용인 걸 알 수 있습니다. 3번째 줄을 보면 출력한 문자가 "한글" 로 판정되면 2byte 로 묶어 주는 기능을 하게 됩니다.

문제는 뭐였냐면..

함수 프로토타입이 문제였습니다.

renderText(char *text.......)

text 가 char 로 선언되어 있어서 표현할 수 있는 범위가 -128 ~ 127 사이로 한정되니까 소스중에 4번째 줄은 항상 실패가 될 수 밖에 없었습니다.

그러니 제대로된 2byte 코드가 생성될 수 없었던게 원인이었습니다.

이전에 사용한 시스템에서는 잘 되었었던게 실은 버그가 있는 소스가 아주 운좋게 동작하고 있었던 것 뿐이었습니다.

도움 주셔서 감사합니다.

========================
조직 : E.L.D(Embedded Linux Developer/Designer)
블로그 : poplinux@tistory.com
카페 : cafe.naver.com/poplinux

임베디드 리눅스 관련 프리렌서 지향

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.