'freetype'에 해당되는 글 3건

  1. 2009/05/14 freetype에서 horiBearingY 구하기
  2. 2009/04/26 머리 빠지는 구만.. (1)
  3. 2007/06/02 FreeType2를 이용하여 폰트렌더링 시험중.. (4)
기존에 폰트를 렌더링 할 시 baseline을 계산하기 위해 ascender를 계산 한 후 face->glyph->bitmap_top을 이용하여 baseline과 합하여 폰트가 그려질 0,0을 찾았다.

그런데 이것이 일정 크기가 넘어가면 baseline이 안맞는 현상이 발생했다.

조사해보니 bitmap_top이 문제였다. 이 값이 계속 0이 나와서 매뉴얼을 다시 뒤져보니..

이 값은 FT_GLYPH_FORMAT_BITMAP일 때만 유효하다더라..

즉.. 일정 크기가 넘어가면 트루타입 폰트는 스케일이 가능한 FT_GLYPH_FORMAT_OUTLINE으로 리턴을 한다. 따라서 bitmap_top을 이용해서는 안되고..

face->glyph->metrics.horiBearingY를 이용하여야 한다. 이 값은 FT_GLYPH_FORMAT_BITMAP일 때도 유효하니 무조건 이거만 써도 무방하다. 이 값을 픽셀값으로 변환할려면 64로 나누어야한다.

ps. freetype 튜토리얼 개나 주세요.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/05/14 17:51 2009/05/14 17:51
이런 시버먹을넘의 freetype님..

내가 멍청해서 이해를 못하는 것일까요. 아니면 글꼴 만는놈이 문제인걸까요. 아니면 님하가 문제인가요.

폰트제작에 대한 책을 좀 사서 봐야하나..

freetype으로 글꼴 출력하기 한번 힘들구나...

Glyph Matrix가 젤로 헷갈렸어요.

어떻게 해서 대략 되긴했는데..

난 제일 이해가 안가는게 왜 ascender값이 특정 폰트 크기에서 1픽셀씩 삑사리나고 ㅈㄹ인거냐고..

orig값을 찾기 위해 계산한 값이 내가 생각하기로는 정확한데 왜 삑사리가 나는지 모르겠다.

여튼 아래와 같은 방식으로 미리 렌더링된 폰트를 가지고 텍스처의 옵셋을 이용하여 화면에 출력할 예정이다.
대략 아래와 같은 텍스처와 옵셋정보를 파일로 저장하고 불러오는 기능도 만들까 생각중이다.
그러면 처음 구동시 텍스처에 폰트를 그리는 로드는 많이 줄어들 것이다.

대충 중간선과 밑줄까지는 구현했고.. 젤로 귀찮은 그림자와 글로우, 테두리가 남았다.
원래는 이텔릭체는 구현 안할려고 했는데(이텔릭체라는것이 그릴려는 폰트의 크기를 넘어서서 렌더링이 되므로 처음에 구상했던 방식하고 좀 안맞아서) 이번에 구현한 방식이 이텔릭체와 같이 기본 크기를 넘어서도 되도록(사실은 미처 몰랐다가 구현하다가 깨달았다능..) 구현이 되었으므로 이텔릭체도 지원할까 생각만 중이다.

위에서 언급한 그림자와 글로우는 멀티패스로 렌더링할 예정이다. 즉, 원래 글자와 글로우, 그림자를 각기 분리하여 렌더링하여 아래 그림과 같이 텍스처에 저장후 최종 렌더링 할때 합성해서 보여줄 예정이다. 사실 미리 때려박아도 되긴 하는데... 너무 오래되서 몰랐는데 내가 글로우와 그림자의 색상을 실시간으로 변경 할 수 있게 설계를 해놨더라...그래서 별수 없이 분리하여 멀티패스로 할 예정이다. 그러고보니 글자 배경도 실시간으로 변경 할 수 있게 해놨더라..


사용자 삽입 이미지

클릭하세요

























ps. 어라.. 원래 이곳이 없었던거 같은데.. 여튼 이곳에서 좌표에 대해서 잘 설명하니 다시 읽어봐야겠다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2009/04/26 02:31 2009/04/26 02:31
DCGUI에 폰트렌더러를 탑재하기 위해서 freetype2를 이용해서 데이터가 어떻게 들어가 있고 이를 어떻게 렌더링을 하는지 테스트를 하고 있습니다..

freetype홈페이지의 튜토리얼을 보고 하고 있었는데..

대략 사용 방법은..

1.폰트로딩
2.폰트에서 렌더링 할 글자의 glyph인덱스를 구한다.
3.인덱스에 해당하는 glyph를 로드한다.
4.로드된 glyph를 안티엘리어싱, 모노크롬 등 옵션을 주어 렌더링을 한다.
5.렌더링 된 glyph를 자~알 사용한다.

이라고 써져있었습니다.

그래서 우선 위의 5번까지 하고.. 실제 화면에 출력을 해봤습니다.

폰트 크기 50픽셀(굴림체) :
사용자 삽입 이미지





보시는 바와 같이 아주 잘 렌더링 됩니다.


이제 좀 더 작은 크기를 렌더링 해봤습니다.

폰트크기 10픽셀(굴림체) :
사용자 삽입 이미지


안티엘리어싱이 먹어서 좀 안보이지만 확실히 정상적으로 렌더링이 되었습니다.


이제는 조금 더 큰 크기를 렌더링 해봤습니다.

폰트크기 12픽셀(굴림체) :
사용자 삽입 이미지




12픽셀부터는 깨지기 시작했습니다 .ㄱ-

그래서 이곳저곳을 검색해보니 트루타입 폰트중에 일부는 특정 글자크기에서 비트맵으로 데이터가 반환 된다고 하더군요..

만약에 비트맵으로 렌더링이 된다면 pixel_mode에 FT_PIXEL_MODE_MONO으로 온다고 하더군요.. 그래서 바로 확인해보니 FT_PIXEL_MODE_MONO가 오는게 맞았습니다.

그런데 모노크롬에서는 이미지가 비트로 표현이 되기 때문에 제대로 렌더링을 할려면 비트로 저장된 모든 이미지 정보를 풀어내야 했습니다.
그래서 열심히 풀어냈건만...

결과는 ㄱ-..

사용자 삽입 이미지


엉엉엉 ㅠㅠ

뭔가 빠진게 분명했습니다..

그래서 생각을 해보니.. 비트맵이 정사각형이나 정확히 8의 배수로 저장 된다는 법이 없으므로 제대로 풀어낼려면 실제 비트맵 열의 맨 마지막 행 바이트의 비트 패딩 개수를 알아내야 했습니다.

그런데 분명 튜토리얼에는 그딴건 안보였는데 ㄱ-
예제에도 그런건 없었는데 ㄱ-

튜토리얼 만든분 미어.. 엉엉 ㅠㅠ

이곳저곳 검색을 해보니 glyph 정보에 pitch라는 필드가 있더군요..
이 필드가 비트맵의 한 행이 가지는 실제 바이트수를 나타내는 것이었습니다..

분명 튜토리얼에는 없었는데.. 캐소심한 A형 성격 나온다...

그래서 이 값을 이용해서 다음 행의 오프셋을 구해서 다시 코드를 작성했습니다.

그리고 다시 렌더링을 했습니다.

폰트크기 12픽셀(굴림체) :
사용자 삽입 이미지



이제 잘 나오는군요..
힘들군요 ㄱ-
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/02 22:06 2007/06/02 22:06