[cairo] Cairo transforms

Behdad Esfahbod behdad at behdad.org
Wed Feb 25 16:04:18 PST 2015


Would be easier to help you if you attach a complete C program that saves the
surface to PNG (using cairo), so people can run the test and find the problem.
 Though I guess you probably have figured it out by now.

behdad

On 15-02-23 11:57 AM, Wouter Klouwen wrote:
> Hello,
> 
> For my application I'm using Cairo & Pango to do some font rendering and have
> stumbled into a bit of a problem.
> 
> The text I'm rendering goes into a surface and that surface data is loaded
> into a texture, which is displayed via OpenGL. But I need to rotate the text
> around a pivot point. I want to do this in Cairo so that the texture can
> remain pixel aligned and the font re-rendered with the appropriate rotation.
> 
> To start off with, I measure the texture with Pango's layout and transform the
> rectangle with their matrix to get the correct bounding box for the text:
> 
>         int             textureWidth, textureHeight;
> 
>        // set up font layout, etc..
>         pango_layout_set_text(layout, testText.c_str(), testText.size());
>         pango_layout_context_changed(layout);
>        // Measure
>         pango_layout_get_size(layout, &textureWidth, &textureHeight);
> 
>         textureWidth = FROM_PANGO_SCALE(textureWidth);
>         textureHeight = FROM_PANGO_SCALE(textureHeight);
> 
>         PangoMatrix matrix = PANGO_MATRIX_INIT;
>         pango_matrix_translate(&matrix, -textureWidth * 0.5, -textureHeight *
> 0.5);
>         pango_matrix_rotate(&matrix, double(rotation) * (180.0 / M_PI));
>         pango_matrix_translate(&matrix, textureWidth * 0.5, textureHeight * 0.5);
> 
>         PangoRectangle rect = { 0, 0, textureWidth, textureHeight };
>         pango_matrix_transform_pixel_rectangle(&matrix, &rect);
> 
> Then I create the surface of the dimensions calculated, do the same transform
> with Cairo and draw the text as a path:
> 
>            cairo_surface_t *surface = cairo_image_surface_create_for_data(...);
> 
>             cairo_t *renderContext = cairo_create(surface);
>             cairo_translate(renderContext, -textureWidth * 0.5, -textureHeight
> * 0.5);
>             cairo_rotate(renderContext, rotation);
>             cairo_translate(renderContext, textureWidth * 0.5, textureHeight *
> 0.5);
> 
> 
>             // Render text
>             cairo_new_path(renderContext);
>             cairo_move_to(renderContext, 0, 0);
> 
>            // Set some render options..
> 
>             pango_cairo_update_layout(renderContext, layout);
> 
>             pango_cairo_layout_path(renderContext, layout);
>             cairo_fill(renderContext);
> 
> No matter what, I can't seem to get the last cairo_translate to do anything,
> it always keeps rotating the text around 0, 0. I've tried creating some
> cairo_matrix_ts and multiplying those, then applying that matrix to the
> cairo_t. I've even tried calculating the matrix with a third party library
> just to ensure it was correct and setting it with that.
> 
> Can someone please enlighten me as to what I'm doing wrong?
> 
> Thanks,
>      W

-- 
behdad
http://behdad.org/


More information about the cairo mailing list