aboutsummaryrefslogtreecommitdiff
path: root/engines/agi/graphics.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/agi/graphics.cpp')
-rw-r--r--engines/agi/graphics.cpp297
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;
}
}
}