view 3rdparty/utils/viewgif/gifwin.c @ 2739:7afa11757a81

Adding the burst script to the repo so users who have write access to the project are able to put the script on their sourceforge ssh server account. This will allow the user to use the "make nightly" function. As long as said user has write permision to the project.
author drencor-xeen
date Fri, 04 Jan 2013 11:50:24 -0600
parents aaae5eac20e1
children
line wrap: on
line source

/*
 * gifwin.c - window functions for ViewGIF 2.0
 * by Vaughn Cato
 */

#include "viewgif.h"

char           *mapgpb();
extern int		errno;

checksig()
{
	char            buf[6];

	fread(buf, sizeof(*buf), 6, infile);
	if (strncmp(buf, "GIF", 3) != 0)
		fatal("file is not a GIF file");
	if (strncmp(&buf[3], "87a", 3) != 0)
		fatal("Unknown GIF version number");
}

perror(str)
char           *str;
{
	fprintf(stderr, "%s: error\n", str);
}

error(str, errnum)
char           *str;
int             errnum;
{
	fprintf(stderr, "viewgif: %s\n", str);
	exit(errnum);
}

sleep(ticks)
int		ticks;
{
#asm
 ldx 4,s
 os9 F$Sleep
#endasm
}

static char *ustext[] = {
	"OS9 ViewGIF 2.0 by Vaughn Cato\n",
	"usage: viewgif <filename> [-<option> ...]\n",
	"       displays a gif picture\n",
	"\n",
	"  options:\n",
	"       -d[[=]dfactor] Set dithering factor, default is 0\n",
	"       -a Align to pixels\n",
	"       -u[=]<filename> Create/use a color usage file\n",
	"       -m[=]<magfact> Set magnification factor (1-64)\n",
	"       -x[=]<start x> Set start x (0-64)\n",
	"       -y[=]<start y> Set start y (0-64)\n",
	"       -v[[=]<filename>] Generate vef format picture\n",
	"       -g grey scale picture (average color brite)\n",
	"       -g2 grey scale picture (max color brite)\n",
	"       -g3 grey scale picture (NTSC color brite)\n",
	"       -r Use random generator instead of table\n",
	"       -s Silent.  No info printed\n",
	"       -i Extended information\n",
	"       -n No display\n",
	"       -p[[=]seconds] Pause time (default 0)\n",
	"       -c Use current screen\n",
	"       -f Disable flicker\n",
	"       -b[=]<britefact> Set brightness (1-16)\n",
	"       -z Zap unused global color map entries\n",
	NULL
};

usage()
{
	register char	**uscan;
	
	for (uscan = ustext; *uscan != NULL; uscan++)
		fputs(*uscan, stderr);
	exit(1);
}

initwin(firstscreen, oldpath)
bool	firstscreen;
int		oldpath;
{
	register bool	newwin;

	newwin = (oldpath == -1);

	if (newwin) {
		if (!newscrn && firstscreen) {
			/* just use stdout */
			actwin = oldpath = 1;
			dwend();
		} else if ((actwin = oldpath = open("/w", 3)) == -1)
			exit(errno);
	} else {
		actwin = oldpath;
		dwend();
	}

	dwset(gmode ? 7 : 8, 0, 0, gmode ? 80 : 40, 24, 0, 0, 0);
	curoff();
	select();
	flushwin();

	if (newwin && firstscreen) {
		groupnum = getpid();
		bufnum = 1;
		getblk(groupnum, bufnum, 0, 0, 640, 1);
		flushwin();
		if ((gpbufptr = mapgpb(actwin, groupnum, bufnum, 1)) == NULL)
			exit(errno);
	} 
	
	return actwin;
}

dwset(sty, cpx, cpy, szx, szy, prn1, prn2, prn3)
int             sty, cpx, cpy, szx, szy, prn1, prn2, prn3;
{
	static char     outstr[] = {
		0x1b, 0x20, 0, 0, 0, 0, 0, 0, 0, 0
	};
	int             size;

	outstr[2] = sty;
	outstr[3] = cpx;
	outstr[4] = cpy;
	outstr[5] = szx;
	outstr[6] = szy;
	if (sty > 0 && sty <= 8) {
		outstr[7] = prn1;
		outstr[8] = prn2;
		outstr[9] = prn3;
		size = sizeof(outstr);
	} else
		size = sizeof(outstr) - 3;
	writemem(outstr, size);
}

dwend()
{
	static char     outstr[] = {0x1b, 0x24};

	writemem(outstr, sizeof(outstr));
}

select()
{
	static char     outstr[] = {0x1b, 0x21};

	writemem(outstr, sizeof(outstr));
}

bell()
{
	char            c = 7;
	writemem(&c, 1);
}

palette(prn, ctn)
{
	static char     outstr[] = {0x1b, 0x31, 0, 0};

	outstr[2] = prn;
	outstr[3] = ctn;
	writemem(outstr, sizeof(outstr));
}

point(x, y)
int             x, y;
{
	static char     outstr[] = {0x1b, 0x42, 0, 0, 0, 0};

	*(int *) &outstr[2] = x;
	*(int *) &outstr[4] = y;
	writemem(outstr, sizeof(outstr));
}

lineto(x, y)
int             x, y;
{
	static char     outstr[] = {0x1b, 0x46, 0, 0, 0, 0};

	*(int *) &outstr[2] = x;
	*(int *) &outstr[4] = y;
	writemem(outstr, sizeof(outstr));
}

fcolor(c)
int             c;
{
	static char     outstr[] = {0x1b, 0x32, 0};

	outstr[2] = c;
	writemem(outstr, sizeof(outstr));
}

border(c)
int             c;
{
	static char     outstr[] = {0x1b, 0x34, 0};

	outstr[2] = c;
	writemem(outstr, sizeof(outstr));
}

SetDPtr(x, y)
int             x, y;
{
	static char     outstr[] = {0x1b, 0x40, 0, 0, 0, 0};

	*(int *) &outstr[2] = x;
	*(int *) &outstr[4] = y;
	writemem(outstr, sizeof(outstr));
}

curoff()
{
	static char     outstr[] = {0x05, 0x20};

	writemem(outstr, sizeof(outstr));
}

getblk(grp, bfn, cpx, cpy, szx, szy)
int             grp, bfn, cpx, cpy, szx, szy;
{
	static char     outstr[] = {0x1b, 0x2c, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};

	outstr[2] = grp;
	outstr[3] = bfn;
	*(int *) (&outstr[4]) = cpx;
	*(int *) (&outstr[6]) = cpy;
	*(int *) (&outstr[8]) = szx;
	*(int *) (&outstr[10]) = szy;
	writemem(outstr, sizeof(outstr));
}

putblk(grp, bfn, cpx, cpy)
int             grp, bfn, cpx, cpy;
{
	static char     outstr[] = {0x1b, 0x2d, 0, 0, 0, 0, 0, 0};

	outstr[2] = grp;
	outstr[3] = bfn;
	*(int *) (&outstr[4]) = cpx;
	*(int *) (&outstr[6]) = cpy;
	writemem(outstr, sizeof(outstr));
}

killbuf(grp, bfn)
int             grp, bfn;
{
	static char     outstr[] = {0x1b, 0x2a, 0, 0};

	outstr[2] = grp;
	outstr[3] = bfn;
	writemem(outstr, sizeof(outstr));
}

char *
mapgpb(path, grp, bfn, action)
int             path, grp, bfn, action;
{
#asm
 lda 7,s group
 ldb 9,s buffer
 tfr d,x ->X
 lda 5,s path
 ldb #$SS.MpGPB setstat code
 pshs y
 ldy 10+2,s action (1 => map, 0 => unmap)
 os9 I$SetStt
 puls y
 bcc _mapgpb1
 clra error--
 std errno,y save error code,
 ldx #0 return NULL pointer
_mapgpb1: tfr x,d move pointer into position for return
#endasm
}

static char			outbuf[256];
static DIRECT char	*outptr = outbuf;
static DIRECT int	bufleft = sizeof(outbuf);

writemem(str, size)
register char  *str;
register int    size;
{
	while (size > bufleft) {
		size -= bufleft;
		while (--bufleft >= 0)
			*outptr++ = *str++;
		flushwin();
	}
	bufleft -= size;
	while (--size >= 0)
		*outptr++ = *str++;
}

flushwin()
{
	write(actwin, outbuf, outptr - outbuf);
	outptr = outbuf;
	bufleft = sizeof(outbuf);
}