열심히 달리고 있습니다..
어제와 오늘 작업해서 기본적인 폰트와 글리프 매니징을 하고..
굵게, 밑줄과 가운데선을 렌더링 하는 부분까지 작업을 했네요..

이제 남은건 글로우와 그림자렌더링을 하고..

나머지 배경색, 정렬, 글자색 등을 적용하여 최종 텍스쳐에 렌더링을 하고
이를 매니징해서 화면에 출력하는 부분이 남았네요..

네.  맞습니다.. 사실 텍스쳐에 렌더링하고 화면에 표시하는게 중요하죠 ㄱ-

오랜만에 머리 좀 쓸려고 했더만 머리가 아프네요.. 덜덜

저는 슬슬 저녁을 먹을 준비를 해야겠군요..

어제 저녁부터 지금까지 아무곳도 안먹었더니 배고프네요 ㄱ-

(이래서 집에서는 코딩 안할려고 합니다.. 누가 암말도 안하면 밥도 안먹고 마음이 풀릴때까지 코딩을 하니 완전 폐인되죠 ㄱ-)
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/23 16:35 2007/06/23 16:35
#include <math.h>
#include <stdio.h>

void main()

  float a = 1.398f;//표준편차
  float x = 0.0f;//x값
  float xInc = 0.35f;//x의 증가값
  int nMax = 10;//생성할 최대 개수
 
  for (int i = 0; i < nMax; i++)
  {
    float re = exp(float(-((x*x)/2*(a*a))));   

    printf("i : %d, %f\n", i, re);

    x += xInc;

  } 

}

이걸로 계산 해봤는데 그럭저럭 괜찮은 값들이 뽑힌다.. 이 함수로 사용해야지..

크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/17 18:00 2007/06/17 18:00
사용자 삽입 이미지


UML은 처음 써보는데 기호를 맞게 쓴건지 모르겠네요 ㄱ-

여튼 위의 구조를 가질 예정입니다.. 어디까지 예정이므로 다 뒤집어질수도 있습니다 ㅋㅋ

위의 구조를 다시 한번 면밀히 검도해 보고 계속 작업을 진행해야겠습니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/17 14:43 2007/06/17 14:43
생성시 고정
글자크기
외곽선
Glow깊이
그림자(방향,깊이)

동적으로 적용가능
글자색
바탕색
굵게
밑줄
가운데선
그림자색깔
정렬
싱글라인,멀티라인

저렇게 구분한 이유는 텍스트를 효율적으로 렌더링 하기 위해 글자의 최종 높이에 영향을 주는 옵션을 기준으로 나눴습니다.

텍스쳐 하나에 한번에 한줄에 텍스트가 들어가기 때문에 캐싱을 효율적이고 간단하게 하기 위해서는 높이 값이 고정이 되어야합니다.

글자크기는 당연히 높이에 영향이 가고..
외곽선은 기본 폰트보다 적당히 비율을 가지고 들어가기 때문에 원래의 폰트 크기보다 더 커지게 됩니다.
밑줄 또한 높이가 약간 높아지게 되며.. 가운데선은 사실 안넣어도 되지만.. 이것만 따로 동적으로 적용하기가 좀 이상해서 ㄱ- 걍 넣었습니다.
이탤릭체 또한 변한다면 넓이가 변하지 높이가 변하는건 아니지만 위와 같이 따로 있으면 뻘줌할거 같아서 고정으로 배치 했습니다.
그리고 Glow의 경우에는 깊이에 따라서 심하게 원래 크기보다 높이가 변하기 때문에 고정으로 배치했습니다. 그림자로 마찬가지입니다.

고정값은 동적으로 변할 필요가 없으므로 처음 사용하는 glyph의 경우에는 글자를 렌더링하고 효과를 주느라 살짝 느리겠지만 그 후부터는 캐싱을 하기 때문에 post process가 필요 없으므로 빠르게 렌더링이 됩니다.

ps. 정정합니다. 이탤릭체는 실제로 쓸일이 별로 없을거 같아서 구현을 하지 않습니다. 그리고 밑줄, 가운데선은 동적으로 적용이 가능하도록 수정을 합니다.
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/17 04:36 2007/06/17 04:36
여태 써보도 않은 UML을 사용해볼려니.. 이거 원 뭘알아야지 쓰지 ㄱ-

대략 폰트 렌더러가 복잡시러울거 같아서 좀 눈으로 편하게 보게 UML로 도식화 해볼려고하는데..
각종 기호들이 뭔지를 알아야지 원...덜덜..

걍 대~충 우선 만들어보긴 했는데 뭔가 이상하다는 느낌이 팍팍 풍기고..

이번기회에 UML을 좀 배워봐야 할려나... 그닥 필요 없을줄 알았는데..
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/05 22:15 2007/06/05 22:15
외곽선 렌더링을 freetype에서 제공해주는걸로 할려고 했는데..

대략 구리다..

못써먹겠다 ㄱ-

특정크기에서 비트맵을 가져오는 경우에는 외곽선이 일반폰트 렌더링하고 똑같아져버린다..
대략 이런것이다..

외곽선으로 렌더링





일반 폰트렌더링





흐덜덜..

어차피 최종 렌더링은 텍스쳐에 모두 그리고나서 해당 텍스쳐를 최종 렌더링에 사용하고 모든 텍스쳐는 캐싱을 할 것이므로 걍 좌우상하 4번 1픽셀씩 움직이면서 렌더링을 해야겠다..

캐싱 기준을 정해야하므로 초기 폰트 초기화하고 생성시 고정을 해야할 요소들을 정해야겠다..
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/04 22:37 2007/06/04 22:37
우선 정확한 스팩을 정해놓고 시작을 해야지 나중에 뒷통수 맞는 일이 없을 것이므로..
스팩을 생각 해봤습니다.

목표는 범용적인 폰트 렌더러를 만들 생각이기 때문에 우선 아래와 같이 스팩을 정해봤습니다.
더 추가 되었으면 하는 좋은 생각이 있으신 분은 리플 부탁드립니다.

1.글자크기
2.글자색
3,바탕색(색깔 있음, 투명)
4.글자 꾸미기(굵게, 밑줄, 외곽선, 가운데선, 이탤릭체, Glow효과(깊이))
5.안티엘리어싱 유무
6.그림자(좌우상하방향, 그림자 깊이, 그림자 색깔)
7.정렬(왼쪽, 오른쪽, 상단, 하단, 세로가운데, 가로가운데)
8.싱글라인(캐리지 리턴을 개행으로 처리 하지 않고 출력), 멀티라인(캐리지 리턴을 개행으로 처리)
크리에이티브 커먼즈 라이센스
Creative Commons License
이올린에 북마크하기(0) 이올린에 추천하기(0)
2007/06/03 21:31 2007/06/03 21: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