2009-12-01 133 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