dmb@TIS.COM (David M. Baggett) (01/05/89)
It is January already? Thanks, once again, to Jim McCabe for correting the MacPaint format. Here's the monhtly posting: ------------------------------------------------------------------------------ ST Picture Formats ------------------ Compiled by: Dave Baggett (arpanet: dmb@TIS.COM) (Please report errors or additions) CONTRIBUTORS Phil Blanchfield David Brooks Neil Forsyth Ken MacLeod Jim McCabe Darek Mihocka David Mumper George Seto Joe Smith Greg Wageman Gerry Wheeler Introductory information ------------------------ word = 2 bytes long = 4 bytes palette = Hardware color palette, stored as 16 words. First word is color register zero (background), last word is color register 15. Each word has the form: Bit: (MSB) 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 (LSB) -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 0 0 0 0 0 R2 R1 R0 0 G2 G1 G0 0 B2 B1 B0 R2 = MSB of red intensity R0 = LSB of red intensity G2 = MSB of green intensity G0 = LSB of green intensity B2 = MSB of blue intensity B0 = LSB of blue intensity Intensity ranges from 0 (color not present) to 7 (highest intensity). Example: { red = 7, green = 3, blue = 5 } -> 0735 (hex) Caveat: It is wise to mask off the upper four bits of each palette entry, since a few programs store special information there (most notably Art Studio). The Formats ----------- <NEOChrome> 1 long resolution (0 = low res, 1 = medium res, 2 = high res) 16 words palette 12 bytes filename (" . ") 1 byte Left color animation limit (starting color number) 1 byte Right color animation limit (ending color number) 1 byte color rotation speed 1 byte color rotation direction 1 word color rotation duration (number of iterations) 18 longs reserved for expansion 16000 words picture data (screen memory) ----------- 32128 bytes total <NEOChrome Animation> NOTE: To get this feature on versions 0.9 and later select the Grabber icon and click the both mouse buttons in the eye of the second R in the word GRABBER. Interestingly enough, some versions of NEO only require you to press the right button, not both. Hmmm... 1 long magic number BABEEBEA (hex) (seems to be ignored) 1 word width of sprite in bytes (always divisible by 8) 1 word height of sprite in scan lines 1 word size of sprite in bytes + 10 (!) 1 word x coordinate of sprite (must be divisible by 16) - 1 1 word y coordinate of sprite - 1 1 word number of frames 1 word animation speed (larger means slower) 1 long reserved; should be zero -------- 22 bytes total for header ? words sprite image data (words of screen memory) for each sprite, in order <DEGAS> 1 word resolution (0 = low res, 1 = medium res, 2 = high res) Other bits may be used in the future; use a simple bit test rather than checking for specific word values. 16 words palette 16000 words picture data (screen memory) ----------- 32034 bytes total <DEGAS Elite (Uncompressed)> 1 word resolution (0 = low res, 1 = medium res, 2 = high res) Other bits may be used in the future; use a simple bit test rather than checking for specific word values. 16 words palette 16000 words picture data (screen memory) 4 words left color animtion limit table (starting color numbers) 4 words right color animation limit table (ending color numbers) 4 words animation channel direction flag (0 = left, 1 = off, 2 = right) 4 words animation channel delay in 1/60's of a second. [0 - 128] ----------- 32066 bytes total <DEGAS Elite (Compressed)> 1 word resolution (same as Degas, but high order bit is set; i.e., hex 8000 = low res, hex 8001 = medium res, hex 8002 = high res). Other bits may be used in the future; use a simple bit test rather than checking for specific word values. 16 words palette < 32000 bytes control bytes 4 words left color animtion limit table (starting color numbers) 4 words right color animation limit table (ending color numbers) 4 words animation channel direction flag (0 = left, 1 = off, 2 = right) 4 words animation channel delay in 1/60's of a second. [0 - 128] ----------- < 32066 bytes total Control byte meanings: For a given control byte, x: 0 <= x <= 127 Use the next x + 1 bytes literally (no repetition) -127 <= x <= -1 Use the next byte -x + 1 times -128 No operation (ignore) Compression Scheme: Each scan line is compressed separately; i.e., all data for a given scan line appears before any data for the next scan line. The scan lines are specified from top to bottom (i.e., 0 is first). For each scan line, all the data for a given bit plane appears before any data for the next higher order bit plane. To clarify: The first data in the file will be the data for the lowest order bit plane of scan line zero, followed by the data for the next higher order bit plane of scan line zero, etc., until all bit planes have been specified for scan line zero. The next data in the file will be the data for the lowest order bit plane of scan line one, followed by the data for the next higher order bit plane of scan line one, etc., until all bit planes have been specified for all scan lines. <C.O.L.R. Object Editor Mural> 16000 words picture data (screen memory) (palettes are stored in separate files) ----------- 32000 bytes total <Tiny> 1 byte resolution (same as NEO, but +3 indicates rotation information also follows) If resolution > 2 { 1 byte left and right color animation limits. High 4 bits hold left (start) limit; low 4 bits hold right (end) limit 1 byte direction and speed of color animation (negative value indicates left, positive indicates right, absolute value is delay in 1/60's of a second. 1 word color rotation duration (number of iterations) } 16 words palette 1 word number of control bytes 1 word number of data words 3-10667 bytes control bytes 1-16000 words data words ------------- 42-32044 bytes total Control byte meanings: For a given control byte, x: x < 0 Absolute value specifies the number of unique words to take from the data section (from 1 to 127) x = 0 1 word is taken from the control section which specifies the number of times to repeat the next data word (from 128 to 32767) x = 1 1 word is taken from the control section which specifies the number of unique words to be taken from the data section (from 128 - 32767) x > 1 Specifies the number of times to repeat the next word taken from the data section (from 2 to 127) Format of expanded data: The expanded data is not screen memory bitmap data; the bitplanes are separated and presented in columns. All the data for a given bitplane appears before the data for the next bitplane. The data for each bitplane appears as a sequence of columns, where a column consists of one specific word taken from each line. For example, column 1 consists of word 1 on scanline 1 followed by word 1 on scanline 2, etc., followed by word 1 on scanline 200. To illustrate: The first data in the file will be the data for bitplane 1, which consists of columns 1, 5, 9, etc., in order. The next data will be the data for bitplane 2, which consists of columns 2, 6, 10, etc., in order. <Spectrum 512 (Uncompressed)> 80 words first scan line of picture (unused) -- should be zeroes 15920 words picture data (screen memory) for scan lines 1 through 199 9552 words 3 palettes for each scan line (the top scan line is not included because Spectrum 512 can't display it) ----------- 51104 bytes total <Spectrum 512 (Compressed)> 1 word 5350 (hex) ("SP") 1 word 0 (reserved for future use) 1 long length of data bit map 1 long length of color bit map <= 32092 bytes compressed data bit map <= 17910 bytes compressed color bit map -------------- < 50014 bytes total Data compression: Compression is via a modified run length encoding (RLE) scheme. The data map is stored as a sequence of records. Each record consists of a header byte followed by one or more data bytes. The meaning of the header byte is as follows: For a given header byte, x: 0 <= x < 127 Use the next x + 1 bytes literally (no repetition) -128 <= x < 0 Use the next byte -x + 2 times The data appears in the following order: 1. Picture data, bit plane 0, scan lines 1 - 199 2. Picture data, bit plane 1, scan lines 1 - 199 3. Picture data, bit plane 2, scan lines 1 - 199 4. Picture data, bit plane 3, scan lines 1 - 199 Decompression of data ends when 31840 data bytes have been used. Color map compression: Each 16-word palette is compressed separately. There are three palettes for each scan line (597 total). The color map is stored as a sequence of records. Each record starts with a 1-word bit vector which specifies which of the 16 palette entries are included in the data following the bit vector (1 = included, 0 = not included; i.e., stays the same). The least significant bit of the bit vector refers to palette entry zero, while the most significant bit refers to palette entry 15. Bit 15 must be zero, since Spectrum 512 does not use palette entry 15. Bit 0 should also be zero, since Spectrum 512 always makes the background color black. The words specifying the values for the palette entries indicated in the bit vector follow the bit vector itself, in order (0 - 15). <Animatic Film> 1 word number of frames 16 words palette 1 word speed (0 - 99; higher value is faster) 1 word direction (0 = forwards, 1 = backwards) 1 word end action (what to do after the last frame) 0 = pause, then repeat from beginning 1 = immediately repeat from beginning 2 = reverse 1 word width of film in pixels 1 word height of film in pixels 1 word version number (major) 1 word version number (minor) 1 long magic number 27182818 (hex) 3 longs reserved (should be all zeros) -------- 32 words total for header ? words image data (words of screen memory) for each frame, in order <MacPaint> header { 1 long version number (if zero, entire header is ignored) 38 * 2 longs pattern data (anyone know how to use this?) 83 longs reserved } (total 160 longwords for header) < 51200 bytes compressed bitmap data ------------- < 51716 bytes total Bitmap compression: The bitmap data is for a 576 pixel by 720 pixel monochrome image. The data is stored as a sequence of records. Each record consists of a control byte followed by one or more data bytes. The meaning of the control byte is as follows: For a given control byte, x: 0 < x < 127 Use the next x + 1 bytes literally (no repetition) -128 <= x <= 0 Use the next byte -x + 1 times There are 72 bytes per scan line. Each bit represents one pixel; 0 = white, 1 = black. Version of Wed Nov 23 12:25:50 EDT 1988 ------------------------------------------------------------------------------