freetype-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

RE: [ft-devel] Rotated text


From: Graham Asher
Subject: RE: [ft-devel] Rotated text
Date: Sun, 6 Jul 2008 12:18:51 +0100

Frank,

I'm sorry that I don't have time to look at your example, but I have
successfully drawn rotated text (and text along a path, for that matter)
using FreeType, and I can give you some pieces of advice.

1. Either (i) use an FT_Matrix to set the font transform (call
FT_Set_Transform), or (ii), create an unrotated outline glyph for each
character and then rotate it using FT_Glyph_Transform. I assume from the
fact that you say that your code 'spins' the text that you know how to set
the transform parameters.

2. Use the advance vector after it has been transformed. This is
outline_glyph->root.advance (assuming that outline_glyph is your
FT_OutlineGlyph object), and is a 16.16 fixed-point number. You will need to
keep track of the current glyph origin in 16.16 format, to avoid the text
'looking like arse', because...

3. When you rasterize every glyph except the first one, it needs to be
offset to the sub-pixel position of its origin. For example: if your first
glyph has an unrotated baseline length of 8 pixels and you rotate the text
by 20 degrees, the rotated advance will be (8 * cos 20,8 * sin 20) = (7.518,
2.736). Thus, if your first glyph origin was at (0,0), your second glyph
origin needs to be at (7.518,2.736) to avoid a jiggling effect. Do this by
applying an offset of the fractional parts of the coordinates to each glyph
as you rasterize it, then drawing the glyph at the integer coordinates.
Thus, in this example, you need to offset the glyph by (0.518,0.736) and
draw at (7,2). FreeType works in 64ths of pixels when rasterizing, so you do
this by calling FT_Glyph_Transform with a delta argument of (0.518 *
64,0.736 * 64) = (33,47) before converting the outline glyph to a bitmap.

4. Rotated text looks much better when it is anti-aliased. But you knew that
already ;-)

This advice is based on working code used in the CartoType project
(www.cartotype.com).

Best regards,

Graham Asher
Cartography Limited.


-----Original Message-----
From: address@hidden
[mailto:address@hidden On
Behalf Of Frank W. Miller
Sent: 06 July 2008 05:07
To: address@hidden
Subject: Re: [ft-devel] Rotated text


OK, lets try this again.

I've posted the source code for what I'm trying to do.  If you build
this application you can run it with these arguments:

rotate <font> <text>

where <font> is a TrueType font file and <text> is some string text,
e.g. "text".

This should get you the text spinning inside of a 640x480 window.  The
trouble is, as you'll see, its looks like arse.  The characters are not
aligned as they should be.  Any advice on this would be very helpful.

The source code is at:

http://sipuseragent.net/download/rotate.tgz


Thanks,
FM



On Thu, 2008-07-03 at 23:03 -0600, Frank W. Miller wrote:
> Greetings,
> 
> I've been wrestling with rotated text.  I've read all the documentation
> and have been working with the example code.  I'm having some real
> trouble understanding how the advance, width, and rows fields in the
> rendered bitmap can be used to compute a bbox.  Here's what I'm really
> hoping can be done:
> 
> 
> The following image is supposed to be the word "text" rotated up by
> about 15 degrees or so off the x axis.  Sorry, my ascii rendering is not
> what it could be.  The rendered text is supposed to be inside a bounding
> box, or at least, why I think of as a bounding box.
> 
>                                      [w,h]
>     +---------------------------------+
>     |                          *  *   |
>     |              *      *    **     |
>     |           *     *  *    * *     |
>     |  *  *   *   *      *       *   *|
>     |  **     *  *      *   *     **  |
>     | * *      *    *  *              |
>     |   *   *     *                   |
>     |    **                           |
>     +---------------------------------+
>    [0,0]
> 
> So, taking the sample code, to get [w,h], I've tried to just sum up the
> advance.x and advance.y fields after each glyph rendering.  That doesn't
> seem quite right.  When I actually render the text, it appears to go off
> to the left a little from what I feed the bitmap routine as [0,0].  I
> suppose I need to take into account the width and rows fields in the
> bitmap too but I'm not sure how to do it.
> 
> This may be completely out to lunch, but if anyone has any suggestions,
> I'd appreciate it.
> 
> Thanks,
> FM






reply via email to

[Prev in Thread] Current Thread [Next in Thread]