Photochrome
Jump to navigation
Jump to search
- Extensions: .pcs
Photochrome is an image format that uses palette switching and alternating two screens to display more colors on the originally limitted graphics hardware of the Atari ST.
16-bit words are stored in big-endian order.
File layout
typedef struct { uint16_t width; /* always 0x140 (320) */ uint16_t height; /* always 0xc8 (200) */ uint8_t screen_mode; /* 0 = single screen mode, bit 0 = xor screen data, bit 1 = xor palette data */ uint8_t frequency; /* 0 = 60Hz, 1 = 50Hz */ uint8_t screen_data1[]; /* compressed screen data */ uint8_t palettes1[]; /* compressed palettes */ uint8_t screen_data2[]; /* when screen_mode != 0 */ uint8_t palettes2[]; /* idem */ } photochrome_file;
Image data
The image data are stored as four separate bitplanes and compressed with yet another RLE variant.
uint16_t number_of_control_bytes; uint8_t x; x < 0 : -x literal bytes follow x == 0 : uint16_t y times uint8_t z x == 1 : uint16_t y literal bytes x > 1 : x times uint8_t y
Palettes compression
The palette compression algorithm is similar to that of the image data but works solely on 16-bit words.
uint16_t number_of_control_bytes; uint8_t x; x < 0 : -x literal 16-bit words follow x == 0 : uint16_t y times uint16_t z x == 1 : uint16_t y literal 16-bit words x > 1 : x times uint16_t y
Each palette contains 16 colors. 200 scanlines and 3 palettes per scanline plus one final palette makes 9616 total palette entries.
Palette selection
Given an x-coordinate and a color index, returns the corresponding Photochrome palette index.
/* Based on code by Hans Wessels, Public Domain 2008 */ int find_pcs_index(int x, int c) { int x1 = 4 * c, index = c; if (x >= x1) index += 16; if (x >= x1+64+12 && c<14) index += 16; if (x >= 132+16 && c==14) index += 16; if (x >= 132+20 && c==15) index += 16; x1 = 10 * c - (c&1) * 6; if (x >= 176+x1 && c<14) index += 16; return index; }