[cairo] Cairo transforms

Wouter Klouwen cairo at dublet.org
Fri Feb 27 04:30:27 PST 2015


I have indeed figured it out. For anyone who's interested, I changed the 
transform to this:

             cairo_translate(renderContext, rect.width * 0.5, 
rect.height * 0.5);
             cairo_rotate(renderContext, rotation);
             cairo_translate(renderContext, -textureWidth * 0.5, 
-textureWidth * 0.5);

Basically, switching the order of the two translations and changing the 
final center point.

Hope that helps anyone figuring out the same.

Thanks,
      W

On 26/02/2015 00:04, Behdad Esfahbod wrote:
> 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



More information about the cairo mailing list