/**************************************************************/
/* Frame-Routine zur Auswahl eines Bereichs mit der Maus      */
/*                                                            */
/* Uebergabe von:                                             */
/* scr -> Pointer auf den Screen                              */
/* xmin,ymin,xmax,ymax -> relative Groesse des Screens        */
/*                                                            */
/* Fehler:                                                    */
/* 0 -> kein Fehler                                           */
/* 1 -> kein Screen-Pointer wurde uebergeben                  */
/* 2 -> frame() wurde mit unsinnigen Maus-Koordinaten aufge-  */
/*      rufen!                                                */
/* 3 -> geframter Bereich zu klein!!                          */
/**************************************************************/

#include <exec/types.h>
#include <graphics/gfx.h>
#include <math.h>
#include <graphics/rastport.h>
#include <intuition/intuition.h>


#define MINX 5    /* Mindestgroesse in x-Richtung */
#define MINY 5    /* Mindestgroesse in y-Richtung */

/* extern float rxmin,rxmax,rymin,rymax;                       */
/* Variable fuer die Uebergabe muessen im Hauptprogramm  defi- */
/* niert sein!                                                 */


float rxmin,rxmax,rymin,rymax;

frame(scr,xmin,ymin,xmax,ymax)
struct Screen *scr;        /* Zeiger auf die Screen-Struktur   */
float xmin,ymin,ymax,xmax; /* relative Koordinaten des Screens */
{
 struct RastPort *rp;
 short scrWidth,scrHeight,x0,y0,x,y;
 unsigned char *port;

 port=12574721;            /* Port A des parallelen Ports      */
 if(scr==0)
    return(1);             /* Fehler: keine Pointer-Uebergabe  */
 rp=&(scr->RastPort);
 scrWidth=scr->Width;
 scrHeight=scr->Height;
 x0=x=scr->MouseX;
 y0=y=scr->MouseY;
 if((x0<0)||(x0>scrWidth)||(y0>scrHeight))
    return(2);             /* frame() nicht auf dem Screen!!   */
 SetDrMd(rp,COMPLEMENT);   /* invertiert zeichnen!             */
 SetAPen(rp,0);
 while((*port&64)!=64)     /* solange der Button gedrueckt ist */
 {
    Rect(rp,x0,y0,x,y);    /* Viereck zeichnen                 */
    while((x==scr->MouseX)&&(y==scr->MouseY)&&((*port&64)!=64));
    Rect(rp,x0,y0,x,y);    /* Viereck loeschen                 */
    x=scr->MouseX;         /* neue Koordinaten                 */
    y=scr->MouseY;
    if((x<0)||(x>scrWidth)||(y>scrHeight)||(y<0))
    {
       SetDrMd(rp,0);      /* wieder normal zeichnen           */
       return(2);          /* frame() nicht auf dem Screen!!   */
    }
 }
 SetDrMd(rp,0);            /* wieder normal zeichnen           */
 /* Bereich zu klein? */
 if(((x-x0)<MINX)||((y-y0)<MINY))
    return(3);
 /* Koordinaten des Frames berechnen */
 rxmin=xmin+(float)x0*(xmax-xmin)/(float)(scrWidth);
 rxmax=xmin+(float)x*(xmax-xmin)/(float)(scrWidth);
 rymin=ymin+(float)y0*(ymax-ymin)/(float)(scrHeight);
 rymax=ymin+(float)y*(ymax-ymin)/(float)(scrHeight);
 return(0);
}
 

Rect(rp,x0,y0,x,y)         /* Rechteck zeichnen                */
struct RastPort *rp;
short x,y;
{
    Move(rp,x0,y0);
    Draw(rp,x,y0);
    Draw(rp,x,y);
    Draw(rp,x0,y);
    Draw(rp,x0,y0);
}

