diff options
Diffstat (limited to 'engines/agi/graphics.cpp')
-rw-r--r-- | engines/agi/graphics.cpp | 297 |
1 files changed, 287 insertions, 10 deletions
diff --git a/engines/agi/graphics.cpp b/engines/agi/graphics.cpp index 8f62ccc08d..2d64a4352e 100644 --- a/engines/agi/graphics.cpp +++ b/engines/agi/graphics.cpp @@ -89,6 +89,269 @@ uint8 newPalette[16 * 3] = { 0x3F, 0x3F, 0x3F }; +/** + * 256 color palette used with AGI256 and AGI256-2 games. + * Uses full 8 bits per color component. + */ +uint8 vgaPalette[256 * 3] = { + 0x00, 0x00, 0x00, + 0x00, 0x00, 0xA8, + 0x00, 0xA8, 0x00, + 0x00, 0xA8, 0xA8, + 0xA8, 0x00, 0x00, + 0xA8, 0x00, 0xA8, + 0xA8, 0x54, 0x00, + 0xA8, 0xA8, 0xA8, + 0x54, 0x54, 0x54, + 0x54, 0x54, 0xFC, + 0x54, 0xFC, 0x54, + 0x54, 0xFC, 0xFC, + 0xFC, 0x54, 0x54, + 0xFC, 0x54, 0xFC, + 0xFC, 0xFC, 0x54, + 0xFC, 0xFC, 0xFC, + 0x00, 0x00, 0x00, + 0x14, 0x14, 0x14, + 0x20, 0x20, 0x20, + 0x2C, 0x2C, 0x2C, + 0x38, 0x38, 0x38, + 0x44, 0x44, 0x44, + 0x50, 0x50, 0x50, + 0x60, 0x60, 0x60, + 0x70, 0x70, 0x70, + 0x80, 0x80, 0x80, + 0x90, 0x90, 0x90, + 0xA0, 0xA0, 0xA0, + 0xB4, 0xB4, 0xB4, + 0xC8, 0xC8, 0xC8, + 0xE0, 0xE0, 0xE0, + 0xFC, 0xFC, 0xFC, + 0x00, 0x00, 0xFC, + 0x40, 0x00, 0xFC, + 0x7C, 0x00, 0xFC, + 0xBC, 0x00, 0xFC, + 0xFC, 0x00, 0xFC, + 0xFC, 0x00, 0xBC, + 0xFC, 0x00, 0x7C, + 0xFC, 0x00, 0x40, + 0xFC, 0x00, 0x00, + 0xFC, 0x40, 0x00, + 0xFC, 0x7C, 0x00, + 0xFC, 0xBC, 0x00, + 0xFC, 0xFC, 0x00, + 0xBC, 0xFC, 0x00, + 0x7C, 0xFC, 0x00, + 0x40, 0xFC, 0x00, + 0x00, 0xFC, 0x00, + 0x00, 0xFC, 0x40, + 0x00, 0xFC, 0x7C, + 0x00, 0xFC, 0xBC, + 0x00, 0xFC, 0xFC, + 0x00, 0xBC, 0xFC, + 0x00, 0x7C, 0xFC, + 0x00, 0x40, 0xFC, + 0x7C, 0x7C, 0xFC, + 0x9C, 0x7C, 0xFC, + 0xBC, 0x7C, 0xFC, + 0xDC, 0x7C, 0xFC, + 0xFC, 0x7C, 0xFC, + 0xFC, 0x7C, 0xDC, + 0xFC, 0x7C, 0xBC, + 0xFC, 0x7C, 0x9C, + 0xFC, 0x7C, 0x7C, + 0xFC, 0x9C, 0x7C, + 0xFC, 0xBC, 0x7C, + 0xFC, 0xDC, 0x7C, + 0xFC, 0xFC, 0x7C, + 0xDC, 0xFC, 0x7C, + 0xBC, 0xFC, 0x7C, + 0x9C, 0xFC, 0x7C, + 0x7C, 0xFC, 0x7C, + 0x7C, 0xFC, 0x9C, + 0x7C, 0xFC, 0xBC, + 0x7C, 0xFC, 0xDC, + 0x7C, 0xFC, 0xFC, + 0x7C, 0xDC, 0xFC, + 0x7C, 0xBC, 0xFC, + 0x7C, 0x9C, 0xFC, + 0xB4, 0xB4, 0xFC, + 0xC4, 0xB4, 0xFC, + 0xD8, 0xB4, 0xFC, + 0xE8, 0xB4, 0xFC, + 0xFC, 0xB4, 0xFC, + 0xFC, 0xB4, 0xE8, + 0xFC, 0xB4, 0xD8, + 0xFC, 0xB4, 0xC4, + 0xFC, 0xB4, 0xB4, + 0xFC, 0xC4, 0xB4, + 0xFC, 0xD8, 0xB4, + 0xFC, 0xE8, 0xB4, + 0xFC, 0xFC, 0xB4, + 0xE8, 0xFC, 0xB4, + 0xD8, 0xFC, 0xB4, + 0xC4, 0xFC, 0xB4, + 0xB4, 0xFC, 0xB4, + 0xB4, 0xFC, 0xC4, + 0xB4, 0xFC, 0xD8, + 0xB4, 0xFC, 0xE8, + 0xB4, 0xFC, 0xFC, + 0xB4, 0xE8, 0xFC, + 0xB4, 0xD8, 0xFC, + 0xB4, 0xC4, 0xFC, + 0x00, 0x00, 0x70, + 0x1C, 0x00, 0x70, + 0x38, 0x00, 0x70, + 0x54, 0x00, 0x70, + 0x70, 0x00, 0x70, + 0x70, 0x00, 0x54, + 0x70, 0x00, 0x38, + 0x70, 0x00, 0x1C, + 0x70, 0x00, 0x00, + 0x70, 0x1C, 0x00, + 0x70, 0x38, 0x00, + 0x70, 0x54, 0x00, + 0x70, 0x70, 0x00, + 0x54, 0x70, 0x00, + 0x38, 0x70, 0x00, + 0x1C, 0x70, 0x00, + 0x00, 0x70, 0x00, + 0x00, 0x70, 0x1C, + 0x00, 0x70, 0x38, + 0x00, 0x70, 0x54, + 0x00, 0x70, 0x70, + 0x00, 0x54, 0x70, + 0x00, 0x38, 0x70, + 0x00, 0x1C, 0x70, + 0x38, 0x38, 0x70, + 0x44, 0x38, 0x70, + 0x54, 0x38, 0x70, + 0x60, 0x38, 0x70, + 0x70, 0x38, 0x70, + 0x70, 0x38, 0x60, + 0x70, 0x38, 0x54, + 0x70, 0x38, 0x44, + 0x70, 0x38, 0x38, + 0x70, 0x44, 0x38, + 0x70, 0x54, 0x38, + 0x70, 0x60, 0x38, + 0x70, 0x70, 0x38, + 0x60, 0x70, 0x38, + 0x54, 0x70, 0x38, + 0x44, 0x70, 0x38, + 0x38, 0x70, 0x38, + 0x38, 0x70, 0x44, + 0x38, 0x70, 0x54, + 0x38, 0x70, 0x60, + 0x38, 0x70, 0x70, + 0x38, 0x60, 0x70, + 0x38, 0x54, 0x70, + 0x38, 0x44, 0x70, + 0x50, 0x50, 0x70, + 0x58, 0x50, 0x70, + 0x60, 0x50, 0x70, + 0x68, 0x50, 0x70, + 0x70, 0x50, 0x70, + 0x70, 0x50, 0x68, + 0x70, 0x50, 0x60, + 0x70, 0x50, 0x58, + 0x70, 0x50, 0x50, + 0x70, 0x58, 0x50, + 0x70, 0x60, 0x50, + 0x70, 0x68, 0x50, + 0x70, 0x70, 0x50, + 0x68, 0x70, 0x50, + 0x60, 0x70, 0x50, + 0x58, 0x70, 0x50, + 0x50, 0x70, 0x50, + 0x50, 0x70, 0x58, + 0x50, 0x70, 0x60, + 0x50, 0x70, 0x68, + 0x50, 0x70, 0x70, + 0x50, 0x68, 0x70, + 0x50, 0x60, 0x70, + 0x50, 0x58, 0x70, + 0x00, 0x00, 0x40, + 0x10, 0x00, 0x40, + 0x20, 0x00, 0x40, + 0x30, 0x00, 0x40, + 0x40, 0x00, 0x40, + 0x40, 0x00, 0x30, + 0x40, 0x00, 0x20, + 0x40, 0x00, 0x10, + 0x40, 0x00, 0x00, + 0x40, 0x10, 0x00, + 0x40, 0x20, 0x00, + 0x40, 0x30, 0x00, + 0x40, 0x40, 0x00, + 0x30, 0x40, 0x00, + 0x20, 0x40, 0x00, + 0x10, 0x40, 0x00, + 0x00, 0x40, 0x00, + 0x00, 0x40, 0x10, + 0x00, 0x40, 0x20, + 0x00, 0x40, 0x30, + 0x00, 0x40, 0x40, + 0x00, 0x30, 0x40, + 0x00, 0x20, 0x40, + 0x00, 0x10, 0x40, + 0x20, 0x20, 0x40, + 0x28, 0x20, 0x40, + 0x30, 0x20, 0x40, + 0x38, 0x20, 0x40, + 0x40, 0x20, 0x40, + 0x40, 0x20, 0x38, + 0x40, 0x20, 0x30, + 0x40, 0x20, 0x28, + 0x40, 0x20, 0x20, + 0x40, 0x28, 0x20, + 0x40, 0x30, 0x20, + 0x40, 0x38, 0x20, + 0x40, 0x40, 0x20, + 0x38, 0x40, 0x20, + 0x30, 0x40, 0x20, + 0x28, 0x40, 0x20, + 0x20, 0x40, 0x20, + 0x20, 0x40, 0x28, + 0x20, 0x40, 0x30, + 0x20, 0x40, 0x38, + 0x20, 0x40, 0x40, + 0x20, 0x38, 0x40, + 0x20, 0x30, 0x40, + 0x20, 0x28, 0x40, + 0x2C, 0x2C, 0x40, + 0x30, 0x2C, 0x40, + 0x34, 0x2C, 0x40, + 0x3C, 0x2C, 0x40, + 0x40, 0x2C, 0x40, + 0x40, 0x2C, 0x3C, + 0x40, 0x2C, 0x34, + 0x40, 0x2C, 0x30, + 0x40, 0x2C, 0x2C, + 0x40, 0x30, 0x2C, + 0x40, 0x34, 0x2C, + 0x40, 0x3C, 0x2C, + 0x40, 0x40, 0x2C, + 0x3C, 0x40, 0x2C, + 0x34, 0x40, 0x2C, + 0x30, 0x40, 0x2C, + 0x2C, 0x40, 0x2C, + 0x2C, 0x40, 0x30, + 0x2C, 0x40, 0x34, + 0x2C, 0x40, 0x3C, + 0x2C, 0x40, 0x40, + 0x2C, 0x3C, 0x40, + 0x2C, 0x34, 0x40, + 0x2C, 0x30, 0x40, + 0x40, 0x40, 0x40, + 0x38, 0x38, 0x38, + 0x30, 0x30, 0x30, + 0x28, 0x28, 0x28, + 0x24, 0x24, 0x24, + 0x1C, 0x1C, 0x1C, + 0x14, 0x14, 0x14, + 0x0C, 0x0C, 0x0C +}; + static uint16 cgaMap[16] = { 0x0000, /* 0 - black */ 0x0d00, /* 1 - blue */ @@ -135,7 +398,10 @@ GfxMgr::GfxMgr(AgiEngine *vm) : _vm(vm) { * | * Layer 2: 320x200 ================== AGI engine screen (console), put_pixel() * | - * Layer 1: 160x168 ================== AGI screen + * Layer 1: 160x336 ================== AGI screen + * + * Upper half (160x168) of Layer 1 is for the normal 16 color & control line/priority info. + * Lower half (160x168) of Layer 1 is for the 256 color information (Used with AGI256 & AGI256-2). */ #define SHAKE_MAG 3 @@ -373,15 +639,25 @@ void GfxMgr::initPalette(uint8 *p) { void GfxMgr::gfxSetPalette() { int i; - byte pal[32 * 4]; - - for (i = 0; i < 32; i++) { - pal[i * 4 + 0] = _palette[i * 3 + 0] << 2; - pal[i * 4 + 1] = _palette[i * 3 + 1] << 2; - pal[i * 4 + 2] = _palette[i * 3 + 2] << 2; - pal[i * 4 + 3] = 0; + byte pal[256 * 4]; + + if (!(_vm->getFeatures() & (GF_AGI256 | GF_AGI256_2))) { + for (i = 0; i < 32; i++) { + pal[i * 4 + 0] = _palette[i * 3 + 0] << 2; + pal[i * 4 + 1] = _palette[i * 3 + 1] << 2; + pal[i * 4 + 2] = _palette[i * 3 + 2] << 2; + pal[i * 4 + 3] = 0; + } + g_system->setPalette(pal, 0, 32); + } else { + for (i = 0; i < 256; i++) { + pal[i * 4 + 0] = vgaPalette[i * 3 + 0]; + pal[i * 4 + 1] = vgaPalette[i * 3 + 1]; + pal[i * 4 + 2] = vgaPalette[i * 3 + 2]; + pal[i * 4 + 3] = 0; + } + g_system->setPalette(pal, 0, 256); } - g_system->setPalette(pal, 0, 32); } //Gets AGIPAL Data @@ -539,11 +815,12 @@ void GfxMgr::putPixelsA(int x, int y, int n, uint8 *p) { *(uint16 *)&_agiScreen[x + y * GFX_WIDTH] = q & 0x0f0f; } } else { + const uint16 mask = _vm->getFeatures() & (GF_AGI256 | GF_AGI256_2) ? 0xffff : 0x0f0f; for (x *= 2; n--; p++, x += 2) { register uint16 q = ((uint16) * p << 8) | *p; if (_vm->_debug.priority) q >>= 4; - *(uint16 *)&_agiScreen[x + y * GFX_WIDTH] = q & 0x0f0f; + *(uint16 *)&_agiScreen[x + y * GFX_WIDTH] = q & mask; } } } |