139 lines
5.6 KiB
Plaintext
139 lines
5.6 KiB
Plaintext
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;
|
||
|