Difference between revisions of "Myst WDIB resources"
(adding the details of the Myst WDIB compression) |
m (err... oops) |
||
Line 20: | Line 20: | ||
0x87 // absolute byte | 0x87 // absolute byte | ||
0x73 // absolute byte | 0x73 // absolute byte | ||
− | |||
0x27 // absolute byte | 0x27 // absolute byte | ||
0x0b // byte 1 of the run data: length = 2 + 3 = 5 (first 6 bits + 3) | 0x0b // byte 1 of the run data: length = 2 + 3 = 5 (first 6 bits + 3) | ||
0xa9 // byte 2 of the run data: offset = 0x3a9 + 0x42 = 0x3eb | 0xa9 // byte 2 of the run data: offset = 0x3a9 + 0x42 = 0x3eb | ||
+ | 0x27 // absolute byte | ||
0x32 // absolute byte | 0x32 // absolute byte | ||
0x00 // absolute byte | 0x00 // absolute byte |
Revision as of 22:42, 19 July 2008
Myst | |||
Mohawk | Overview | ||
CLRC | EXIT | HINT | INIT |
MJMP | MSND | PICT | RLST |
VIEW | WDIB | HELP | RSFL |
Scripts | Variables |
This page documents the WDIB image format for all images in the original Windows version of Myst and the cursors in Myst Masterpiece Edition. It is similar to LZ77 with a 0x400 byte ring-buffer. Once uncompressed, it is a plain Windows BMP 8bpp and the bitmap is not compressed. It is in little endian form. Thanks to Petroff Heroj and Ron Hayter for working out the compression.
unsigned short | uncompressed size |
variable | compressed data |
Until the end of the resource, each run begins with a byte. Each bit (0-7) defines what to do next. A 1 is an absolute byte (which is directly read into the uncompressed buffer) and a 0 represents two bytes to be read in. The front 6 bits (2-7) represent the length of the run minus 3. The last 10 bits represent the offset in the ring-buffer minus 0x42. If the offset is over 0x400, make sure to subtract 0x400 after adding the 0x42 back into the offset.
The ring-buffer has a constant size of 0x400 bytes. Remember that once you have decoded 0x400 bytes, it loops around to the beginning, completing the loop.
For example:
0xf7 // decoder byte (11110111b) 0x87 // absolute byte 0x73 // absolute byte 0x27 // absolute byte 0x0b // byte 1 of the run data: length = 2 + 3 = 5 (first 6 bits + 3) 0xa9 // byte 2 of the run data: offset = 0x3a9 + 0x42 = 0x3eb 0x27 // absolute byte 0x32 // absolute byte 0x00 // absolute byte 0x4e // absolute byte
From there, see the wikipedia page on the Bitmap file format.