文字渲染在折线上

具体的代码实例在examples/trans_curve1.

如下是说明:

> I've tried to reproduct method of text on curve rendering, which is used in
> trans_curve example in agg. It works fine in most cases, except when
> polyline (i'm trying to render text along polyline) has sharp corners. In
> this case trans_single_path deforms letters and some letters become
> unreadable.
> 
> I've read in this newsgroup, that i need to manually calculate each letter
> place and angle, then render it. Can AGG help me to do this, or i must do
> this manually ? Thanks!

The idea is pretty simple. In this example agg::trans_single_path is created
and initialized. Then it's used in the pipeline. But it can also be used
directly to calculate the orientation vector for each glyph:

double x1 = glyph_x;
double y1 = 0;
double x2 = glyph_x + glyph_advance_x;
double y2 = 0;
tcurve.transform(&x1, &y1);
tcurve.transform(&x2, &y2);
After that you have x1,y1,x2,y2 that defines the position and orientation of
the glyph. You can use a regular affine matrix to transform the whole glyph:

agg::trans_affine mtx;
mtx *= agg::trans_affine_line_segment(x1, y1, x2, y2, 0);
mtx *= . . . // Other possible transformations.

Now you have an affine matrix you can use in the pipeline to render a vector
glyph. Note that in this case you don't need the agg::conv_segmentator in the
pipeline. The pipeline will look like this:

typedef agg::conv_curve<font_manager_type::path_adaptor_type>
    conv_font_curve_type;

typedef agg::conv_transform<conv_font_curve_type, agg::trans_affine> 
    conv_font_trans_type;

conv_font_curve_type fcurves(m_fman.path_adaptor());
conv_font_trans_type ftrans(fcurves, mtx);


你可能感兴趣的:(文字,agg)