2009-12-01 140 views
2

我需要將字體渲染到3D遊戲世界,所以我使用GetGlyphOutline輪廓函數來將字形形狀渲染爲紋理。但是,我希望能夠處理字符不在給定字體中的情況(亞洲其他國際文本通常是這種情況)。 Windows文本渲染將自動替換具有所需字符的字體。但GetGlyphOutline不會。我如何檢測這種情況,並獲得替代字形的輪廓? Mac OS X Core Text有一個函數可以爲給定的字體和字符串獲取匹配的替換字體 - 在Windows上有沒有類似的東西?Windows:從其他字體中替換字符的輪廓輪廓

回答

2

找到我需要了解的我自己:IMLangFontLink interface,特別是MapFont方法包含所需的功能,以找出哪些替代字體應該在Windows上使用。

+0

是的IMLangFontLink接口庫總是安裝在Windows上? – epotter 2009-12-02 16:19:48

+0

據我所知,它通過Internet Explorer 4.0或更高版本進行安裝。我不知道是否可以安全地推測它是在任何Windows系統上,即使IE已被刪除。 – 2009-12-02 16:37:29

1

我也對​​感到困惑。我不確定您是否能夠做到這一點,但我可以使用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字體中的貝塞爾曲線嗎? – 2011-01-20 10:31:22

+0

@jonas:這一切都取決於您正在繪製的設備上下文(以及它如何配置)。此外,如果您在'BeginPath'和'EndPath'內使用'LineTo',那麼在使用'StrokePath'或'EndPath'之前不會繪製任何內容。這也只是表明你可以獲得路徑,一旦你有了路徑,你可以將它擠壓成3D物體或者在屏幕上繪製它。 – dreamlax 2011-01-20 10:45:32