home | help
M-GIF(4)		    Kernel Interfaces Manual			M-GIF(4)

NAME
     m-gif - GIF87a and annimated GIF89a format (MedCon)

DESCRIPTION
  The Graphics Interchange Format from CompuServe allows between 1 and 8 bits of
  color  information  with an RGB color palette. The image arrays are compressed
  with an LZW coding. The extension of the file is `.gif'.

  The basic defines for the format:

  ---------------------------------------------------------------------------

  typedef struct {
	  char sig[6];			     /* GIF87a or GIF89a	 */
	  Uint16 screenwidth,screenheight;   /* screen dimensions	 */
	  Uint8  flags,background,aspect;    /* background color, ratio  */

  } MDC_GIFHEADER;

  #define MDC_GIF_GH_SIZE 13

  typedef struct {
	  Uint16 left,top,width,height;       /* image dimensions	  */
	  Uint8  flags;
  } MDC_GIFIMAGEBLOCK;

  #define MDC_GIF_IBLK_SIZE  9

  typedef struct {			     /* display information	 */
	  Uint8 blocksize;
	  Uint8 flags;
	  Uint16 delay;
	  Uint8 transparent_colour;
	  Uint8 terminator;
  } MDC_GIFCONTROLBLOCK;

  #define MDC_GIF_CBLK_SIZE 6

  typedef struct {			     /* plain text block	 */
	  Uint8 blocksize;
	  Uint16 left,top;
	  Uint16 gridwidth,gridheight;
	  Uint8 cellwidth,cellheight;
	  Uint8 forecolour,backcolour;
  } MDC_GIFPLAINTEXT;

  #define MDC_GIF_TBLK_SIZE 13

  typedef struct {			     /* application block	 */
	  Uint8 blocksize;
	  char applstring[8];
	  char authentication[3];
  } MDC_GIFAPPLICATION;

  #define MDC_GIF_ABLK_SIZE 12

  ---------------------------------------------------------------------------

  What does the format support or not support:

  ===========================================================================
  Item		  Supported				Not Supported
  ===========================================================================
  Color Map	: max 256 RGB colors			      -
  File Endian	: little				     big
  Pixeltypes	: Uint8 				      -
  ===========================================================================
  Scaling factors  : quantify & calibrate factors/image  are NOT supported
  ---------------------------------------------------------------------------
  Dimensions/Image : different dimensions for each image are supported
  ---------------------------------------------------------------------------
  Pixeltypes/Image : different pixeltypes for each image are NOT supported
  ===========================================================================

  Because of the flexible nature of the GIF format it could be possible  to  in-
  clude scaling factors per image with the  GIF extension blocks, but more about
  this later. The image is stored from left to right and from top to bottom, un-
  less the images are interlaced.

  First some explanation on the GIF format and its different structures.

  =======================
  The GIFHEADER structure
  =======================

  This data structure is the very first information in a GIF file:

     sig[6]
	    Holds the signature of the file "GIF87a" or "GIF89a".

     screenwidth, screenheight
	    The required screen dimensions in pixels to display the images.

     background
	    This  represents  the background color. It is in fact an index entry
	    in the color palette.

     aspect
	    The aspect ratio of the pixels in the image. If this field is not  0
	    the aspect ratio is: ((gh.aspect + 15) / 64). This entry is always 0
	    for the GIF87a format.

     flags  This fields contains a number of bits of information.
	    if (gh.flags & 0x0080) is true, a global color map will follow.
		 The number of color bits: ((gh.flags & 0x0007) + 1)
		 The number of colors	 : (1 << ((gh.flags & 0x0007) + 1)
	    if (gh.flags > 0x0008) is true, the color palette is sorted with the
	    most important colors first. This bit is low in GIF87a.
	    Finally  (1  << ((gh.flags >> 4) + 1) represents the number of color
	    bits in the original image. This bit is low in GIF87a.

  After reading the GIFHEADER and any global colormap, there should be a  `block
  separator'  which  introduce the following block of GIF information. There are
  three kind of `block separators' : a comma, an exclamation mark  and	a  semi-
  colon.
		       ','  =>	the next block will be an image
		       '!'  =>	the next block will be an extension
		       ';'  =>	the end of the GIF file

  The  image  block  after  a comma consists of the IMAGEBLOCK structure and the
  compressed image.  The IMAGEBLOCK structure defines the nature  of  the  image
  and supersedes the global definitions.

  ========================
  The IMAGEBLOCK extension
  ========================

     left, top
	    The upper left coordinate of the image  relative to the screen.

     width, height
	    The image dimensions. Width is the number of pixels in a line. Depth
	    represents the number of rows.

     flags  This  field  is  similar to the global flags in the GIFHEADER struc-
	    ture.  Number of colors in the image is ((iblk.flags & 0x0007) + 1).
	    If (iblk.flags & 0x0040) is true, the image is interlaced.	In  this
	    case  the  image  is  split  into  four passes instead of sequential
	    lines:
			    1st pass: lines 0  8 16 24 ... (+8)
			    2nd pass: lines 4 12 20 28 ... (+8)
			    3rd pass: lines 2  6 10 14 ... (+4)
			    4th pass: lines 1  3  5  7 ... (+2)
	    If (iblk.flags & 0x0080) is true, there is a local color map.
	    If (iblk.flags & 0x0020) is true, the color map is sorted.

  The next byte, after the IMAGEBLOCK should be the initial image code size  The
  compressed  image consists of subblocks of code, of which the first byte gives
  the amount of code bytes that follow. The last block is a  zero-length  block.
  This is how you could skip an image:

       FILE *fp;
       int i,n;

       do {
	 n = fgetc(fp); 		    /* get code size		   */
	 if (n != EOF) {
	   for (i=0; i<n; i++) fgetc(fp);   /* skip the block		   */
	 }
       }while( (n != 0) && (n != EOF))	    /* read the next block, if any */

  After  reading  this	hole image block, the next byte should be again a `block
  separator'.  If this separator is an exclamation mark, the following block  is
  an extension. The GIF extension blocks allow additional features.

  =====================
  The COMMENT extension
  =====================

  This is a very simple extension. The byte 0xfe after a block separator, intro-
  duces  a comment block. It contains text that does not make part of the image.
  The comment block is stored as subblocks, ending with a  zero-length	subblock
  (or endblock).

  =======================
  The PLAINTEXT extension
  =======================

  This is identified by the byte 0x01 after the block separator. The data struc-
  ture follows this byte.

     left, top
	    The items give the starting position of the displayed text.

     gridwidth, gridheight
	    Two  elements that specify the distance in pixels from one character
	    to the next.

     cellwidth, cellheight
	    These fields represent the actual dimensions in pixels of the  char-
	    acters to be displayed.

     forecolor, backcolor
	    Color map indices for the foreground and background respectively.

  The  next  data  after  this structure is the text itself, stored in data sub-
  blocks just like the comment block is.

  ==========================
  The CONTROLBLOCK extension
  ==========================

  A GIF file with more then one picture also contains a CONTROLBLOCK  extension.
  The  byte  0xf9  after  the  block separator, represents this graphics control
  block. Following this byte is the data structure.

     blocksize
	    This field always contains the value 0x04.

     flags  if (cb.flags & 0x01) is true, cb.transparent_color	will  contain  a
	    valid transparent color index.
	    if	(cb.flags  &  0x02) is true, the viewing program should wait for
	    user input before  displaying  the	next  image.  if  (cb.delay)  is
	    greater than zero, the viewer should at least wait for the number of
	    seconds specified in the delay data field.
	    The  value ((cb.flags >> 2) & 0x0007) tells the method to remove the
	    present image from the screen:

	    0 = do nothing
	    1 = leave it
	    2 = restore with the background color
	    3 = restore with the previous graphic

     delay  The delay in 1/100ths of a second to dispose the present graphic.

     transparant_color
	    This fields represents the color index of the transparant color.

     terminator
	    Any clues on this?

  =========================
  The APPLICATION extension
  =========================

  The final extension is the APPLICATION block. The application  data  structure
  is identified by the byte 0xff just after the block separator.

     blocksize
	    This contains the value 0x0b.

     applstring
	    An 8-byte string that specifies the creator software.

     authentication
	    This  field  should contain 3 bytes based on the applstring field to
	    check the integrity of the applstring field.

  The APPLICATION block extension can be followed by subblocks,  ending  with  a
  zero-length subblock.

  A  special kind of APPLICATION block extension is the LOOPBLOCK extension used
  for annimated GIF files in concern to Netscape Navigator.   This  block  comes
  between the GIFHEADER and IMAGEBLOCK data structures.  It contains the follow-
  ing items:
	 1. An application block
		  ap.blocksize	    = 0x0b;
		  ap.applstring     = "NETSCAPE";
		  ap.authentication = "2.0";
	 2. subblock of 3 bytes: 0x03
		  0x01,0xe8,0x03
	 3. endblock of 0 bytes: 0x00

NOTES
     For complete information on the GIF format, we liked reading this book:

  ``Supercharged Bitmapped Graphics''
  written by Steve Rimmer
  published by Windcrest/McGraw-Hill
  ISBN: 0-8306-3788-5

FILES
  /usr/local/xmedcon/source/m-gif.h	The header file.
  /usr/local/xmedcon/source/m-gif.c	The source file.

SEE ALSO
  medcon(1), xmedcon(1), xmedcon-config(1)

  m-acr(4), m-anlz(4), m-inw(4), m-intf(4), m-ecat(4)

  medcon(3)

AUTHOR
  (X)MedCon  project  was  originally written by Erik Nolf (eNlf) for the former
  PET-Centre at Ghent University (Belgium).

  e-mail:   enlf-at-users.sourceforge.net   www:   http://xmedcon.sourceforge.net

									M-GIF(4)

home | help