游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4117|回复: 8

FreeType中同样字号不同的字,宽高不一致。

[复制链接]

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-9-1 10:43:00 | 显示全部楼层 |阅读模式
同样大小字号的字“我”和“吧”二个汉字,加载并转换成位图形式:用函数
FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
得到这二个汉字的bitmap,结果发现“我”字的width = 14,row = 14,而“吧”字的        width = 12,row = 11,从而导致的结果就是一排字参差不齐,这个怎么解决呀?!

2

主题

36

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2009-9-1 11:40:00 | 显示全部楼层

Re:FreeType中同样字号不同的字,宽高不一致。

做一个调整器 生成一张新图 比如:14X14 然后将每个字体的图片居中写入 比如12X11 的"吧" 写入时 将Width+(14-12)/2,row+(14-11)/2 就OK了 调整后的字体图片在生成一个二进制文档 写入汉字时 读入二进制文档中保存的切片信息

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-9-1 13:19:00 | 显示全部楼层

Re:FreeType中同样字号不同的字,宽高不一致。

每个字的大小本身就不一样。

FreeType给出的字体信息中,有关于字的显示偏移坐标信息。在显示时加上那个偏移,就可以显示排列整齐了。

FT_GlyphSlot slot = face->glyph;

绘字时需要将图片偏移加上slot->bitmap_left,slot->bitmap_top

另外计算排版时,整个字的宽高使用slot->advance.x,slot->advance.y这两个值

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2009-9-1 14:38:00 | 显示全部楼层

To hyzboy


//计算位置时画到纹理上的位置时我加了slot->bitmap_left,slot->bitmap_top
dst = m_textures.buffer + row * m_FontSize  * lineByte+ col * m_FontSize * 4 + ( m_FontSize - m_FT_Face->glyph->bitmap_top) * lineByte+  m_FT_Face->glyph->bitmap_left * 4;

//然后把字体位图拷到Texture上去。
for (int i = bitmap.rows - 1; i >= 0 ; --i)
{
   unsigned char *src = bitmap.buffer + (i * bitmap.pitch);
   unsigned char* temp = dst;
   for (int j = 0; j < bitmap.width; ++j)
   {
        *dst++ = 0x00;
        *dst++ = 0x00;
        *dst++ = 0x00;
        *dst++ = *src++;                                               
   }
   dst = temp +  lineByte;
}
在纹理中显示出来的结果还是参差不齐,如图所示:

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2009-9-1 14:45:00 | 显示全部楼层

字体纹理图!

纹理中的字体参差不齐!

2万

主题

2万

帖子

6万

积分

论坛元老

Rank: 8Rank: 8

积分
66489
QQ
发表于 2009-9-1 15:57:00 | 显示全部楼层

Re:FreeType中同样字号不同的字,宽高不一致。

top值你用反了!

freetype给的字是以左下角为0,0的,你把 +bitmap_top 改成 -bitmap_top

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2009-9-1 16:25:00 | 显示全部楼层

To hyzboy

还是不对呀,可能是你误会我的想法了,我是想把字写入纹理的时候就排好版,所以我把bitmap_left与bitmap_top偏移用在了纹理的指针上。而不是从纹理中读出来显示的时候排版。下面是用+号所得到的纹理图!

3

主题

101

帖子

101

积分

注册会员

Rank: 2

积分
101
发表于 2009-9-1 17:55:00 | 显示全部楼层

Re:FreeType中同样字号不同的字,宽高不一致。

freetype的图像是以origin为起点的
你需要以m_ftFace->glyph->metrics.horiBearingX,m_ftFace->glyph->metrics.horiBearingY偏移.

可能是,,为了节省空间,,,左边及上边,为空的这些地方就不用分配内存了.
还有,下边, 右边也有为空的,,
这时,你画的时候只能画m_ftFace->glyph->bitmap.width,
m_ftFace->glyph->bitmap.rows;//高
不能超出.

53

主题

98

帖子

101

积分

注册会员

Rank: 2

积分
101
 楼主| 发表于 2009-9-2 17:14:00 | 显示全部楼层

Re: FreeType中同样字号不同的字,宽高不一致。

感谢hyzboy,感谢luoqi,感谢胖胖猫,感谢CCTV,感觉所有TV! [em2]
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-21 01:25

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表