XDrawString

Glynn Clements glynn at gclements.plus.com
Fri Dec 16 22:34:35 PST 2005


Russell Shaw wrote:

> >>To draw strings aligned with a left margin, should i use x=0:
> >>
> >>   char *string;
> >>   ...
> >>   XDrawString(display, window, gc, 0, y, string, strlen(string));
> >>
> >>or am i supposed to use lbearing? :
> >>
> >>   XFontStruct *font;
> >>   ...
> >>
> >>   int x = font->per_char[(int)str[0]].lbearing;
> >>
> >>   XDrawString(display, window, gc, -x, y, string, strlen(string));
> > 
> > For most practical purposes, you should be using x=0. That will result
> > in lbearing blank pixel columns before the first drawn pixel. I can't
> > think of a practical situation where you might want to use -lbearing.
> > 
> > Apart from anything else, using x=0 is necessary for lines of text
> > using a monospaced font to align.
> 
> I wasn't sure if the lbearing of all chars is the same.

It isn't.

> If lbearing was
> the same for all chars, then why have it? If it wasn't the same, then
> text wouldn't align on the left margin.

Making text "aligned" doesn't mean having the leftmost non-blank
pixels all occur in the same pixel column. Some glyphs are meant to
have more space on one side or the other.

> Hmm, maybe the lbearing space is for the cursor?

No, the space around a glyph is so that it doesn't visually merge with
its surroundings.

In most cases, you don't need to know the bounds of the non-blank
portion of the glyph. You just need the bounds of the glyph as a
whole, i.e. the values from the width field of each character and the
ascent and descent fields from the XFontStruct (not those in the
XCharStruct fields).

IOW, each glyph is just a rectangle; the program has no need to know
which pixels are filled and which are blank.

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



More information about the xorg mailing list