这是一个代码段:
wchar_t wc=L"か";
FT_UInt glyph_index = FT_Get_Char_Index(face, wc);
FT_Load_Glyph(face, glyph_index, FT_LOAD_DEFAULT);
if(face->glyph->format !=ft_glyph_format_bitmap)
{
FT_Render_Glyph(face->glyph, FT_RENDER_MODE_MONO);
}
FT_GlyphSlot slot = face->glyph;
int rows = slot->bitmap.rows;
int cols = slot->bitmap.width;
for (int i = 0; i < rows; ++i)
{
for (int j = 0; j < cols; ++j)
{
int off = i * slot->bitmap.pitch + j / 8;
if (slot->bitmap.buffer[off] & (0xC0 >> (j % 8)))
{
//do something if above condition met
}
}
那么,如何理解变量off
和条件slot->bitmap.buffer[off] & (0x80 >> (j % 8))
?
实际上,可以找到类似的情况here。功能定义如下:
bool glyphBit(const FT_GlyphSlot &glyph, const int x, const int y)
{
int pitch = abs(glyph->bitmap.pitch);
unsigned char *row = &glyph->bitmap.buffer[pitch * y];
char cValue = row[x >> 3];
return (cValue & (128 >> (x & 7))) != 0;
}
基本上与上面的代码段等效,因此我相信存在像素索引标准,但是即使使用freetype2的official document,我也无法弄清楚,谁能帮忙?
答案 0 :(得分:0)
根据文档,FT_RENDER_MODE_MONO
表示您正在使用每像素一位格式呈现单色位图。这意味着您刚渲染过的位图的每个字节代表1行8列。为了检查是否在位图中设置了j列中的像素,必须检查行中的第j位。
off
现在应该更有意义... i * slot->bitmap.pitch + j / 8
获得像素所在的 byte 的偏移量。这就是为什么它每8列仅增加1。毕竟,您不能使用位指定的偏移量进行内存读写。
但是,您提供的测试代码看起来有些错误。第二个版本使用128
,其二进制表示形式为10000000
。 >> (x & 7)
依次获取每个连续的位,然后可以按位与像素所在的字节进行按位与运算,以检查像素是否真正打开。您的代码的第一个版本使用0xC0代替,它具有按位表示形式11000000
,因此测试实际上并没有真正完成您想要的操作(它正在检查 j 和设置 j + 1 个像素,除非j % 8
为7
)