<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=IFF_file_format</id>
	<title>IFF file format - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://www.temlib.org/AtariForumWiki/index.php?action=history&amp;feed=atom&amp;title=IFF_file_format"/>
	<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=IFF_file_format&amp;action=history"/>
	<updated>2026-07-27T01:46:58Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.2</generator>
	<entry>
		<id>https://www.temlib.org/AtariForumWiki/index.php?title=IFF_file_format&amp;diff=14269&amp;oldid=prev</id>
		<title>&gt;Lp: New page</title>
		<link rel="alternate" type="text/html" href="https://www.temlib.org/AtariForumWiki/index.php?title=IFF_file_format&amp;diff=14269&amp;oldid=prev"/>
		<updated>2017-01-03T00:21:16Z</updated>

		<summary type="html">&lt;p&gt;New page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
Interchange File Format    *.IFF&lt;br /&gt;
 &lt;br /&gt;
4 bytes         &amp;quot;FORM&amp;quot; (FORM chunk ID)&lt;br /&gt;
1 long          length of file that follows&lt;br /&gt;
4 bytes         &amp;quot;ILBM&amp;quot; (InterLeaved BitMap file ID)&lt;br /&gt;
&lt;br /&gt;
4 bytes         &amp;quot;BMHD&amp;quot; (BitMap HeaDer chunk ID)&lt;br /&gt;
1 long          length of chunk [20]&lt;br /&gt;
20 bytes        1 word = image width in pixels&lt;br /&gt;
                1 word = image height in lines&lt;br /&gt;
                1 word = image x-offset [usually 0]&lt;br /&gt;
                1 word = image y-offset [usually 0]&lt;br /&gt;
                1 byte = # bitplanes&lt;br /&gt;
                1 byte = mask (0=no, 1=impl., 2=transparent, 3=lasso)&lt;br /&gt;
                1 byte = uncompressed [0], packbits [1], vertical RLE [2]&lt;br /&gt;
                1 byte = unused [0]&lt;br /&gt;
                1 word = transparent color (for mask=2)&lt;br /&gt;
                1 byte = x-aspect [5=640x200, 10=320x200/640x400, 20=320x400]&lt;br /&gt;
                1 byte = y-aspect [11]&lt;br /&gt;
                1 word = page width (usually the same as image width)&lt;br /&gt;
                1 word = page height (usually the same as image height)&lt;br /&gt;
&lt;br /&gt;
4 bytes         &amp;quot;CMAP&amp;quot; (ColorMAP chunk ID)&lt;br /&gt;
1 long          length of chunk [3*n where n is the # colors]&lt;br /&gt;
3n bytes        3 bytes per RGB color.  Each color value is a byte&lt;br /&gt;
                and the actual color value is left-justified in the&lt;br /&gt;
                byte such that the most significant bit of the value&lt;br /&gt;
                is the MSB of the byte.  (ie. a color value of 15 ($0F)&lt;br /&gt;
                is stored as $F0)  The bytes are stored in R,G,B order.&lt;br /&gt;
&lt;br /&gt;
4 bytes         &amp;quot;CRNG&amp;quot; (Color RaNGe chunk ID)&lt;br /&gt;
1 long          length of chunk [8]&lt;br /&gt;
8 bytes         1 word = reserved [0]&lt;br /&gt;
                1 word = animation speed (16384 = 60 steps per second)&lt;br /&gt;
                1 word = active [1] or inactive [0]&lt;br /&gt;
                1 byte = left/lower color animation limit&lt;br /&gt;
                1 byte = right/upper color animation limit&lt;br /&gt;
&lt;br /&gt;
4 bytes         &amp;quot;CAMG&amp;quot; (Commodore AMiGa viewport mode chunk ID)&lt;br /&gt;
1 long          length of chunk [4]&lt;br /&gt;
1 long          viewport mode bits:&lt;br /&gt;
                  bit  2 = interlaced&lt;br /&gt;
                  bit  7 = half-bright&lt;br /&gt;
                  bit 11 = HAM&lt;br /&gt;
                  bit 15 = high res&lt;br /&gt;
&lt;br /&gt;
4 bytes         &amp;quot;BODY&amp;quot; (BODY chunk ID)&lt;br /&gt;
1 long          length of chunk [# bytes of image data that follow]&lt;br /&gt;
? bytes         actual image data&lt;br /&gt;
 &lt;br /&gt;
NOTES: Some of these chunks may not be present in every IFF file, and may&lt;br /&gt;
not be in this order.  You should always look for the ID bytes to find a&lt;br /&gt;
certain chunk.  All chunk IDs are followed by a long value that tells the&lt;br /&gt;
size of the chunk (note that &amp;quot;ILBM&amp;quot; is not a chunk ID).  This is the number of&lt;br /&gt;
bytes that FOLLOW the 4 ID bytes and size longword.  The exception to this is&lt;br /&gt;
the FORM chunk.  The size longword that follows the FORM ID is the size of the&lt;br /&gt;
remainder of the file.  The FORM chunk must always be the first chunk in an&lt;br /&gt;
IFF file.&lt;br /&gt;
&lt;br /&gt;
The R,G,B ranges of AMIGA and ST are different (AMIGA 0...15, ST 0...7),&lt;br /&gt;
as is the maximum number of bitplanes (AMIGA: 5, ST: 4).&lt;br /&gt;
&lt;br /&gt;
Format of body data&lt;br /&gt;
 &lt;br /&gt;
An expanded picture is simply a bitmap.  The most common packing method is &lt;br /&gt;
PackBits (see below), and is identical to MacPaint and DEGAS Elite compressed.&lt;br /&gt;
 &lt;br /&gt;
The (decompressed) body data appears in the following order:&lt;br /&gt;
 &lt;br /&gt;
        line 1 plane 0 ... line 1 plane 1 ... ... line 1 plane m&lt;br /&gt;
        [line 1 mask (if appropriate)]&lt;br /&gt;
        line 2 plane 0 ... line 2 plane 1 ... ... line 2 plane m&lt;br /&gt;
        [line 2 mask (if appropriate)]&lt;br /&gt;
        ...&lt;br /&gt;
        line x plane 0 ... line x plane 1 ... ... line x plane m&lt;br /&gt;
        [line x mask (if appropriate)]&lt;br /&gt;
 &lt;br /&gt;
The FORM chunk identifies the type of data:&lt;br /&gt;
 &lt;br /&gt;
        &amp;quot;ILBM&amp;quot; = interleaved bit map&lt;br /&gt;
        &amp;quot;8SVX&amp;quot; = 8-bit sample voice&lt;br /&gt;
        &amp;quot;SMUS&amp;quot; = simple music score&lt;br /&gt;
        &amp;quot;FTXT&amp;quot; = formatted text (Amiga)&lt;br /&gt;
&lt;br /&gt;
The ST version of DPAINT always uses the vertical RLE packing format in the body data. &lt;br /&gt;
Within the BODY chunk there is one VDAT chunk per bit plane (four in total). Every VDAT chunk &lt;br /&gt;
is laid out in columns, similar to the Tiny format. Only the compression scheme is slightly &lt;br /&gt;
different, command 0, and 1 are flipped, and extra count words store in data list.&lt;br /&gt;
4 bytes          'VDAT' vertical bitplane data&lt;br /&gt;
4 bytes          length of cunk&lt;br /&gt;
?? bytes       compressed data&lt;br /&gt;
&lt;br /&gt;
Data compression format:&lt;br /&gt;
2 bytes          cmd_cnt command bytes count - 2&lt;br /&gt;
? bytes          cmd_cnt - 2 command bytes.&lt;br /&gt;
? words         data words&lt;br /&gt;
&lt;br /&gt;
Note that the number of commands is 2 more than actual commands, and that the data &lt;br /&gt;
words may start on an odd address if the number of command bytes are odd.&lt;br /&gt;
&lt;br /&gt;
while(cmd_cnt&amp;gt;2)&lt;br /&gt;
  1 byte cmd     0: read one data word as count&lt;br /&gt;
                    output count literal words from data words.&lt;br /&gt;
                 1: read one command word as count, then one data word as data&lt;br /&gt;
                    output data count times&lt;br /&gt;
                &amp;lt;0: -cmd is count, output count words from data words&lt;br /&gt;
                &amp;gt;2: cmd is count, read one data word as data&lt;br /&gt;
                    output data count times&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
See also [[PackBits Compression Algorithm]]&lt;br /&gt;
&lt;br /&gt;
Back to [[ST Picture Formats]]&lt;/div&gt;</summary>
		<author><name>&gt;Lp</name></author>
	</entry>
</feed>