2009-12-01 3 views
2

글꼴을 3D 게임 세계에 렌더링해야하므로 GetGlyphOutline 개요 함수를 사용하여 문자 모양을 텍스처로 렌더링합니다. 그러나, 나는 문자가 주어진 글꼴에 존재하지 않는 경우를 처리 할 수 ​​있기를 원합니다 (아시아의 다른 국제 텍스트의 경우처럼). Windows 텍스트 렌더링은 필요한 문자가있는 글꼴을 자동으로 대체합니다. 하지만 GetGlyphOutline은 그렇지 않습니다. 이 사건을 어떻게 감지하고 대체 글리프의 윤곽을 잡을 수 있습니까? Mac OS X Core Text는 주어진 글꼴과 문자열에 맞는 대체 글꼴을 가져 오는 기능이 있습니다. Windows에서 이와 비슷한 것이 있습니까?Windows : 다른 글꼴의 대체 문자에 대한 글리프 개요 가져 오기

답변

2

내가 알아야 할 것을 찾았습니다 : IMLangFontLink interface, 특히 MapFont 메소드는 윈도우에서 사용할 대체 글꼴을 찾는 데 필요한 기능을 포함하고 있습니다.

+0

인 IMLangFontLink 인터페이스 라이브러리는 항상 Windows에 설치되어 있습니까? – epotter

+0

내가 알 수있는 한 Internet Explorer 4.0 이상이 설치됩니다. IE가 제거되었는지 여부와 관계없이 모든 Windows 시스템에 있다고 가정하는 것이 안전한지 여부는 알 수 없습니다. –

1

나는 역시 GetGlyphOutline으로 의아해했습니다. 동일한 작업을 수행 할 수 있는지 확실하지 않지만 TextOut()BeginPath(), EndPath()GetPath()과 조합하여 혼합 스크립트 텍스트 개요를 얻을 수있었습니다.

예를 들어, 심지어 Arial 글꼴로, 나는 일본어 텍스트의 경로를 얻을 수 있어요 「テ ス ト」(C++를 사용하지만, 쉽게뿐만 아니라 C에서 할 수 있습니다) :

SelectObject(hdc, hArialFont); 
BeginPath(hdc); 
TextOut(hdc, 100, 100, L"\u30c6\u30b9\u30c8"); // auto font subbing 
EndPath(hdc); 

// get number of points in path 
int pc = GetPath(hdc, NULL, NULL, 0); 

if (pc > 0) 
{ 
    std::vector<POINT> points(pc); 
    std::vector<BYTE> types(pc); // PT_MOVETO, PT_LINETO, PT_BEZIERTO 

    GetPath(hdc, &points[0], &types[0], pc); 

    // it seems the first four points are the bounding rect 
    // subsequent points match up to their types 

    for (int i = 4; i < pc; i++) 
    { 
     if (types[i] == PT_LINETO) 
      LineTo(hdc, points[i].x, points[i].y); // etc 
    } 
} 
+0

이 방법이 효과가 있지만, 글꼴을 렌더링하기 위해 LineTo를 사용하지 않고 글꼴 개요 만 얻을 수 있습니까? 또한 앤티 앨리어싱을 얻지 못할 것이며 TTF 글꼴로 베 지어 곡선을 올바르게 처리 할 것인가? –

+0

@jonas : 모두 당신이 그린 장치 컨텍스트 (그리고 그 구성 방법)에 달려 있습니다. 또한'BeginPath'와'EndPath'에서'LineTo'를 사용하면'StrokePath' 또는'EndPath'를 사용할 때까지 아무 것도 그려지지 않습니다. 또한 이것은 일단 경로를 얻으면 3D 객체로 돌출 시키거나 화면에 그릴 수있는 경로를 얻을 수 있음을 보여줍니다. – dreamlax

관련 문제