Eye of the Beholder Palette Format

From ModdingWiki
Jump to navigation Jump to search
Eye of the Beholder Palette Format
Format typePalette
HardwareVGA
Colour depth18-bit
Number of colours256
Games

Eye of the Beholder uses a 6-bit RGB 256-colour palette.

PC version of Eye of the Beholder I

The .PAL and .COL files used in the PC version of EOB I differ slightly from the standard format in that all bytes in the files must be bit-shifted two bits to the left.

Example:

The 4th byte in the file BRICK.PAL, which holds the red channel for the second colour in the palette, reads EA in hexadecimal or 11101010 in binary. Bit-shifted, it becomes 10101000 or A8 in hex, which is the correct value.

Bit-shifting vs. mathematical scaling

While the above shifting gives visually acceptable results, it is not strictly mathematically correct. For example, full white in 6-bit RGB (00111111) becomes 11111100 when bit-shifted, which is no longer full white in 8-bit RGB.

For accurate colour intensities, the following formula should be used:

 8bitRGB = (6bitRGB & 0x3F) * 255 / 63 

Java code to read .PAL files (EOB I PC version)

 
import java.io.*;

public class PAL {

    private byte[] m_rawData;
    public byte[][] m_palette;

    public PAL(String filename) throws IOException {
        File f = new File(filename);
        long fileSize = f.length();
        m_rawData = new byte[(int) fileSize];

        FileInputStream fis = new FileInputStream(filename);
        int tr = fis.read(m_rawData);
        fis.close();

        m_palette = new byte[(int) (fileSize / 3)][3];
        for (int i = 0; i < m_palette.length; i++) {
            m_palette[i][0] = (byte) Math.round(((m_rawData[i * 3] & 0x3F) * 255.0f / 63));
            m_palette[i][1] = (byte) Math.round(((m_rawData[1 + i * 3] & 0x3F) * 255.0f / 63));
            m_palette[i][2] = (byte) Math.round(((m_rawData[2 + i * 3] & 0x3F) * 255.0f / 63));
        }
    }
}