Trying to figure out how to render a single character represented by a FT_Bitmap in X

Glynn Clements glynn at gclements.plus.com
Sat Feb 16 00:27:14 PST 2013


joe M wrote:

> I am trying to figure how to print one character from a FT_Bitmap
> (freetype2 bitmap).
> 
> But, I am not able to get the character to display properly. I seem to
> be missing something simple.
> 
> I seem to be missing something simple while creating the X pixmap
> based on the FT_Bitmap.buffer.
> 
> Any thoughts, please?

>   error = FT_Load_Char( face, 'z', FT_LOAD_RENDER );

This calls FT_Render_Glyph with a mode of FT_RENDER_MODE_NORMAL, which
generates an 8-bpp antialiased image, whereas ...

>          p = XCreateBitmapFromData(d, w,
>                slot->bitmap.buffer, slot->bitmap.width ,
>                      slot->bitmap.rows);

... this expects a 1-bpp monochrome bitmap. Pass FT_LOAD_MONOCHROME to
FT_Load_Char to get a monochrome bitmap instead of a grey-scale image.

Also: you're ignoring the bitmap's pitch (slot->bitmap.pitch). The
bitmap created by FT_Load_Char isn't guaranteed to be "packed", but
XCreateBitmapFromData() requires it to be. Also, the data in
slot->bitmap.buffer can be top-to-bottom (positive pitch) or
bottom-to-top (negative pitch), but XCreateBitmapFromData() only
supports the former.

You can get more flexibility by creating an XImage from the data then
drawing the XImage into a Pixmap. Or you could just convert the data
manually.

>          XWriteBitmapFile(d,"test1.bmp",p,slot->bitmap.width,slot->bitmap.rows,0,0);

The ".bmp" extension is normally used for Microsoft Windows "bitmap"
(BMP) files. XWriteBitmapFile() generates an "X bitmap" (XBM) file,
which normally has either a ".xbm" extension or no extension (see the
files in /usr/include/X11/bitmaps).

-- 
Glynn Clements <glynn at gclements.plus.com>


More information about the xorg mailing list