Mercurial > hg > Members > kono > nitros9-code
view 3rdparty/utils/viewgif/gifwin.c @ 2210:7ee1bed662f2
Fixed driver to copy D.SysPrc in Level 2 to D.Proc before link
author | boisy |
---|---|
date | Mon, 16 Mar 2009 14:39:49 +0000 |
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); }