/*
 * PerlQt interface to qwmatrix.h
 *
 * Copyright (C) 1997, Ashley Winters <jql@accessone.com>
 *
 * You may distribute under the terms of the LGPL as specified in the
 * README file
 */

#include "pwmatrix.h"
#include "ppntarry.h"
#include "ppoint.h"
#include "prect.h"

MODULE = QWMatrix		PACKAGE = QWMatrix

PROTOTYPES: DISABLE

PWMatrix *
PWMatrix::new(...)
    CASE: items == 1
	CODE:
	RETVAL = new PWMatrix();
	OUTPUT:
	RETVAL
    CASE: items > 6
	PREINIT:
	float m11 = SvNV(ST(1));
	float m12 = SvNV(ST(2));
	float m21 = SvNV(ST(3));
	float m22 = SvNV(ST(4));
	float dx = SvNV(ST(5));
	float dy = SvNV(ST(6));
	CODE:
	RETVAL = new PWMatrix(m11, m12, m21, m22, dx, dy);
	OUTPUT:
	RETVAL
    CASE:
	CODE:
	croak("Usage: new %s(m11, m12, m21, m22, dx, dy);\nUsage: new %s;",
	      CLASS, CLASS);

void
QWMatrix::DESTROY()
    CODE:
    if(want_destroy(ST(0)))
	delete THIS;

float
QWMatrix::dx()

float
QWMatrix::dy()

#undef invert

PWMatrix *
QWMatrix::invert(invertable = 0)
    CASE: items == 1
	CODE:
	RETVAL = new PWMatrix(THIS->invert());
	OUTPUT:
	RETVAL
    CASE:
	bool invertable
	CODE:
	RETVAL = new PWMatrix(THIS->invert(&invertable));
	OUTPUT:
	invertable
	RETVAL

float
QWMatrix::m11()

float
QWMatrix::m12()

float
QWMatrix::m21()

float
QWMatrix::m22()

SV *
QWMatrix::map(thing, ...)
    CASE: items < 5 && !sv_isobject(ST(1))
	CODE:
	croak("Usage: $matrix->map(x, y, dx, dy);\nUsage: $matrix->map(point);\nUsage: $matrix->map(rect);");
    CASE: SvIOK(ST(1))
	PREINIT:
	int x = SvIV(ST(1));
	int y = SvIV(ST(2));
	int tx;
	int ty;
	CODE:
	THIS->map(x, y, &tx, &ty);
	RETVAL = &sv_undef;
	sv_setiv(ST(3), tx);
	sv_setiv(ST(4), ty);
	OUTPUT:
	RETVAL
    CASE: items > 4
	PREINIT:
	float x = SvNV(ST(1));
	float y = SvNV(ST(2));
	float tx;
	float ty;
	CODE:
	THIS->map(x, y, &tx, &ty);
	RETVAL = &sv_undef;
	sv_setnv(ST(3), tx);
	sv_setnv(ST(4), ty);
	OUTPUT:
	RETVAL
    CASE: sv_derived_from(ST(1), "QRect")
	PREINIT:
	QRect *rect = pextract(QRect, 1);
	CODE:
	RETVAL =
	    objectify_ptr((void *)new PRect(THIS->map(*rect)), "QRect", 1);
	OUTPUT:
	RETVAL
    CASE: sv_derived_from(ST(1), "QPoint")
	PREINIT:
	QPoint *point = pextract(QPoint, 1);
	CODE:
	RETVAL =
	    objectify_ptr((void *)new PPoint(THIS->map(*point)), "QPoint", 1);
	OUTPUT:
	RETVAL
    CASE:
	PREINIT:
	QPointArray *parray = pextract(QPointArray, 1);
	CODE:
	RETVAL = objectify_ptr((void *)new PPointArray(THIS->map(*parray)),
			       "QPointArray", 1);
	OUTPUT:
	RETVAL

void
QWMatrix::reset()

PWMatrix *
QWMatrix::rotate(a)
    float a
    CODE:
    RETVAL = new PWMatrix(THIS->rotate(a));
    OUTPUT:
    RETVAL

PWMatrix *
QWMatrix::scale(sx, sy)
    float sx
    float sy
    CODE:
    RETVAL = new PWMatrix(THIS->scale(sx, sy));
    OUTPUT:
    RETVAL

PWMatrix *
QWMatrix::shear(sh, sv)
    float sh
    float sv
    CODE:
    RETVAL = new PWMatrix(THIS->shear(sh, sv));
    OUTPUT:
    RETVAL

void
QWMatrix::setMatrix(m11, m12, m21, m22, dx, dy)
    float m11
    float m12
    float m21
    float m22
    float dx
    float dy

PWMatrix *
QWMatrix::translate(dx, dy)
    float dx
    float dy
    CODE:
    RETVAL = new PWMatrix(THIS->translate(dx, dy));
    OUTPUT:
    RETVAL