
char picfile[256]="";
char picdir [256]="pics";
char rgbfile[256]="Graph.rgb";
char rgbdir [256]="";

struct FileRequester rgbfr={
	"RGB ....",
	rgbfile,
	rgbdir,
	NULL,
	0,
	0,
	NULL,
	};

struct FileRequester picfr={
	"Picture ....",
	picfile,
	picdir,
	NULL,
	0,
	0,
	NULL,
	};

char *mygetname(freq, save)
struct FileRequester *freq;
{
char *p, *filename;
register unsigned int i;
static char fullname[256];

p=freq->fr_Hail;
strcpy(p+strlen(p)-4, save ? "save" : "open");
for (i=0; i<27; i++) MoveScreen(s,0,3);
filename=FileRequest(freq);
for (i=0; i<27; i++) MoveScreen(s,0,-3);
ActivateWindow(w);
if (filename==NULL) {
	display("Canceled");
	return NULL;
	}
strcpy(fullname, freq->fr_Dir );
TackOn(fullname, freq->fr_File);
return fullname;
}

#define PUSH(X,Y) sx[top]=(X), sy[top++]=(Y)
#define IFPH(X,Y) if (ReadPixel(rp,(X),(Y))==c) PUSH( (X),(Y) );

fill(x,y)
register int x,y;
{
register int c;
register unsigned short top=0;
unsigned short sx[SIZEX*SIZEY], sy[SIZEX*SIZEY];
check ((c=ReadPixel(rp,x,y))!=maincolor, "Please change color");
display("Filling");
NOPTR;
PUSH(x,y);
while (top) {
	top--;
	x=sx[top], y=sy[top];
	BOTHPLOT(x,y);
	IFPH(x  ,y-1);
	IFPH(x-1,y  );
	IFPH(x  ,y+1);
	IFPH(x+1,y  );
	}
}

int doload(name,n)
char *name;
{
BPTR f;
int ctr=0;

NOPTR;
if (f=Open(name,MODE_OLDFILE)) {
    while (Read(f,picbuf,PICBUFSIZE)==PICBUFSIZE) {
	if (n>=minundo) display("Too many pics");
	else {
		if (n==1) saveundo();
		BltBitMap(&picbm,0,0,rp->BitMap,picx0[n],picy0[n],
			SIZEX,SIZEY,0xcc,0xff,NULL);
		if (n==1) updatebig();
		n++, ctr++;
		}
	}
    Close(f);
    }
return ctr;
}

dosave(s)
char *s;
{
BPTR f;

NOPTR;
if (s==NULL) return;
if (Strcmp(s+strlen(s)-4,".pic")) strcat(s,".pic");
BltBitMap(rp->BitMap,LITX0,LITY0,&picbm,0,0,SIZEX,SIZEY,0xcc,0xff,NULL);
check(f=Open(s,MODE_NEWFILE),"Can't Open write file!");
Write(f,picbuf,PICBUFSIZE);
Close(f);
}

oopen()
{
char *temp;

if (temp=mygetname(&picfr, 0)) check(doload(temp,1),"File not found!");
}

osave()
{
if (picfr.fr_File[0]) dosave(picfr.fr_File);
	else osaveas();
}

osaveas()
{
char *temp;

if (temp=mygetname(&picfr,1)) dosave(temp);
}

orgbload()
{
char *temp;

if (temp=mygetname(&rgbfr,0)) check(loadrgb(temp), "File not found!");
}

orgbsave()
{
if (rgbfr.fr_File[0]) savergb(rgbfr.fr_File);
	else orgbsaveas();
}

orgbsaveas()
{
char *temp;

if (temp=mygetname(&rgbfr,1)) savergb(temp);
}

savergb(rgbname)
char *rgbname;
{
register unsigned int i;
BPTR f;
short colortable[NCOLS];

if (*rgbname=='\0') return;
check( f=Open(rgbname,MODE_NEWFILE), "Can't Open RGB file");
for (i=0; i<NCOLS; i++) colortable[i]=GetRGB4(vp->ColorMap, i);
Write(f,(char *)colortable,NCOLS*2);
Close(f);
}

int loadrgb(rgbname)
char *rgbname;
{
short colortable[NCOLS];
BPTR f;

f=Open(rgbname,MODE_OLDFILE);
if (f==NULL) return 0;
Read(f,(char *)colortable,NCOLS*2);
LoadRGB4(vp,colortable,NCOLS);
Close(f);
return 1;
}

picmove(fx,fy,tx,ty)
{
ClipBlit(rp,fx,fy,rp,tx,ty,SIZEX,SIZEY,0xcc);
if (tx==LITX0 && ty==LITY0) updatebig();
}

check(flag,msg)
{
if (!flag) error(msg,0);
}

fatalcheck(flag,msg)
{
if (!flag) error(msg,1);
}
