Paul Mace Software Inc.
400 Willaimson Way
Ashland OR 97520
DFF File Format
I don't do vertical run length encoding, because I always thought the
overhead was not worth it, particularly for DFF playback.
DFF has 8 bytes per frame for a window of thwere the changes take place.
The actual difference data is 80 to FF is count of number of bytes to move,
0 to 3F is skip count, and 40 to 7F is RLE count. If a count is zero
(80, 40, and 0) the following word is the count (mostly for big skips).
This is definitely not how I'd do it now, but I threw it together 4 or
5 years ago and never wanted to change it and make all my users convert
unsigned int dffcnt; // number of frames in DFF file
unsigned char numbits; // number of bits per pixel
unsigned char numpl; // number of bit planes
unsigned long dffpos; // position of frame in file
unsigned long dfflen; // width and height of frame
int xsize; // width and height of frame
int xoff; // offset relative to 0,0 of frame data
The dffpos offsets are relative to the end of the header, so the offset
for th first frame is usually zero and the data is right after the last
structure in list. The actual DFF data is stored one scanline at a
time (no skips or fills across scanlines). The rectangles defined for
each frame can be different (and virtually always are different).
Something to keep in mind is that the DFF format does not include
palette information, so there may be a first frame which has palette
information usually stored as a GIF, PIC, or PCX. The first frame can
be stored in the DFF (effectively a difference with nothing). But if
one stores the first frame in the DFF, there is no way to currently include
a palette. Do people often use PCX, PIC, or GIF file for the first frame
and name it the same as the DFF.
In some unusual cases, the DFF is intended to start playing on a generated
screen, so the first frame may not exist in file form. But that's very
unusual. Also DFF's can be generated for two pages, so the actual DFF
file is the difference sequence:
1 dif 2 (difference between frames 1 and 2)
1 dif 3
2 dif 4
3 dif 5
4 dif 6
5 dif 7
this is really only for 16 color modes.
Plus I support XOR'D DFFs where all the difference information is XOR for
playing the DFF forwards or backwards. Sadly I didn't put in any kind of
flag or bit field for this information, so there is no way to know that a
DFF is XOR or 2-page without asking the user. But the vast majority of
DFF's are neither 2-page nor XOR.
Paul Mace Software