Crack Art: Difference between revisions
Jump to navigation
Jump to search
(uncompressed image data format) |
m (no plainlinks) |
||
(3 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
* Company: Detlef Röttger & Jan Borchers | * Company: Detlef Röttger & Jan Borchers | ||
* Extensions: .ca1, .ca2, .ca3 | * Extensions: .ca1, .ca2, .ca3 | ||
Line 23: | Line 22: | ||
==Decompression algorithm== | ==Decompression algorithm== | ||
Yet another [[RLE]] variant: | |||
data[0] == ESCape character | |||
data[1] == initial value (fill screen memory with this value) | |||
data[2]<<8 + data[3] == offset, this value is constantly added to the current byte position in order to | |||
find the next byte position. If the position >= 32000, it jumps back to | |||
the first unwritten byte position (initial write is not taken into account). | |||
This is used to 'jump' through the data and accomplish plane-by-plane compression. | |||
data[4 ....] == RLE compressed data | |||
[pseudocode] | |||
while (!eof et cetera) { | |||
a = data[x++] | |||
if (a != ESC) output a, continue | |||
b = data[x++] | |||
if (b == ESC) output ESC, continue | |||
c = data[x++] | |||
if (b == 2) { | |||
if (!c) break /* end decompression */ | |||
c << 8 | |||
c += data[x++] | |||
skip c+1 bytes, continue /* or output c+1 times initial_value */ | |||
} | |||
if (b == 1) { | |||
c <<= 8 | |||
c += data[x++] | |||
} | |||
if (b <= 1) { /* 0 and 1 */ | |||
d = data[x++] | |||
output c+1 times d, continue | |||
} | |||
output b times c /* b>2 && b!= ESC */ | |||
} | |||
==Uncompressed data format== | ==Uncompressed data format== | ||
Line 30: | Line 72: | ||
[[Image:Atarist_lowres.png]] | [[Image:Atarist_lowres.png]] | ||
[[Category:Atari ST Image Formats]] | |||
[[Category:Image Formats]] | [[Category:Image Formats]] | ||
Latest revision as of 17:42, 1 May 2008
- Company: Detlef Röttger & Jan Borchers
- Extensions: .ca1, .ca2, .ca3
Crack Art was an image drawing program for the Atari ST. Here are the m68k assembly compression and decompression routines, provided by the original program.
16-bit words are stored in big-endian order.
File format
typedef crackart_file { uint16_t magic; /* "CA" */ uint8_t compressed; /* 0 = no compression, 1 = compressed */ uint8_t resolution; /* 0 = low (320x200x16), 1 = medium (640x200x4), 2 = high (640x400x2) */ uint16_t palette[palsize]; /* palsize = 16 (low res), 4 (med res) or 0 (high res) */ uint8_t data[] } crackart_file;
If the file is uncompressed, sizeof(data) == 32000 bytes of raw video memory.
Decompression algorithm
Yet another RLE variant:
data[0] == ESCape character data[1] == initial value (fill screen memory with this value) data[2]<<8 + data[3] == offset, this value is constantly added to the current byte position in order to find the next byte position. If the position >= 32000, it jumps back to the first unwritten byte position (initial write is not taken into account). This is used to 'jump' through the data and accomplish plane-by-plane compression. data[4 ....] == RLE compressed data [pseudocode] while (!eof et cetera) { a = data[x++] if (a != ESC) output a, continue b = data[x++] if (b == ESC) output ESC, continue c = data[x++] if (b == 2) { if (!c) break /* end decompression */ c << 8 c += data[x++] skip c+1 bytes, continue /* or output c+1 times initial_value */ } if (b == 1) { c <<= 8 c += data[x++] } if (b <= 1) { /* 0 and 1 */ d = data[x++] output c+1 times d, continue } output b times c /* b>2 && b!= ESC */ }
Uncompressed data format
The image data is stored in a planar format.