home *** CD-ROM | disk | FTP | other *** search
- #include "\include\gemdefs.h"
- #include "\include\osbind.h"
- #include "rtd.h"
- int debug;
-
- #define GRMODE 0 /* graphics mode 0 (320x200) */
- #define FSIZE 32034 /* size of DEGAS save-file */
- int vs_handle; /* virtual screen (workstation) handle */
- int *clut_fetch();
- int read_pal[16];
-
- /* the first FSIZE bytes of the file is DEGAS */
-
- /* save screen data to disk in DEGAS-like format */
-
- f_write(fn)
- char *fn;
- {
- char *scrnp;
- int fd, n;
- short gmode[1];
-
- if (fn == 0)
- return (-1);
- scrnp = (char *)Physbase() ; /* get pointer to display frame */
- *gmode = GRMODE ;
-
- if ((fd = creatb(fn, 0755)) < 0)
- return(-1);
-
- n = write(fd, gmode, 2); /* write graphics mode */
- n += write(fd, clut_fetch() /*palet(ind)*/, 32); /* write palette */
- n += write(fd, scrnp, 32000); /* write screen data */
- close(fd);
-
- if (n != FSIZE)
- { unlink(fn);
- panic("Not enough space on disk to write file\n(need 32K)");
- }
- return(0) ;
- }
-
- /* read file (DEGAS format) */
- int f_read(fn, buf)
- char *fn, *buf;
- {
- char *scrnp;
- int fd, n;
- short gmode[1];
-
- if (fn == 0)
- return (-1);
- if ((fd = openb(fn, 0)) < 0)
- return(-1);
-
- n = read(fd, gmode, 2); /* read graphics mode */
- n += read(fd, &read_pal, 32); /* read palette */
- n += read(fd, (buf? buf: (char *)Physbase()), 32000);
- close(fd); /* read screen data */
-
- if (n != FSIZE)
- return(-2); /* file read error: file too short */
- clut_put(&read_pal);
-
-
- return(0);
- }
-
- int scramble[16] = {0, 2, 3, 6, 4, 7, 5, 8, 9, 10, 11, 14, 12, 15, 13, 1};
-
- int *clut_fetch()
- { int *p = read_pal, i;
- int rgb[3], red, green, blue;
-
- for (i=0; i<16; i++)
- { vq_color(vs_handle, scramble[i], 0, rgb);
- red = rgb[0] / 125;
- green = rgb[1] / 125;
- blue = rgb[2] / 125;
- if (debug)
- printf("cF(%d>%d): %d %d %d ->%d %d %d\n",i,scramble[i],
- rgb[0], rgb[1], rgb[2], red, green, blue);
- *p++ = (red*0x100 + green*0x10 + blue);
- }
- return(read_pal);
- }
-
- #define clr(r) 1000*(2*(r)+1)/16;
-
- clut_put(p)
- int *p;
- { int i;
- int rgb[3], red, green, blue;
- for (i=0; i<16; i++, p++)
- { rgb[0] = clr( *p >>8 & 0xf); /* red */
- rgb[1] = clr( *p >>4 & 0xf); /* green */
- rgb[2] = clr( *p & 0xf); /* blue */
- vs_color(vs_handle, scramble[i], rgb);
- } }
-