The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
/*
 * Copyright (c) 2004-2005 by the cairo perl team (see the file README)
 *
 * Licensed under the LGPL, see LICENSE file for more information.
 *
 * $Id$
 */

#include <cairo-perl.h>

cairo_matrix_t *
cairo_perl_copy_matrix (cairo_matrix_t *src)
{
	cairo_matrix_t *dst;
	New (0, dst, 1, cairo_matrix_t);

	dst->xx = src->xx;
	dst->xy = src->xy;
	dst->x0 = src->x0;
	dst->yx = src->yx;
	dst->yy = src->yy;
	dst->y0 = src->y0;

	return dst;
}

MODULE = Cairo::Matrix	PACKAGE = Cairo::Matrix PREFIX = cairo_matrix_

##void cairo_matrix_init (cairo_matrix_t *matrix, double xx, double yx, double xy, double yy, double x0, double y0);
cairo_matrix_t * cairo_matrix_init (class, double xx, double yx, double xy, double yy, double x0, double y0)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_init (&matrix, xx, yx, xy, yy, x0, y0);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

##void cairo_matrix_init_identity (cairo_matrix_t *matrix);
cairo_matrix_t * cairo_matrix_init_identity (class)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_init_identity (&matrix);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

##void cairo_matrix_init_translate (cairo_matrix_t *matrix, double tx, double ty);
cairo_matrix_t * cairo_matrix_init_translate (class, double tx, double ty)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_init_translate (&matrix, tx, ty);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

##void cairo_matrix_init_scale (cairo_matrix_t *matrix, double sx, double sy);
cairo_matrix_t * cairo_matrix_init_scale (class, double sx, double sy)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_init_scale (&matrix, sx, sy);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

##void cairo_matrix_init_rotate (cairo_matrix_t *matrix, double radians);
cairo_matrix_t * cairo_matrix_init_rotate (class, double radians)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_init_rotate (&matrix, radians);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

void cairo_matrix_translate (cairo_matrix_t * matrix, double tx, double ty);

void cairo_matrix_scale (cairo_matrix_t * matrix, double sx, double sy);

void cairo_matrix_rotate (cairo_matrix_t * matrix, double radians);

cairo_status_t cairo_matrix_invert (cairo_matrix_t * matrix);

##void cairo_matrix_multiply (cairo_matrix_t * result, const cairo_matrix_t * a, const cairo_matrix_t * b);
cairo_matrix_t * cairo_matrix_multiply (cairo_matrix_t * a, cairo_matrix_t * b)
    PREINIT:
	cairo_matrix_t matrix;
    CODE:
	cairo_matrix_multiply (&matrix, a, b);
	RETVAL = cairo_perl_copy_matrix (&matrix);
    OUTPUT:
	RETVAL

##void cairo_matrix_transform_distance (cairo_matrix_t * matrix, double * dx, double * dy);
void cairo_matrix_transform_distance (cairo_matrix_t * matrix, IN_OUTLIST double dx, IN_OUTLIST double dy);

##void cairo_matrix_transform_point (cairo_matrix_t * matrix, double * x, double * y);
void cairo_matrix_transform_point (cairo_matrix_t * matrix, IN_OUTLIST double x, IN_OUTLIST double y);

void DESTROY (cairo_matrix_t * matrix)
    CODE:
	Safefree (matrix);