繁体   English   中英

Freetype 在位图中渲染废话

[英]Freetype renders crap in bitmap

我正在尝试创建单色字形图集,但遇到了问题。 Freetype 在字形位图中呈现“废话”。 我责怪 freetype 因为一些字形仍然正确渲染。

生成的纹理图集:

纹理图集

为什么会这样,我该如何解决?

但是我仍然可能是错的,这里是位图处理代码:

static std::vector<unsigned char> generateBitmap(FT_Face &face, unsigned int glyph, size_t *width, size_t *height) {
        FT_Load_Glyph(face, FT_Get_Char_Index(face, glyph), FT_LOAD_RENDER | FT_LOAD_MONOCHROME );

        FT_Bitmap bitmap;
        FT_Bitmap_New(&bitmap);
        FT_Bitmap_Convert(ftLib, &face->glyph->bitmap, &bitmap, 1);
        *width = bitmap.width;
        *height = bitmap.rows;


        std::vector<unsigned char> result(bitmap.width * bitmap.rows);//
        for (size_t y = 0; y < bitmap.rows; ++y)
        {
            for (size_t x = 0; x < bitmap.width; ++x)
            {
                result[(bitmap.width * y) + x] = bitmap.buffer[(bitmap.width * y) + x];
            }

        }
        FT_Bitmap_Done(ftLib, &bitmap);
        return result;
    }

以及将其放在主缓冲区的代码:

        static void putOnBuffer(std::vector<unsigned char> &buffer, std::vector<unsigned char> &bitmap, size_t height, size_t width) {
        int r = 0;
        while (r < height) {
            int w = 0;
            while (w < width) {
                //assume buffer is enough large
                size_t mainBufPos = ((currentBufferPositionY + r) * imageWidth) + (currentBufferPositionX + w);
                size_t bitmapBufPos = (r * width) + w;
                buffer[mainBufPos] = clamp(int(bitmap[bitmapBufPos] * 0x100), 0xff);
                w++;
            }
            r++;
        }
    }

从文档:

将深度为 1bpp、2bpp、4bpp、8bpp 或 32bpp 的位图对象转换为深度为 8bpp 的位图对象,使使用的字节数 [] 行(也称为“间距”)成为“对齐”的倍数。

在您的代码中,您在调用FT_Bitmap_Convert将 1 作为alignment参数的值FT_Bitmap_Convert 在单色中,一个字节将是 8 个像素,因此水平渲染循环需要强制执行 8 的倍数作为宽度。

参考: https : //www.freetype.org/freetype2/docs/reference/ft2-bitmap_handling.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM