[cairo] translating from coordinates to user space

Bill Spitzak spitzak at thefoundry.co.uk
Tue Mar 10 16:14:17 PDT 2009

Matt Bartolome wrote:
> Hi,
> I'm new to cairo and had a couple questions about scale. What I would
> like to do is draw my image in the data's geographic coordinate system
> then translate it to pixel space. Lets say the extent of the data is
> 2000,1000, 4000, 2000 (xmin,ymin,xmax,ymax). Once I have finished
> drawing all the vectors in that coordinate system I would like to just
> translate it to a 0,0 origin with appropriate x and y max so it fits
> on the image (using svgsurface). Or, maybe even scale the drawing to a
> predefined width like 1200px 400px and distort the x and y to fit the
> space. I've been looking at the scale and translate functions but I
> don't quite get it.
> Does anybody have an example of this type of thing? Any advice would
> be appreciated!

I'm guessing you don't want to distort the image, and that instead you 
want to center it in the output.

If the output rectangle has a size width,height:

   // save the transform before messing with it:

   // Find the center of your data:
   center_x = (xmax+xmin)/2;
   center_y = (ymax+ymin)/2;

   // Translate that to 0,0:
   cairo_translate(cr, -center_x, -center_y);

   // find the scaling factor:
   scale_x = width/(xmax-xmin);
   scale_y = height/(ymax-ymin);
   scale = min(scale_x, scale_y);

   // scale the image to fit:
   cairo_scale(cr, scale, scale);

   // put it back in center of output rectangle:
   cairo_translate(cr, width/2, height/2);

   // now draw all your diagram using the original coordiantes:

   // put the transform back

Bill Spitzak, Senior Software Engineer
The Foundry, 618 Hampton Drive, Venice, CA, 90291, USA
Tel: +1 310 399-4555 * Fax: +1 310 450-4516 * Web: www.thefoundry.co.uk
The Foundry Visionmongers Ltd * Registered in England and Wales No: 4642027

More information about the cairo mailing list