/*
 * THIS IS WORK IN PROGRESS.
 *
 * The Python Imaging Library.
 *
 * "arrow" outline stuff.  the contents of this module
 * will be merged with the path module and the rest of
 * the arrow graphics  package, but not before PIL 1.1.
 * use at your own risk.
 *
 * history:
 * 99-01-10 fl  Added to PIL (experimental)
 *
 * Copyright (c) Secret Labs AB 1999.
 * Copyright (c) Fredrik Lundh 1999.
 *
 * See the README file for information on usage and redistribution.
 */

#include "Python.h"

#include "libImaging/Imaging.h"


/* -------------------------------------------------------------------- */
/* Class                                                                */

typedef struct {
    PyObject_HEAD
    ImagingOutline outline;
} OutlineObject;

static PyTypeObject OutlineType;

#define PyOutline_Check(op) (Py_TYPE(op) == &OutlineType)

static OutlineObject*
_outline_new(void)
{
    OutlineObject *self;

    if (PyType_Ready(&OutlineType) < 0) {
        return NULL;
    }

    self = PyObject_New(OutlineObject, &OutlineType);
    if (self == NULL) {
        return NULL;
    }

    self->outline = ImagingOutlineNew();

    return self;
}

static void
_outline_dealloc(OutlineObject* self)
{
    ImagingOutlineDelete(self->outline);
    PyObject_Del(self);
}

ImagingOutline
PyOutline_AsOutline(PyObject* outline)
{
    if (PyOutline_Check(outline)) {
        return ((OutlineObject*) outline)->outline;
    }

    return NULL;
}


/* -------------------------------------------------------------------- */
/* Factories                                                            */

PyObject*
PyOutline_Create(PyObject* self, PyObject* args)
{
    if (!PyArg_ParseTuple(args, ":outline")) {
        return NULL;
    }

    return (PyObject*) _outline_new();
}


/* -------------------------------------------------------------------- */
/* Methods                                                              */

static PyObject*
_outline_move(OutlineObject* self, PyObject* args)
{
    float x0, y0;
    if (!PyArg_ParseTuple(args, "ff", &x0, &y0)) {
        return NULL;
    }

    ImagingOutlineMove(self->outline, x0, y0);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject*
_outline_line(OutlineObject* self, PyObject* args)
{
    float x1, y1;
    if (!PyArg_ParseTuple(args, "ff", &x1, &y1)) {
        return NULL;
    }

    ImagingOutlineLine(self->outline, x1, y1);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject*
_outline_curve(OutlineObject* self, PyObject* args)
{
    float x1, y1, x2, y2, x3, y3;
    if (!PyArg_ParseTuple(args, "ffffff", &x1, &y1, &x2, &y2, &x3, &y3)) {
        return NULL;
    }

    ImagingOutlineCurve(self->outline, x1, y1, x2, y2, x3, y3);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject*
_outline_close(OutlineObject* self, PyObject* args)
{
    if (!PyArg_ParseTuple(args, ":close")) {
        return NULL;
    }

    ImagingOutlineClose(self->outline);

    Py_INCREF(Py_None);
    return Py_None;
}

static PyObject*
_outline_transform(OutlineObject* self, PyObject* args)
{
    double a[6];
    if (!PyArg_ParseTuple(args, "(dddddd)", a+0, a+1, a+2, a+3, a+4, a+5)) {
        return NULL;
    }

    ImagingOutlineTransform(self->outline, a);

    Py_INCREF(Py_None);
    return Py_None;
}

static struct PyMethodDef _outline_methods[] = {
    {"line", (PyCFunction)_outline_line, 1},
    {"curve", (PyCFunction)_outline_curve, 1},
    {"move", (PyCFunction)_outline_move, 1},
    {"close", (PyCFunction)_outline_close, 1},
    {"transform", (PyCFunction)_outline_transform, 1},
    {NULL, NULL} /* sentinel */
};

static PyTypeObject OutlineType = {
    PyVarObject_HEAD_INIT(NULL, 0)
    "Outline",                   /*tp_name*/
    sizeof(OutlineObject),       /*tp_size*/
    0,                           /*tp_itemsize*/
    /* methods */
    (destructor)_outline_dealloc,/*tp_dealloc*/
    0,                           /*tp_print*/
    0,                           /*tp_getattr*/
    0,                           /*tp_setattr*/
    0,                           /*tp_compare*/
    0,                           /*tp_repr*/
    0,                           /*tp_as_number */
    0,                           /*tp_as_sequence */
    0,                           /*tp_as_mapping */
    0,                           /*tp_hash*/
    0,                           /*tp_call*/
    0,                           /*tp_str*/
    0,                           /*tp_getattro*/
    0,                           /*tp_setattro*/
    0,                           /*tp_as_buffer*/
    Py_TPFLAGS_DEFAULT,          /*tp_flags*/
    0,                           /*tp_doc*/
    0,                           /*tp_traverse*/
    0,                           /*tp_clear*/
    0,                           /*tp_richcompare*/
    0,                           /*tp_weaklistoffset*/
    0,                           /*tp_iter*/
    0,                           /*tp_iternext*/
    _outline_methods,            /*tp_methods*/
    0,                           /*tp_members*/
    0,                           /*tp_getset*/
};
