如何使用freetype2访问单色位图中的像素状态

时间:2018-09-10 09:21:24

标签: c++ freetype

这是一个代码段:

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,我也无法弄清楚,谁能帮忙?

1 个答案:

答案 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 % 87