Back to index

plt-scheme  4.2.1
Defines | Typedefs | Functions | Variables
wx_gifwr.cc File Reference
#include <stdlib.h>
#include "wx_image.h"

Go to the source code of this file.

Defines

#define GIFBITS   12
#define MSDOS   1
#define HSIZE   5003 /* 80% occupancy */
#define MAXCODE(n_bits)   ( (1 << (n_bits)) - 1)
#define HashTabOf(i)   htab[i]
#define CodeTabOf(i)   codetab[i]
#define tab_prefixof(i)   CodeTabOf(i)
#define tab_suffixof(i)   ((char_type *)(htab))[i]
#define de_stack   ((char_type *)&tab_suffixof(1<<GIFBITS))

Typedefs

typedef long int count_int
typedef unsigned char char_type

Functions

static void putword (int, FILE *)
static void compress (int, FILE *, byte *, int)
static void output (int)
static void cl_block (void)
static void cl_hash (count_int)
static void char_init (void)
static void char_out (int)
static void flush_char (void)
static void cl_hash (register count_int hsize)

Variables

static int Width
static int Height
static int curx
static int cury
static long CountDown
static int Interlace
static byte bw [2] = {0, 0xff}
static unsigned long cur_accum = 0
static int cur_bits = 0
static int n_bits
static int maxbits = GIFBITS
static int maxcode
static int maxmaxcode = 1 << GIFBITS
static count_int htab [HSIZE]
static unsigned short codetab [HSIZE]
static int hsize = HSIZE
static int free_ent = 0
static int clear_flg = 0
static long int in_count = 1
static long int out_count = 0
static int g_init_bits
static FILE * g_outfile
static int ClearCode
static int EOFCode
static unsigned long masks []
static int a_count
static char accum [256]

Define Documentation

#define CodeTabOf (   i)    codetab[i]

Definition at line 216 of file wx_gifwr.cc.

#define de_stack   ((char_type *)&tab_suffixof(1<<GIFBITS))

Definition at line 231 of file wx_gifwr.cc.

#define GIFBITS   12

Definition at line 198 of file wx_gifwr.cc.

#define HashTabOf (   i)    htab[i]

Definition at line 215 of file wx_gifwr.cc.

#define HSIZE   5003 /* 80% occupancy */

Definition at line 201 of file wx_gifwr.cc.

#define MAXCODE (   n_bits)    ( (1 << (n_bits)) - 1)

Definition at line 211 of file wx_gifwr.cc.

#define MSDOS   1

Definition at line 199 of file wx_gifwr.cc.

#define tab_prefixof (   i)    CodeTabOf(i)

Definition at line 229 of file wx_gifwr.cc.

#define tab_suffixof (   i)    ((char_type *)(htab))[i]

Definition at line 230 of file wx_gifwr.cc.


Typedef Documentation

typedef unsigned char char_type

Definition at line 203 of file wx_gifwr.cc.

typedef long int count_int

Definition at line 56 of file wx_gifwr.cc.


Function Documentation

static void char_init ( void  ) [static]

Definition at line 518 of file wx_gifwr.cc.

{
       a_count = 0;
}

Here is the caller graph for this function:

static void char_out ( int  c) [static]

Definition at line 532 of file wx_gifwr.cc.

{
  accum[ a_count++ ] = c;
  if( a_count >= 254 ) 
    flush_char();
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void cl_block ( void  ) [static]

Definition at line 458 of file wx_gifwr.cc.

{
  /* Clear out the hash table */

  cl_hash ( (count_int) hsize );
  free_ent = ClearCode + 2;
  clear_flg = 1;

  output(ClearCode);
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void cl_hash ( count_int  ) [static]

Here is the caller graph for this function:

static void cl_hash ( register count_int  hsize) [static]

Definition at line 471 of file wx_gifwr.cc.

{
  register count_int *htab_p = htab+hsize;
  register long i;
  register long m1 = -1;

  i = hsize - 16;
  do {                            /* might use Sys V memset(3) here */
    *(htab_p-16) = m1;
    *(htab_p-15) = m1;
    *(htab_p-14) = m1;
    *(htab_p-13) = m1;
    *(htab_p-12) = m1;
    *(htab_p-11) = m1;
    *(htab_p-10) = m1;
    *(htab_p-9) = m1;
    *(htab_p-8) = m1;
    *(htab_p-7) = m1;
    *(htab_p-6) = m1;
    *(htab_p-5) = m1;
    *(htab_p-4) = m1;
    *(htab_p-3) = m1;
    *(htab_p-2) = m1;
    *(htab_p-1) = m1;
    htab_p -= 16;
  } while ((i -= 16) >= 0);

  for ( i += 16; i > 0; i-- ) {
    *--htab_p = m1;
  }
}
static void compress ( int  init_bits,
FILE *  outfile,
byte data,
int  len 
) [static]

Definition at line 268 of file wx_gifwr.cc.

{
  register long fcode;
  register int i = 0;
  register int c;
  register int ent;
  register int disp;
  register int hsize_reg;
  register int hshift;

  /*
   * Set up the globals:  g_init_bits - initial number of bits
   *                      g_outfile   - pointer to output file
   */
  g_init_bits = init_bits;
  g_outfile   = outfile;

  /* initialize 'compress' globals */
  maxbits = GIFBITS;
  maxmaxcode = 1<<GIFBITS;
  memset((char *) htab, 0, sizeof(htab));
  memset((char *) codetab, 0, sizeof(codetab));
  hsize = HSIZE;
  free_ent = 0;
  clear_flg = 0;
  in_count = 1;
  out_count = 0;
  cur_accum = 0;
  cur_bits = 0;


  /*
   * Set up the necessary values
   */
  out_count = 0;
  clear_flg = 0;
  in_count = 1;
  maxcode = MAXCODE(n_bits = g_init_bits);

  ClearCode = (1 << (init_bits - 1));
  EOFCode = ClearCode + 1;
  free_ent = ClearCode + 2;

  char_init();
  ent = *data++;  len--;

  hshift = 0;
  for ( fcode = (long) hsize;  fcode < 65536L; fcode *= 2L ) {
    hshift++;
  }
  hshift = 8 - hshift;                /* set hash code range bound */

  hsize_reg = hsize;
  cl_hash( (count_int) hsize_reg);            /* clear hash table */

  output(ClearCode);
    
  while (len) {
    c = *data++;  len--;
    in_count++;

    fcode = (long) ( ( (long) c << maxbits) + ent);
    i = (((int) c << hshift) ^ ent);    /* xor hashing */

    if ( HashTabOf (i) == fcode ) {
      ent = CodeTabOf (i);
      continue;
    }

    else if ( (long)HashTabOf (i) < 0 )      /* empty slot */
      goto nomatch;

    disp = hsize_reg - i;           /* secondary hash (after G. Knott) */
    if ( i == 0 )
      disp = 1;

probe:
    if ( (i -= disp) < 0 )
      i += hsize_reg;

    if ( HashTabOf (i) == fcode ) {
      ent = CodeTabOf (i);
      continue;
    }

    if ( (long)HashTabOf (i) > 0 ) 
      goto probe;

nomatch:
    output(ent);
    out_count++;
    ent = c;

    if ( free_ent < maxmaxcode ) {
      CodeTabOf (i) = free_ent++; /* code -> hashtable */
      HashTabOf (i) = fcode;
    }
    else
      cl_block();
  }

  /* Put out the final code */
  output(ent);
  out_count++;
  output(EOFCode);
}

Here is the call graph for this function:

static void flush_char ( void  ) [static]

Definition at line 542 of file wx_gifwr.cc.

{
  if( a_count > 0 ) {
    fputc( a_count, g_outfile );
    fwrite( accum, 1, a_count, g_outfile );
    a_count = 0;
  }
}      

Here is the caller graph for this function:

static void output ( int  code) [static]

Definition at line 399 of file wx_gifwr.cc.

{
  cur_accum &= masks[cur_bits];

  if (cur_bits > 0)
    cur_accum |= ((long)code << cur_bits);
  else
    cur_accum = code;
       
  cur_bits += n_bits;

  while( cur_bits >= 8 ) {
    char_out( (unsigned int) (cur_accum & 0xff) );
    cur_accum >>= 8;
    cur_bits -= 8;
  }

  /*
   * If the next entry is going to be too big for the code size,
   * then increase it, if possible.
   */

  if (free_ent > maxcode || clear_flg) {

    if( clear_flg ) {
      maxcode = MAXCODE (n_bits = g_init_bits);
      clear_flg = 0;
    }
    else {
      n_bits++;
      if ( n_bits == maxbits )
       maxcode = maxmaxcode;
      else
       maxcode = MAXCODE(n_bits);
    }
  }
       
  if( code == EOFCode ) {
    /* At EOF, write the rest of the buffer */
    while( cur_bits > 0 ) {
      char_out( (unsigned int)(cur_accum & 0xff) );
      cur_accum >>= 8;
      cur_bits -= 8;
    }

    flush_char();
       
    fflush( g_outfile );

    if( ferror( g_outfile ) )
    {
      fprintf(stderr, "Unable to write GIF file\n");
      exit(1);
    }
  }
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void putword ( int  w,
FILE *  fp 
) [static]

Definition at line 177 of file wx_gifwr.cc.

{
  /* writes a 16-bit integer in GIF order (LSB first) */
  fputc(w & 0xff, fp);
  fputc((w>>8)&0xff, fp);
}

Variable Documentation

int a_count [static]

Definition at line 513 of file wx_gifwr.cc.

char accum[256] [static]

Definition at line 526 of file wx_gifwr.cc.

byte bw[2] = {0, 0xff} [static]

Definition at line 62 of file wx_gifwr.cc.

int clear_flg = 0 [static]

Definition at line 239 of file wx_gifwr.cc.

int ClearCode [static]

Definition at line 263 of file wx_gifwr.cc.

unsigned short codetab[HSIZE] [static]

Definition at line 214 of file wx_gifwr.cc.

long CountDown [static]

Definition at line 60 of file wx_gifwr.cc.

unsigned long cur_accum = 0 [static]

Definition at line 190 of file wx_gifwr.cc.

int cur_bits = 0 [static]

Definition at line 191 of file wx_gifwr.cc.

int curx [static]

Definition at line 59 of file wx_gifwr.cc.

int cury [static]

Definition at line 59 of file wx_gifwr.cc.

int EOFCode [static]

Definition at line 264 of file wx_gifwr.cc.

int free_ent = 0 [static]

Definition at line 233 of file wx_gifwr.cc.

int g_init_bits [static]

Definition at line 260 of file wx_gifwr.cc.

FILE* g_outfile [static]

Definition at line 261 of file wx_gifwr.cc.

int Height [static]

Definition at line 58 of file wx_gifwr.cc.

int hsize = HSIZE [static]

Definition at line 218 of file wx_gifwr.cc.

count_int htab[HSIZE] [static]

Definition at line 213 of file wx_gifwr.cc.

long int in_count = 1 [static]

Definition at line 241 of file wx_gifwr.cc.

int Interlace [static]

Definition at line 61 of file wx_gifwr.cc.

unsigned long masks[] [static]
Initial value:
 { 0x0000, 0x0001, 0x0003, 0x0007, 0x000F,
                                  0x001F, 0x003F, 0x007F, 0x00FF,
                                  0x01FF, 0x03FF, 0x07FF, 0x0FFF,
                                  0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF }

Definition at line 394 of file wx_gifwr.cc.

int maxbits = GIFBITS [static]

Definition at line 207 of file wx_gifwr.cc.

int maxcode [static]

Definition at line 208 of file wx_gifwr.cc.

int maxmaxcode = 1 << GIFBITS [static]

Definition at line 209 of file wx_gifwr.cc.

int n_bits [static]

Definition at line 206 of file wx_gifwr.cc.

long int out_count = 0 [static]

Definition at line 242 of file wx_gifwr.cc.

int Width [static]

Definition at line 58 of file wx_gifwr.cc.