使用Freetype / Harfbuzz渲染文本并对其着色

时间:2015-07-10 04:41:45

标签: freetype2 harfbuzz

我在Freetype中渲染了一个文本,并使用Freetype将其转换为位图。创建的位图存储在一个字符数组中,后来由Targa Reader处理成.tga图像。现在,如何以及何时分配当我将字形转换为位图时,字形的颜色是否应该使用Freetype或Harfbuzz来为它着色?

2 个答案:

答案 0 :(得分:1)

harfbuzz在这里并不是很相关,因为它并不关心渲染方面本身。

但是freetype,正如通常的使用方式(考虑到不讨论颜色表情符号或其他我不熟悉的边缘情况),FT_RENDER_MODE_NORMAL渲染模式,为您提供一个灰度位图,每个像素分配一个字符,不像彩色图像它需要3倍的大小(如果你还有4个alpha通道也需要4个),并且它并不关心颜色AFAIK所以你需要做的就是将freetype渲染的灰度输出乘以你想要的颜色。像这样的伪代码:

coloredImage[x, y].r = r * grayScale[x, y] / 255;
coloredImage[x, y].g = g * grayScale[x, y] / 255;
coloredImage[x, y].b = b * grayScale[x, y] / 255;

答案 1 :(得分:1)

我不认为harfbuzz会为你做这样的事情,它只是一个塑造库。 但是对于freetype,据我所知,有两种方法可以绘制字形并将它们绘制成位图。 第一。我猜,默认情况下,它会将字形渲染为灰度位图。 第二。您可以通过向freetype引擎发送一些回调来控制渲染字形,而不是freetype这样做,它调用这些函数,其中一个用于绘制扫描线跨度的alpha,coverage,x和y参数,以便您轻松操纵位图。

你可以在freetype的一个示例源代码中找到更多关于我所说的内容@ freetpye.org

如果你发现它太复杂而我认为不是这样,如果你渲染的位图都是灰色的,你想要应用自己的颜色,正如Ebrahim建议的那样,你可以使用位图&#39 ;像素值为alpha并执行以下操作:

unsigned char alpha = src[x, y];
red = color.r * alpha / 0xff;
green = color.g * alpha / 0xff;
blue = color.b * alpha / 0xff;
dst[x, y] = Color(red, green, blue);

希望他们可以提供任何帮助。