[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