[cairo] Cairo transforms

Wouter Klouwen cairo at dublet.org
Mon Feb 23 11:57:27 PST 2015


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());
        // 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_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_move_to(renderContext, 0, 0);

            // Set some render options..

             pango_cairo_update_layout(renderContext, layout);

             pango_cairo_layout_path(renderContext, layout);

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?


More information about the cairo mailing list