home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff280.lzh
/
Graph
/
object
/
pos.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-11-20
|
4KB
|
137 lines
/*
* GRAPH, Version 1.00 - 4 August 1989
*
* Copyright 1989, David Gay. All Rights Reserved.
* This software is freely redistrubatable.
*/
#include <exec/types.h>
#include <graphics/text.h>
#include <math.h>
#include "object.h"
#include "object/default.h"
#include "uio.h"
#include "grph.h"
#include "coords.h"
#include "tracker.h"
#include <proto/exec.h>
#include <proto/graphics.h>
/*-------------------------------------------------------------------------*/
/* pos class implementation */
/*-------------------------------------------------------------------------*/
/* Size of cross */
#define XCROSS 3
#define YCROSS 3
/* Redraw cross/rect */
static void draw_pos(struct pos *this, int allow_mes)
{
struct graph *g = this->o.g;
struct RastPort *rp = g->io.rw->rp;
SetDrMd(rp, COMPLEMENT);
if (this->cross) /* Draw cross */
{
RMove(g->io.rw, this->x0, this->y0);
Move(rp, rp->cp_x - XCROSS, rp->cp_y);
Draw(rp, rp->cp_x + 2 * XCROSS, rp->cp_y);
Move(rp, rp->cp_x - XCROSS, rp->cp_y - YCROSS);
Draw(rp, rp->cp_x, rp->cp_y + 2 * YCROSS);
}
if (this->rect) /* Draw rectangle */
{
long const sx0 = ftol(g->io.rw->sx(g->io.rw, this->x0));
long const sx1 = ftol(g->io.rw->sx(g->io.rw, this->x1));
long const sy0 = ftol(g->io.rw->sy(g->io.rw, this->y0));
long const sy1 = ftol(g->io.rw->sy(g->io.rw, this->y1));
long c1 = ReadPixel(rp, sx0, sy0);
long c2 = ReadPixel(rp, sx0, sy1);
long c3 = ReadPixel(rp, sx1, sy0);
long c4 = ReadPixel(rp, sx1, sy1);
Move(rp, sx0, sy0);
Draw(rp, sx1, sy0);
Draw(rp, sx1, sy1);
Draw(rp, sx0, sy1);
Draw(rp, sx0, sy0);
/* Had problems with the corners ... */
if (c1 == ReadPixel(rp, sx0, sy0)) WritePixel(rp, sx0, sy0);
if (c2 == ReadPixel(rp, sx0, sy1)) WritePixel(rp, sx0, sy1);
if (c3 == ReadPixel(rp, sx1, sy0)) WritePixel(rp, sx1, sy0);
if (c4 == ReadPixel(rp, sx1, sy1)) WritePixel(rp, sx1, sy1);
}
}
/* The object exists only to be "selected" --> */
/* This actually deletes the object !!! */
static struct Region *deselect_pos(struct pos *this)
{
if (this->o.g->ok && this->o.g->io.rw) draw_pos(this, TRUE); /* erase */
FreeMem(this, sizeof(struct pos));
return NULL;
}
static int down_pos(struct pos *this)
{
return FALSE; /* You can never select a 'pos' */
}
/* Move, ie define rectangle */
static void move_pos(struct pos *this)
{
draw_pos(this, TRUE); /* erase old */
this->x1 = this->o.g->s.x;
this->y1 = this->o.g->s.y;
this->cross = FALSE; this->rect = TRUE; /* Not a cross any more */
draw_pos(this, TRUE); /* draw new */
}
/* Rectangle is now defined */
static struct Region *up_pos(struct pos *this)
{
draw_pos(this, TRUE);
this->x1 = this->o.g->s.x;
this->y1 = this->o.g->s.y;
draw_pos(this, TRUE);
return NULL;
}
/* Create a rectangle/cross (starts off as a cross) */
struct pos *new_pos(struct graph *g)
{
struct pos *this;
const static struct pos def_p = {
{
{ NULL },
NULL, "", TRUE, 0, 0,
(void *)uncalled, (void *)uncalled, (void *)deselect_pos, (void *)d
own_pos, (void *)move_pos, (void *)up_pos, (void *)uncalled, (void *)draw_pos, (
void *)uncalled, (void *)uncalled, (void *)uncalled, (void *)uncalled, (void *)u
ncalled,
(void *)uncalled
},
TRUE, FALSE
};
if (g->ok && g->io.rw)
if (this = AllocMem(sizeof(struct pos), 0L))
{
*this = def_p;
this->o.g = g;
this->x0 = this->x1 = g->s.x;
this->y0 = this->y1 = g->s.y;
draw_pos(this, TRUE); /* draw it */
return this;
}
else message(g, "No memory !", (char *)NULL);
else message(g, "No scale set", (char *)NULL);
return NULL;
}