pmc/rectangle.cc
author Markus Bröker <mbroeker@largo.dyndns.tv>
Thu, 16 Apr 2009 12:49:12 +0200
changeset 46 4b9e1ac40246
parent 45 7197576fedcf
child 54 c064ce9f40f5
permissions -rw-r--r--
pmc: Screen Depth Fix: Paint on 8, 16 and 32 bpp * a crocked rectangle and cube * new color settings and better oow protection committer: Markus Bröker <mbroeker@largo.homelinux.org>

/**
 * test/demos/pmc/rectangle.cc
 * Copyright (C) 2008 Markus Broeker
 */

#include <rectangle.h>
#include <cstdio>

using namespace algebra;

Rectangle::Rectangle (Surface * s)
{
    surface = s;
    name = "Rectangle";

    anker = Vector (0, 0);

    P[0] = new Vector (0, 0);
    P[1] = new Vector (0, 100);
    P[2] = new Vector (100, 100);
    P[3] = new Vector (0, 100);
}

Rectangle::Rectangle (Surface * s, Vector & p1, Vector & p2, Vector & p3, Vector & p4)
{
    surface = s;
    name = "Rectangle";

    anker = Vector (0, 0);

    P[0] = new Vector (p1);
    P[1] = new Vector (p2);
    P[2] = new Vector (p3);
    P[3] = new Vector (p4);
}

Rectangle::Rectangle (Surface * s, Vector p[4])
{
    surface = s;
    name = "Rectangle";

    anker = Vector (0, 0);

    for (int i = 0; i < 4; i++) {
        P[i] = new Vector (p[i]);
    }
}

Rectangle::~Rectangle ()
{
    for (int i = 0; i < 4; i++) {
#ifdef DEBUG
        fprintf (stderr, "Removing P[%d]: ", i);
#endif
        delete P[i];
    }
}

void Rectangle::move (Vector location)
{
    if ((anker.X () + location.X ()) < 0)
        return;
    if ((anker.Y () + location.Y ()) < 0)
        return;

    if ((anker.X () + location.X ()) > surface->getWidth ())
        return;
    if ((anker.Y () + location.Y ()) > surface->getHeight ())
        return;

    for (int i = 0; i < 4; i++) {
        *P[i] = *P[i] + location;
    }

    anker = Vector (P[0]->X (), P[0]->Y ());
}

void Rectangle::show ()
{
    int i;

    for (i = 0; i < 4; i++) {
        fprintf (stderr, "[%d] ", i);
        P[i]->vector ();
        if ((i + 1) % 4 != 0)
            fprintf (stderr, ", ");
        else
            fprintf (stderr, "\n");
    }

    surface->drawLine (P[0]->X (), P[0]->Y (), P[1]->X (), P[1]->Y ());
    surface->drawLine (P[3]->X (), P[3]->Y (), P[2]->X (), P[2]->Y ());

    surface->drawLine (P[2]->X (), P[2]->Y (), P[1]->X (), P[1]->Y ());
    surface->drawLine (P[3]->X (), P[3]->Y (), P[0]->X (), P[0]->Y ());
}