问题描述
使用ttc或者ttf文件配合freestyle库
1、实现字体加粗
2、通过输入像素大小,控制字体位图大小
解决方案
解决1:字体加粗可以通过输出位图,以模拟加粗效果。首先绘制文本的底层,然后再绘制相同的文本,但稍微偏移一些,例如在 x 和/或 y 方向上。这种方法可能不够理想,但可以在某些情况下实现较好的效果。比较麻烦,有实现的朋友可以@我,交流学习下~
然后我在阅读了freestyle.h文件后惊喜发现FT_FaceRec_结构体中有成员style_flags,那不是可以直接设置FT_STYLE_FLAG_BOLD,完美。
结果还是失败了。。。
最后我突发奇想,为什么不引入一个新的_face_bold指针,来专门打开加粗的ttf或者ttc文件。
注:这些文件windows系统中自带,路径 C:\Windows\Fonts
解决2:
一般情况下,我们指定文本大小都是指定像素大小,但是freestyle中配合像素的函数FT_Set_Pixel_Sizes,在设置之后,存在中文会乱码。所以不得不通过像素转换为固定点大小(以 1/64 像素为单位表示的字符高度)以适配FT_Set_Char_Size函数。
实现代码如下:
#include <ft2build.h>
FT_Face _face;
FT_Face _face_bold;
void LoadTexture(wchar_t c,bool bold, int pixelsize)
{
auto LoadGraph2Texture = [&](FT_Face& face,bool bold) {
FT_Error error;
if (face == NULL)
{
if(bold)
error = FT_New_Face(_ftLibrary, "./font/msyhbd.ttc", 0, &face);
else
error = FT_New_Face(_ftLibrary, "./font/msyh.ttc", 0, &face);
if (error == FT_Err_Unknown_File_Format)
{
LOG("the font file could be opened and read, but it appears that its font format is unsupported");
return;
}
else if (error)
{
LOG("another error code means that the font file could not be opened or read, or that it is broken");
return;
}
}
// 使用FT_Set_Char_Size ,这里使用FT_Set_Pixel_Sizes会导致中文模糊
HDC hdc = GetDC(NULL); // 获取屏幕设备上下文
int dpiX = GetDeviceCaps(hdc, LOGPIXELSX); // 获取水平方向的 DPI
int dpiY = GetDeviceCaps(hdc, LOGPIXELSY); // 获取垂直方向的 DPI
ReleaseDC(NULL, hdc); // 释放设备上下文
int pixels = ct.size;
int pointsX = ((pixels * 64 + dpiX / 2) / dpiX) * 64;
int pointsY = ((pixels * 64 + dpiY / 2) / dpiY) * 64;
error = FT_Set_Char_Size(face,pointsX,pointsY,dpiX,dpiY);
//该方法不成功,好像和字体本身是否带有bold有关系。
//face|= FT_STYLE_FLAG_BOLD;
FT_UInt glyph_index = FT_Get_Char_Index(face, c);
error = FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
error = FT_Render_Glyph(face->glyph, FT_RENDER_MODE_NORMAL);
......
};
if (ct.bold)
LoadGraph2Texture(_face_bold,true);
else
LoadGraph2Texture(_face,false);
}