我正在尝试使用FreeType lib读取字符的字形轮廓,我从标准的.ttf文件中加载字体,直到现在我使用轮廓标签将轮廓转换为路径元素(如线段和贝塞尔曲线),然后我找到了FT_Outline_Decompose其中是lib的一部分。但是,当我使用它时,分解后的数据值非常大。路径上的每个点的值都约为859722XXX。因此,即使按examples的建议将其按比例缩小为64不利于获取像素大小值。
我的代码是这样的:
const char* fontFile ="fonts/Verdana.ttf";
std::string chars("Uta \n");
char charcode = chars[0];
FT_Library defLibHandle;
FT_Error err = FT_Init_FreeType(&defLibHandle);
if(err){
printf(ft_errors[err].err_msg);
throw;
}
FT_Face faceHandle;
err = FT_New_Face(defLibHandle,fontFile,0,&faceHandle);
if(err){
printf(ft_errors[err].err_msg);
throw;
}
FT_Glyph glyph;
// load glyph
err = FT_Load_Char(faceHandle,
charcode,
FT_LOAD_NO_BITMAP | FT_LOAD_NO_SCALE);
if (err) {
std::cout << "FT_Load_Glyph: error\n";
}
//FT_Get_Glyph(faceHandle->glyph, &glyph);
FT_Outline outline = faceHandle->glyph->outline;
if (faceHandle->glyph->format != ft_glyph_format_outline) {
std::cout << "not an outline font\n";
}
FT_Outline_Funcs funcs;
funcs.move_to = (FT_Outline_MoveTo_Func)&moveTo;
funcs.line_to = (FT_Outline_LineTo_Func)&lineTo;
funcs.conic_to = (FT_Outline_ConicTo_Func)&conicTo;
funcs.cubic_to = (FT_Outline_CubicTo_Func)&cubicTo;
// trace outline of the glyph
err = FT_Outline_Decompose(&outline,
&funcs, nullptr);
if (err) {
std::cout <<ft_errors[err].err_msg ;
}
现在,在像moveTo()这样的回调中,我尝试调整大小:
int moveTo(FT_Vector* to, void* fp) {
pathRef->moveTo(ftVecToFloat(to)); ///
// ftVecToFloat is "float(f) / 64.0f" ///
return 0;
}
但是最初的FT_Vector值是如此之大,以至于除以64.0仍然无关紧要。
最佳答案
组
funcs.shift = 0;
funcs.delta = 0;
将工作