Hello,<br><br>I finally found some time to go deeper in understanding how the translations for my case work.<br><br>For the one's that are interested in the solution:<br><br>static void event_to_update(GtkWidget *widget, gpointer input_data)<br>
{<br>  cairo_t *cr;<br>  int w, h;<br>  int x_origin, y_origin;<br>  cairo_matrix_t new_matrix;<br>  int *angle_s = input_data;<br><br>  //Load an image from a file<br>  cairo_surface_t *surf1 = cairo_image_surface_create_from_png("./images/Untitled-1c.png");<br>
  w = cairo_image_surface_get_width (surf1);<br>  h = cairo_image_surface_get_height (surf1);<br><br>  //Create the cairo context<br>  cr = gdk_cairo_create (widget->window);<br><br>  //Initialize the image to black transparent<br>
  cairo_set_source_rgba(cr, 0, 0, 0, 1);<br>  cairo_paint(cr);<br><br>  x_origin = w/2;<br>  y_origin = h/2;<br><br>  cairo_translate (cr, x_origin, y_origin);<br>  cairo_rotate (cr, (2*3.14*angle_s/360));<br>  cairo_translate (cr, -x_origin, -y_origin);<br>
<br>  // ADD OFFSET. NOTE: The offset is upper left corner of the image.<br>  cairo_get_matrix(cr, &new_matrix);<br>  new_matrix.x0 += 100; //Add the x offset. <br>  new_matrix.y0 += 100; //Add the y offset.<br>  cairo_set_matrix(cr, &new_matrix);<br>
<br>  cairo_set_source_surface(cr,surf1, 0, 0);<br>  cairo_paint(cr);<br><br>  //Destroy the cairo context<br>  cairo_destroy(cr);<br><br>  cairo_surface_destroy(surf1);<br>}<br><br>Best regards,<br>Blagoj<br><br><div class="gmail_quote">
On Tue, Mar 5, 2013 at 10:32 PM, Milan Sreckovic <span dir="ltr"><<a href="mailto:msreckovic@mozilla.com" target="_blank">msreckovic@mozilla.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word">translate(-50,-50)<div>rotate(angle)</div><div>translate(320,160)</div><div>set source surface(0,0)</div><div><span class="HOEnZb"><font color="#888888"><br><div>
<div>Milan</div>

</div></font></span><div><div class="h5">
<br><div><div>On 2013-03-05, at 4:24 PM, Blagoj Kupev <<a href="mailto:bkupev@gmail.com" target="_blank">bkupev@gmail.com</a>> wrote:</div><br><blockquote type="cite">Hello,<br>I might have problems describing what i'm trying to achieve, so let my try to explain it using some graphics. What i need to do is to place a gauge instrument at display that i'd like to rotate according to the input value. So i'm using a simple png image:<br>

+-------+<br>|---o    |<br>+-------+<br>image 1<br><br>The image 1 is with size of 100x100 pixels. Please note that the corners are invisible, so only the arrow is visible. What i'd like to achieve is to put it on window with size of 640x320 (fixed size) on bottom middle part of the window. When i tried to do this I'm noticing that the arrow image is not placed always at same place and the placement is dependent of the rotation angle.<br>

It seem that regardless of the placement of the origin of the image prior and after the rotation, cairo is using original image when cairo_set_source_surface is applied.<br><br>This would mean that when the rotation is applied, the second cairo_transform is still calculated according to the original image and then the offset will be according to top-left corner of the original image.<br>

<br>So now I'm wondering is there a simple method to rotate and place the original image at predefined offsets in the window or i should make complex CTM that will do this?<br><br>Thanks,<br>Blagoj  <br><br><div class="gmail_quote">

On Tue, Mar 5, 2013 at 9:05 PM, Bill Spitzak <span dir="ltr"><<a href="mailto:spitzak@gmail.com" target="_blank">spitzak@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">

<div>On 03/04/2013 11:15 PM, Carlos López González wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
Hi Blagoj,<br>
I don't think it is a bug I think that you need to do one extra step:<br>
If alpha is the angle (ccw), origin is the rotation center (in device<br>
units) and w,h are the final image dimensions you have to do this:<br>
<br>
cairo_translate(cr, origin.x, origin.y);<br>
<br>
cairo_rotate(cr, -1.0*angle);<br>
<br>
cairo_translate(cr, -origin.x, -origin.y);<br>
<br>
cairo_set_source_surface(cr, source, x, y);<br>
<br>
where x and y are the result of the minimum x and minimum y of the<br>
clockwise rotated corners<br>
of the source surface top_left(0,0), top_right(w, 0), bottom_left(0, h)<br>
and bottom_right(w, h).<br>
</blockquote>
<br></div>
So you are saying the xy arguments for cairo_set_source_surface are the location to put the top-left corner of the bounding box of the transformed image? That's totally useless and very hard to believe! The only way to get a predictable result is for both Cairo and the caller to do the exact same bounding box calculation, thus they both have to do the transform?<br>


<br>
I'm pretty certain the xy cause a translation from some location that Cairo considers "natural" and that it is either in the source surface space (that might be useful) or in the CTM (in which case another cairo_translate would do the same thing). I know I have gotten correct transforms out of Cairo, though it is not easy. I think this was done by passing 0,0 for the x,y.<div>

<div><br>
<br>
-- <br>
cairo mailing list<br>
<a href="mailto:cairo@cairographics.org" target="_blank">cairo@cairographics.org</a><br>
<a href="http://lists.cairographics.org/mailman/listinfo/cairo" target="_blank">http://lists.cairographics.<u></u>org/mailman/listinfo/cairo</a><br>
</div></div></blockquote></div><br>
-- <br>cairo mailing list<br><a href="mailto:cairo@cairographics.org" target="_blank">cairo@cairographics.org</a><br><a href="http://lists.cairographics.org/mailman/listinfo/cairo" target="_blank">http://lists.cairographics.org/mailman/listinfo/cairo</a></blockquote>
</div><br></div></div></div></div></blockquote></div><br>