2011-03-10 4 views
4

글꼴 렌더링에 FreeType2를 사용하고 있으며 모든 글꼴에 대해 전역 경계 상자를 가져와 멋진 격자에 정렬 할 수 있어야합니다. 나는 작동FreeType2 : 전역 글꼴 경계 상자를 픽셀 단위로 가져 옵니까?

int pixels_x = ::FT_MulFix((face->bbox.xMax - face->bbox.xMin), face->size->metrics.x_scale); 
int pixels_y = ::FT_MulFix((face->bbox.yMax - face->bbOx.yMin), face->size->metrics.y_scale); 
return Size (pixels_x/64, pixels_y/64); 

를 사용하여 글로벌 경계를 추출하여 다음 FT_Set_Char_Size를 호출하지만 꽤 너무 큰입니다. 나는 double (as described in the FreeType2 tutorial)을 사용하여 계산하려고 시도했지만 결과는 거의 동일합니다. 심지어 face->bbox.xMax을 사용하더라도 너무 큰 경계 상자가 생깁니다. 나는 옳은 일을하고 있는가, 아니면 단순히 내 글꼴 (Arial.ttf이 경우?)에 거대한 글리프가 있는가? 어떤 글리프가 그렇게 크지 않은지 확인하는 방법은 무엇입니까?

답변

0

왜 정렬 할 문자열에서 사용중인 문자에서 최소/최대를 계산하지 않습니까? 문자를 반복하여 사용하고있는 문자의 최대 값과 최소값을 저장하십시오. 글리프를 렌더링 할 때마다이 값을 찾지 않아도되므로 이러한 값을 렌더링 한 후에 저장할 수 있습니다.

+0

요청할 문자/개수를 알 수 없습니다. 즉, 그리드를 초기화 할 때 아직 렌더링 된 것이 없습니다. 각각의 새 문자는 그리드의 다음 빈 위치에 추가됩니다. – Anteru

+0

더 큰 문자를 감지하면 이미 배치 된 문자를 다시 배치 할 수 없습니까? –

+3

화면 격자가 재조정을 시작하면 추한 것처럼 보일 것입니다. – Anteru

0

freetype을 사용하여 그리드에 나타날 텍스트 요소를 렌더링하는 비슷한 문제가 있습니다. 모든 텍스트 요소가 같은 크기가 아니므로 배치 할 위치를 알기 전에 미리 정렬해야합니다. 다른 크기는 높이가 변할 때 가장 큰 문제점이었습니다 (예 : "j"또는 "Q"와 같은 부분).

나는 얼굴에있는 높이를 사용하여 끝내었다. (당신이 bbox에서했던 것처럼). 그러나 당신이 언급 한 것처럼, 그 가치는 훨씬 커졌습니다. 베이스 라인 거리에 대한 기준선이지만 거리의 약 두 배인 것처럼 보입니다. 그래서, 나는 쉬운 길을 택하고보고 된 높이를 2로 나눈 값을 일반적인 높이 값으로 사용했습니다. 대부분 글꼴 높이가 길거나 낮아지는 문자가 있기 때문에 높이가 너무 큽니다.

사용할 것으로 예상되는 모든 문자를 반복하고, 글리프 메트릭을 얻고, 발견 된 가장 큰 높이를 저장하는 것이 더 나은 방법이라고 생각합니다. 그러나 그 모든 것이 견고하지는 않습니다.

관련 문제