2011-01-03 5 views
3

비트 맵 글꼴 렌더러를 만들려고 시도하지만 실제 개별 문자 배치를 렌더링하는 데 문제가 있습니다.비트 맵 글꼴 렌더링 및 커닝

GetCharABCWidthsFloat 및 GetTextMetricsW를 통해 글꼴 문자 정보를 얻지 만 ABC 너비를 올바르게 사용하는 방법이 확실하지 않거나 추가 정보가 필요합니까?

FreeType 또는 다른 라이브러리를 사용하고 싶지 않습니다. C++ \ Windows를 통해 제공되는 표준 기능으로이 작업을 수행하려고합니다.

커닝 정보가 없으면 글자가 올바르게 표시되지 않습니다. 예를 들어, "f"와 "t"가 서로 옆에 배치되면 "Times new roman"을보십시오. 올바른 문자 간격이 없으면 너무 멀리 보입니다. 알고리즘의 예는 --- 여기

float letterBottomLeftX = 0.0f; 
float letterHeight = 1.0f; 
float letterWidth = 1.0f; 

float scale = 1.0f; 
for(U32 c = 0; c < numberOfCharacters; ++c) 
{ 
    fon->GetCharcterInfo(charValue, charInfo); 
    //float advancedWith = (charInfo.A * scale) + (charInfo.B * scale) + (charInfo.C * scale); 

    letterWidth = charInfo.B * scale; 
    letterHeight = textMetrics.Height * scale; 

    if(c == 0) 
    { 
     letterBottomLeftX = -(charInfo.A * scale); 
    } 


    // vertex placement, beginning at letterBottomLeftX 

    // texture placement 

    // index placement 

    letterBottomLeftX += (charInfo.A + charInfo.B + charInfo.C) * scale; 
} 

는 어떻게 생겼는지, 당신은 문자 사이의 나쁜 간격을 알 수있는 예입니다. (텍스쳐 UV를 무시하고, 글자 배치가 정확 해지면 바로 잡을 것입니다.)

http://img88.imageshack.us/img88/4015/njpjp2.png

+0

아무도 아이디어가 없습니까? – jack

+0

비트 맵 글꼴 렌더러를 작성한 사람이 있습니까? – jack

답변

2

KERNINGPAIR에 대한 문서는 매우 간단합니다. 현재 문자와 다음 문자가 모두 wFirstwSecond 멤버를 통해 테이블에 나타나면 다음 문자를 입력 할 픽셀 수에 iKernAmount을 추가합니다.

빠른 검색을 위해 GetKerningPairs의 결과를 사용하여 std::map<std::pair<wchar_t,wchar_t>,int>을 만드는 것이 좋습니다. GetKerningPairs이 가능한 모든 문자 조합에 대한 결과를 반환하지 않는다는 것을 알았습니다. 이 정보는 글꼴 자체에서 가져온 것이므로 글꼴 디자이너가 조정할 문자 쌍을 표시해야합니다. 이 정보가 완전히 누락되거나 분명하지 않은 문자 쌍이 누락되었을 가능성이 큽니다.

매핑 모드가 결과에 영향을주기 때문에이 함수를 호출하기 전에 SetMapMode(hdc,MM_TEXT)을 수행해야합니다.

+0

흥미 롭습니다. 어디에서 "SetMapMode (hdc, MM_TEXT)"를 넣어야합니까? 이것은 내가하는 방법입니다, 비록 그것이 그것을 적절하게 사용하고 있는지 확신하지 못합니다. (많은 답장에 대해 유감스럽게 생각합니다. 여기서의 형식은 답장을 위해 끔찍합니다.) HFONT fnt CreateFont (크기, 0,0,0, FW_NORMAL, 0,0,0, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FF_DONTCARE, "Times New Roman"); – jack

+0

SelectObject (dc, fnt); – jack

+0

SetMapMode (dc, MM_TEXT); – jack

0

하나 개의 일반적인 솔루션은 편지 쌍의 폭 테이블을 만드는 것입니다. 따라서 'Ti'라는 글자는 MN이라고하는 것보다 더 가깝게 배치됩니다. 비용을 절감하고 탁월한 결과를 얻을 수있는 빠른 테이블입니다.

+1

이 테이블을 자동으로 생성하는 방법이 있습니까? 어떤 방법으로 정보를 쿼리하지 않고도 값을 배치하는 해킹처럼 보일 수 있습니다. GetKerningPairs는 특별한 배치가 필요한 경우에도 모든 쌍에 대한 정보를 반환하지 않습니다. – jack

+0

저는 임베디드 게임 개발의 나라입니다. 이렇게하는 도구가 이상적 일지 모르지만 결과를 얻는 방법은 간단합니다. 대부분, 나는 당신에게 실행 가능한 해결책에 대한 아이디어를주고있었습니다. –