Re: Cairo transforms

Behdad Esfahbod <[email protected]>
Newsgroups gmane.comp.lib.cairo
Message-ID <[email protected]>
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/
-- 
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.