home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / graf / fract5.zip / GIFVIEW.C < prev    next >
C/C++ Source or Header  |  1989-09-23  |  5KB  |  191 lines

  1. /*
  2.  * This GIF decoder is designed for use with Bert Tyler's FRACTINT
  3.  * program. It should be noted that the "FRACTINT" program only decodes 
  4.  * GIF files FRACTINT creates, so this decoder code lacks full generality
  5.  * in the following respects: supports single image, non-interlaced GIF
  6.  * files with no local color maps and no extension blocks.
  7.  *
  8.  * GIF and 'Graphics Interchange Format' are trademarks (tm) of
  9.  * Compuserve, Incorporated, an H&R Block Company.
  10.  *
  11.  *                                            Tim Wegner
  12.  */
  13.  
  14. #include <stdio.h>
  15. #include <dos.h>
  16.  
  17. #include "fractint.h"
  18.  
  19. #define MAXCOLORS       256
  20.  
  21. struct RGB
  22. {
  23.    unsigned char red, green, blue;
  24. };
  25.  
  26. extern int decoder();
  27. extern int rowcount;                    /* row counter for screen */
  28. extern char readname[];                    /* file name            */
  29. static FILE *fpin = NULL;                /* FILE pointer             */
  30. unsigned int height;
  31.  
  32. int bad_code_count = 0;                    /* needed by decoder module */
  33.  
  34. get_byte()
  35. {
  36.    static int c;
  37.  
  38.    /* make sure fpin NULL if not open */
  39.    if (!fpin)
  40.    {
  41.       char temp1[81];
  42.  
  43.       strcpy(temp1,readname);
  44.       if (strchr(temp1,'.') == NULL) {
  45.          strcat(temp1,DEFAULTFRACTALTYPE);
  46.          if ((fpin = fopen(temp1,"rb")) != NULL) {
  47.             fclose(fpin);
  48.             }
  49.          else {
  50.             strcpy(temp1,readname);
  51.             strcat(temp1,ALTERNATEFRACTALTYPE);
  52.             }
  53.          }
  54.  
  55.       if ((fpin = fopen(temp1, "rb")) == NULL)
  56.          return (-1);
  57.    } 
  58.    if (fread(&c, 1, 1, fpin) <= 0)
  59.       c = -1;
  60.    return (c);
  61. }
  62.  
  63. extern unsigned char dacbox[256][3];    /* Video-DAC (filled in by SETVIDEO) */
  64. extern int reallyega;            /* "really-an-ega" flag */
  65. extern int paletteVGA[16];        /* VGA Palette-to-DAC registers */
  66. extern unsigned char decoderline[2049];    /* write-line routines use this */
  67.  
  68. /* Main entry decoder */
  69. gifview()
  70. {
  71.    unsigned numcolors;
  72.    unsigned char buffer[16];
  73.    unsigned width, finished;
  74.  
  75.    int status;
  76.    int i, j, k, planes;
  77.  
  78.    status = 0;
  79.  
  80.    /* initialize the row count for write-lines */
  81.    rowcount = 0;
  82.  
  83.    /* zero out the full write-line */
  84.    for (width = 0; width < 2049; width++) decoderline[width] = 0;
  85.  
  86.    /* Get the screen description */
  87.    for (i = 0; i < 13; i++)
  88.    {
  89.       if ((buffer[i] = (unsigned char)get_byte ()) < 0)
  90.       {
  91.          close_file();
  92.          return(-1);
  93.       }
  94.    }
  95.    
  96.    if(strncmp(buffer,"GIF87a",3) ||        /* use updated GIF specs */
  97.       buffer[3] < '0' || buffer[3] > '9' ||
  98.       buffer[4] < '0' || buffer[4] > '9' ||
  99.       buffer[5] < 'A' || buffer[5] > 'z' )
  100.    {
  101.       close_file();
  102.       return(-1);
  103.    }
  104.  
  105.    planes = (buffer[10] & 0x0F) + 1;
  106.  
  107.    if((buffer[10] & 0x80)==0)    /* color map (better be!) */
  108.    {
  109.       close_file();
  110.       return(-1);
  111.    }
  112.    numcolors = 1 << planes;
  113.  
  114.    for (i = 0; i < numcolors; i++)
  115.    {
  116.       if (numcolors == 16 && !reallyega)    /* straight copy or indirect via palette? */
  117.          k = paletteVGA[i];
  118.       else
  119.          k = i;
  120.       for (j = 0; j < 3; j++) {
  121.          if ((buffer[j] = (unsigned char)get_byte()) < 0)
  122.             return(-1);
  123.          if (dacbox[0][0] != 255)       /* (only if we really have a DAC) */
  124.             dacbox[k][j] = buffer[j] >> 2;
  125.       }
  126.    }
  127.    if (dacbox[0][0] != 255) spindac(0,1);    /* update the DAC */
  128.  
  129.    /* Now display one or more GIF objects */
  130.    finished = 0;
  131.    while (!finished)
  132.    {
  133.       switch (get_byte())
  134.       {
  135.       case ';':
  136.          /* End of the GIF dataset */
  137.  
  138.          finished = 1;
  139.          status = 0;
  140.          break;
  141.  
  142.     case '!':                /* GIF Extension Block */
  143.         get_byte();            /* read (and ignore) the ID */
  144.         while ((i = get_byte()) > 0)     /* get the data length */
  145.             for (j = 0; j < i; j++)
  146.                 get_byte();    /* flush the data */
  147.         break;
  148.       case ',':
  149.          /*
  150.           * Start of an image object. Read the image description. 
  151.           */
  152.  
  153.           for (i = 0; i < 9; i++)
  154.           {
  155.              if ((buffer[i] = (unsigned char)get_byte ()) < 0)
  156.              {
  157.                 status = -1;
  158.                 break;
  159.              }
  160.           }
  161.           if(status < 0)
  162.           {
  163.              finished = 1;
  164.              break;
  165.           }   
  166.          
  167.           width  = buffer[4] | buffer[5] << 8;
  168.           height = buffer[6] | buffer[7] << 8;
  169.  
  170.          /* Setup the color palette for the image */
  171.  
  172.          status = timer(decoder,1,width);
  173.          finished = 1;
  174.          break;
  175.       default:
  176.          status = -1;
  177.          finished = 1;
  178.          break;
  179.       }
  180.    }
  181.    close_file();
  182.    if (status == 0)
  183.       buzzer(0);             /* audible signal - we done */
  184.    return(status);
  185. }
  186. close_file()
  187. {
  188.    fclose(fpin);
  189.    fpin = NULL;
  190. }
  191.