DeluxePaint Animation ".ANM" files consist of a large header and a series of
structures that can be up to 64 KB long each.  The programmer refers to these
structures as "Large Pages".  Large Pages are a format for dividing a file
into 64 KB chunks that can be stored out-of-sequence in the file.  That is,
a large page can be logically inserted into the file, without having to move
all the following data out of the way.

Each large page holds one or more "records".  A record represents one frame
of the original animation.  A record is of any length from 0 to almost 64 KB.
The records in a large page are sequential.  However, the first large page
may not contain the first frames of the anim file.  Each large page contains
a sequential set of records but the large pages themselves are not in
sequential order.  It is possible for the first large page in a file to
contain the last few frames of the animation.  When you process the anim file
you must scan the large page structures to find which large page conatins the
frame you wish to display or process next.

A DeluxePaint Animation "ANM" ("Anim") file is built on this mechanism,
so that as frames change in size, they can be maintained with a minimum
of extra file i/o, yet without loss of playback performance.
In addition, there is an optional special record which is the delta from
the last frame to the first frame, for smooth playback of looping anims.

The following is the structure of a DeluxeAnimate anim file header.
Header size is exactly 2816 bytes.  The first large page structure can be
reached by simply seeking to this location in the file.

 ULONG id;		4 character ID == "LPF "

 UWORD maxLps;		max # largePages allowed. 256 FOR NOW.  

 UWORD nLps;		# largePages in this file.

 ULONG nRecords;	# records in this file.  65534 is current limit plus
			one for last-to-first delta for looping the animation

 UWORD maxRecsPerLp;	# records permitted in an lp. 256 FOR NOW.  

 UWORD lpfTableOffset;	Absolute Seek position of lpfTable.  1280 FOR NOW.
			The lpf Table is an array of 256 large page structures
			that is used to facilitate finding records in an anim
			file without having to seek through all of the Large
			Pages to find which one a specific record lives in.

 ULONG contentType;	4 character ID == "ANIM"

 UWORD width;		Width of screen in pixels.
 UWORD height;		Height of screen in pixels.
 UBYTE variant;		0==ANIM.
 UBYTE version;		0==frame rate is multiple of 18 cycles/sec.
			1==frame rate is multiple of 70 cycles/sec. 

 UBYTE hasLastDelta;	1==Last record is a delta from last-to-first frame.

 UBYTE lastDeltaValid;	0==The last-to-first delta (if present) hasn't been
			updated to match the current first&last frames,	so it
			should be ignored.

 UBYTE pixelType;	0==256 color.

 UBYTE CompressionType;	1==(RunSkipDump) Only one used FOR NOW.

 UBYTE otherRecsPerFrm;	0 FOR NOW.

 UBYTE bitmaptype;	1==320x200, 256-color.  Only one implemented so far.

 UBYTE recordTypes[32];	Not yet implemented.

 ULONG nFrames;		In case future version adds other records at end of
			file, we still know how many actual frames.
			NOTE: DOES include last-to-first delta when present.

 UWORD framesPerSecond;	Number of frames to play per second.

 UWORD pad2[29];	58 bytes of filler to round up to 128 bytes total.

 Range cycles[16];	Color cycling info (128 bytes long).
			This is the format of a cycle structure.
			typedef struct {
					WORD count;
					WORD rate;
					WORD flags;
					UBYTE low, high; /* bounds of range */
					} Range;


	total is = 256 bytes.

 Following the anim file header is the color palette

 ULONG	palette[256]	Color palette arranged as 3 bytes each of Red Green
			& Blue and one unused byte.

 Following the palette is an array of structures that are copies of the
 large page headers.  This array is loaded and used to find which large page
 a given frame can be found in.

 Large_page LParay[256]	Copies of all the Large Page structures in the anim
			file.  Each Large Page structure is 6 bytes long so
			the total length of this table is 1536 bytes.  Even if
			the file only contains 1 large page there are still
			256 entries of 6 bytes each.

 The Large Pages follow the LParray and are in the sequence dictated by
 their order of occurence in the LParray in the anim file header.

 The following is the structure of a single Large Page in an anim file.  Each
 Large Page is exactly 64k long in the anim file.  The only exception is the
 last large page wich is truncated to be only as long as necessary.

 UWORD baseRecord;	Number of first record in this large page.

 UWORD nRecords;	Number of records in lp.
			bit 15 of "nRecords" == "has continuation from previous lp".
	    		bit 14 of "nRecords" == "final record continues on next lp".

 UWORD nBytes;		Total number of bytes of contents, excluding header.

 UWORD BytesContinued;	The number of bytes of the last record of the
			previous large page that extend into this large page.
			This was never implemented and is always 0.

 UWORD RecordSizes[nRecords] Array of lengths of each record in the large page.

 The actual records start here.  Each record has a variable length header that
 is like the following structure.

	typedef struct{
		UBYTE IDnum;		always 66
		UBYTE Flags;		0==no extra bytes field next

		UWORD extrabytes;	if Flags is non zero this is # of bytes
					to skip before compressed data starts
					extrabytes does not include the size
					of the 2 previous bytes.  Also make
					sure you round the final address up to
					an even byte boundry.
		} record_header;
