# [cairo] Extents under rotation

Donn donn.ingle at gmail.com
Sun Dec 1 04:59:26 PST 2013

```Hi,
you rotate a matrix, draw something and then use path_extents to measure
it, you get a result that's bigger than it should be.

Here's a demo in Vala:

---

// valac --pkg cairo badextents.vala -o test
// View the img.png file after running "test"

using Cairo;
void main(string[] args) {

double x1;
double x2;
double y1;
double y2;

Cairo.ImageSurface surface = new Cairo.ImageSurface
(Cairo.Format.ARGB32, 500, 500);
Cairo.Context cr = new Cairo.Context (surface);

//centre the axes - 0,0 in middle
var matrix = Cairo.Matrix (1, 0, 0, 1, 250,250 );
matrix.scale (1, 1);
cr.transform(matrix);

cr.arc (0.0, 0.0, 30.0, 0, 2*Math.PI);
cr.set_source_rgb(1,0,0);
cr.fill_preserve();

cr.path_extents (out x1, out y1, out x2, out y2);
stdout.printf("Extents: %G|%G|%G|%G\n", x1,y1,x2,y2);
//Draw the bbox as calculated by extents
cr.rectangle(x1,y1,(x2-x1),(y2-y1));
cr.set_source_rgb(0,0,0);
cr.stroke();

//Now, rotate that circle 45 degrees (and move it over a bit)
cr.translate(90,0);
cr.rotate((Math.PI/180.0)*45); //45 degree rot

cr.arc (0.0, 0.0, 30.0, 0, 2*Math.PI);
cr.set_source_rgb(1,0,0);
cr.fill_preserve();

cr.path_extents (out x1, out y1, out x2, out y2);
stdout.printf("Extents: %G|%G|%G|%G\n", x1,y1,x2,y2);
//Draw the bbox as calculated by extents -- this is wrong.
//Why is the rect so much bigger?
//Is there any way to get the proper user-space coords?
cr.rectangle(x1,y1,(x2-x1),(y2-y1));
cr.set_source_rgb(0,0,0);
cr.stroke();

surface.write_to_png ("img.png");
}
---

Is there a way to get the user-space extents of that second circle such
that the rect fits properly?

In my other code, I am doing an identity_matrix() and then extents. This
gives me a rect in device space, which is fine. However, I also need
that rect in user space.

\d
```