QuantumPaint file format

From AtariForumWiki
Jump to: navigation, search
QuantumPaint    *.PBX (low and medium resolution)

3 bytes         0
1 byte          mode, 0x00 =  128 color low resolution pciture, 
                      0x01 =   32 color medium resolution picture,
                      0x80 =  512 color picture low resolution picture
                      0x81 = 4096 color picture low resolution picture
1 word          0x8001 = compressed
                Quantumpaint v2.00 sets it to 0x8000 for uncompressed files
                Quantumpaint v1.00 seems to use 0x0000 for lowras and 0x0333
                for medium res bytes. The PBX viewer only tests for 0x8001.
122 bytes       ??
                total 128 header bytes
?? bytes        palette data;
                for uncompressed normal pictures 8 pallete datasets follow:
                    16 words: 16 palettes
                     1 word: number of the first line this pallet is used
                     1 word: 0 the palette is not active, else this pallete is active
                     1 word: first color of color cycle
                     1 word: last color of color cycle
                     1 word: cycle speed, number of vbl's between steps, 0 = fastest
                     1 word: 0: no cycling, 1 cycle right, 0xffff cycle left
                     2 word: ?? should be zero
                    __
                    48 bytes per palette
                    The first palette should always be active and start on line 0
                   ___
                   384 bytes palette data for low (128 color) and medium (32 color) pictures
                for uncompressed 512 color pictures 6400 words (32 colors per scanline)
                for uncompressed 4096 color pictures 12800 words (32 colors per scanline,
                2 palette sets for alternating screens, two 6400 word blocks)
?? bytes        screen data, for uncompressed pictures this is 32000 bytes for all modes
--------
> 128 bytes total

Compression scheme
Palette and screen data are compressed into one block using packbits compression.
The expanded screen data is not simply screen memory bitmap data; instead, the 
data is divided into four sets of vertical columns.  (This results in
better compression.)  A column consists of one specific word taken
from each scan line, going from top to bottom.  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.
   The columns appear in the following order:

   1st set contains columns 1, 5,  9, 13, ..., 69, 73, 77 in order
   2nd set contains columns 2, 6, 10, 14, ..., 70, 74, 78 in order
   3rd set contains columns 3, 7, 11, 15, ..., 71, 75, 79 in order
   4th set contains columns 4, 8, 12, 16, ..., 72, 76, 80 in order
This colmn ordering is just the same as in the Tiny format.
for medium res it is the same only with two stes for the two medium res bitplanes.

/*
 *  Given an x-coordinate and a color index, returns the corresponding
 *  QuantumPaint palette index.
 *
 *  by Hans Wessels; placed in the public domain January, 2008.
 */
int find_pbx_index(int x, int c)
{
	int x1 = 10 * c;
	if (1 & c)
	{	/* If c is odd */
		x1 = x1 - 5;
	}
	else
	{	/* If c is even */
		x1 = x1 + 1;
	}
	if(c>7)
	{
	  x1+=12;
	}
	if(x>=(x1+75))
	{
		c = c + 16;
	}
	return c;
}

Back to ST Picture Formats