They contain the frames, which are the "one view" objects (you can turn around them, and you always see the same image).
Here is the data structure for the FME file headers.
FME_Header1 IS { InsertX long // Insertion point, X coordinate // This is a negative value InsertY long // Insertion point, Y coordinate // This is a negative value Flip long // 0 = not flipped // 1 = flipped horizontally // 2 = flipped vertically (?) Header2 long // pointer to FME_Header2 UnitWidth long // Unused UnitHeight long // Unused pad3 long // Unused pad4 long // Unused } |
FME_Header2 IS { SizeX long // Size of the FME (cell), X value SizeY long // Size of the FME (cell), Y value Compressed long // 0 = not compressed // 1 = compressed DataSize long // Datasize for compressed FMEs, // equals length of the FME file - 32 // If not compressed, DataSize = 0 ColOffs long // Always 0, because columns table // follows just after pad1 long // Unused } |
If Compressed = 0, the data follows, encoded by COLUMNS from the bottom to the top.
Compressed FMEs are very similar to compressed BMs using RLE0.
After FME_Header2 follows a table of offsets to the starts of the columns data.
Those are offsets from the start of FME_Header2.
Then follow the columns data.
The coding of one column follows (in pseudo code format).
while(end of data for this column not reached) { if(buffer[address] <= 128) the FOLLOWING n bytes are direct values else skip n-128 transparent (background) pixels } |
So, for example, the following hex values ...88 02 17 28 82... mean:
skip 8 background pixels, then write two pixels with colors 17 and 28, then skip 2 background pixels, etc.