Crack Art: Difference between revisions

From MultimediaWiki
Jump to navigation Jump to search
(template for crack art format; link to assembly compression and decompression routines)
 
m (no plainlinks)
 
(5 intermediate revisions by the same user not shown)
Line 1: Line 1:
<span class="plainlinks">
* Company: Detlef Röttger & Jan Borchers
* Company: Detlef Röttger & Jan Borchers
* Extensions: .ca1, .ca2, .ca3
* Extensions: .ca1, .ca2, .ca3
Line 13: Line 12:


  typedef crackart_file {
  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;
  } crackart_file;
If the file is uncompressed, sizeof(data) == 32000 bytes of raw video memory.


==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==


The image data is stored in a planar format.
[[Image:Atarist_lowres.png]]
[[Category:Atari ST Image Formats]]
[[Category:Image Formats]]
[[Category:Image Formats]]
</span>

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.

Atarist lowres.png