Cairo transforms

Wouter Klouwen <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
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
-- 
cairo mailing list
[email protected]
http://lists.cairographics.org/mailman/listinfo/cairo
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.