diff options
author | Paul Gilbert | 2012-09-10 20:26:24 +1000 |
---|---|---|
committer | Paul Gilbert | 2012-09-10 20:26:24 +1000 |
commit | 7b15f9ae3c326419bbba13f375762da7fd6d18b1 (patch) | |
tree | 75700e284c34c458fd79f567fe32e09d78941e3f /engines/hopkins/graphics.cpp | |
parent | 14cd54fc398c312566ea2dec3a91d775f2159f0f (diff) | |
download | scummvm-rg350-7b15f9ae3c326419bbba13f375762da7fd6d18b1.tar.gz scummvm-rg350-7b15f9ae3c326419bbba13f375762da7fd6d18b1.tar.bz2 scummvm-rg350-7b15f9ae3c326419bbba13f375762da7fd6d18b1.zip |
HOPKINS: Implemented some of the fade methods
Diffstat (limited to 'engines/hopkins/graphics.cpp')
-rw-r--r-- | engines/hopkins/graphics.cpp | 235 |
1 files changed, 233 insertions, 2 deletions
diff --git a/engines/hopkins/graphics.cpp b/engines/hopkins/graphics.cpp index 9b95b3f515..7c43d0449f 100644 --- a/engines/hopkins/graphics.cpp +++ b/engines/hopkins/graphics.cpp @@ -53,6 +53,7 @@ GraphicsManager::GraphicsManager() { nbrligne2 = 0; Agr_x = Agr_y = 0; Agr_Flag_x = Agr_Flag_y = 0; + FADESPD = 15; } GraphicsManager::~GraphicsManager() { @@ -431,7 +432,7 @@ void GraphicsManager::A_PCXSCREEN_WIDTH_SCREEN_HEIGHT(byte *surface, const Commo f.seek(filesize - 768); } - if (f.read(palette, PALETTE_SIZE * 3) != (PALETTE_SIZE * 3)) + if (f.read(palette, PALETTE_BLOCK_SIZE) != (PALETTE_BLOCK_SIZE)) error("A_PCXSCREEN_WIDTH_SCREEN_HEIGHT"); f.close(); @@ -440,7 +441,7 @@ void GraphicsManager::A_PCXSCREEN_WIDTH_SCREEN_HEIGHT(byte *surface, const Commo void GraphicsManager::Cls_Pal() { if (Winbpp == 2) { - Common::fill(&cmap[0], &cmap[PALETTE_SIZE * 3], 0); + Common::fill(&cmap[0], &cmap[PALETTE_BLOCK_SIZE], 0); // TODO: Figure out what this is for //SD_PIXELS[2 * v0] = SDL_MapRGB(*(_DWORD *)(LinuxScr + 4), 0, 0, 0); @@ -654,6 +655,236 @@ void GraphicsManager::m_scroll16A(const byte *surface, int xs, int ys, int width } while (v13 != 1); } +void GraphicsManager::fade_in(const byte *palette, int step, const byte *surface) { + __int16 v3; + int v4; + __int16 v5; + __int16 v6; + char *v7; + __int16 v8; + char *v9; + __int16 v10; + signed __int16 v12; + unsigned __int16 v13; + byte palData[PALETTE_BLOCK_SIZE]; + byte v15[3]; + __int16 v16; + char v17[2]; + char v18[1532]; + + v13 = FADESPD; + v3 = 0; + do { + v4 = v3; + *(&v16 + v4) = 0; + palData[v4] = 0; + ++v3; + } while (v3 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + v12 = 0; + + if ((signed __int16)v13 > 0) { + do { + v5 = 0; + do { + if ((unsigned __int8)palData[v5] < *(byte *)(v5 + palette)) { + v6 = *(&v16 + v5) + ((unsigned int)*(byte *)(v5 + palette) << 8) / (signed __int16)v13; + *(&v16 + v5) = v6; + palData[v5] = (v6 >> 8) & 0xff; + } + + if (v15[v5] < *(byte *)(palette + v5 + 1)) { + v7 = &v17[2 * v5]; + v8 = *(uint16 *)v7 + ((unsigned int)*(byte *)(palette + v5 + 1) << 8) / (signed __int16)v13; + *(uint16 *)v7 = v8; + v15[v5] = (v8 >> 8) & 0xff; + } + + if (v15[v5 + 1] < *(byte *)(palette + v5 + 2)) { + v9 = &v18[2 * v5]; + v10 = *(uint16 *)v9 + ((unsigned int)*(byte *)(palette + v5 + 2) << 8) / (signed __int16)v13; + *(uint16 *)v9 = v10; + v15[v5 + 1] = (v10 >> 8) & 0xff; + } + + v5 += 3; + } while (v5 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, start_x, 0, 640, 480, 0, 0); + else + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + DD_VBL(); + } + + ++v12; + } while (v12 < (signed __int16)v13); + } + + setpal_vga256(palette); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, start_x, 0, 640, 480, 0, 0); + else + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + DD_VBL(); + } +} + +void GraphicsManager::fade_out(const byte *palette, int step, const byte *surface) { + __int16 v3; + __int16 v4; + int v5; + signed __int16 v6; + __int16 v7; + int v8; + __int16 v9; + __int16 v10; + __int16 v12; + unsigned __int16 v13; + byte palData[PALETTE_BLOCK_SIZE]; + __int16 v15[PALETTE_BLOCK_SIZE]; + + v13 = v3 = FADESPD; + if (palette) { + v4 = 0; + do { + v5 = v4; + v3 = *(byte *)(v4 + palette); + v3 <<= 8; + v15[v5] = v3; + palData[v5] = *(byte *)(v4++ + palette); + } while (v4 < PALETTE_BLOCK_SIZE); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, start_x, 0, 640, 480, 0, 0); + else + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + DD_VBL(); + } + + v6 = 0; + if ((signed __int16)v13 > 0) { + do { + v7 = 0; + do { + v8 = v7; + v9 = v15[v7] - ((unsigned int)*(byte *)(v7 + palette) << 8) / (signed __int16)v13; + v15[v8] = v9; + palData[v8] = (v9 >> 8) & 0xff; + ++v7; + } while (v7 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (SDL_ECHELLE) + m_scroll16A(surface, start_x, 0, 640, 480, 0, 0); + else + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + + DD_VBL(); + } + ++v6; + } while ((signed __int16)v13 > v6); + } + + v10 = 0; + do { + palData[v10++] = 0; + } while (v10 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + + if (Winbpp == 2) { + if (!SDL_ECHELLE) { + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + return DD_VBL(); + } + goto LABEL_28; + } + } else { + v12 = 0; + do { + palData[v12++] = 0; + } while (v12 < (PALETTE_BLOCK_SIZE)); + + setpal_vga256(palData); + if (Winbpp == 2) { + if (!SDL_ECHELLE) { + m_scroll16(surface, start_x, 0, 640, 480, 0, 0); + return DD_VBL(); + } + +LABEL_28: + m_scroll16A(surface, start_x, 0, 640, 480, 0, 0); + return DD_VBL(); + } + } +} + +void GraphicsManager::FADE_INS() { + FADESPD = 1; + fade_in(Palette, 1, (const byte *)VESA_BUFFER.pixels); +} + +void GraphicsManager::FADE_OUTS() { + FADESPD = 1; + fade_out(Palette, 1, (const byte *)VESA_BUFFER.pixels); +} + +void GraphicsManager::FADE_INW() { + FADESPD = 15; + fade_in(Palette, 20, (const byte *)VESA_BUFFER.pixels); +} + +void GraphicsManager::FADE_OUTW() { + FADESPD = 15; + fade_out(Palette, 20, (const byte *)VESA_BUFFER.pixels); +} + +void GraphicsManager::setpal_vga256(const byte *palette) { + CHANGE_PALETTE(palette); +} + +void GraphicsManager::CHANGE_PALETTE(const byte *palette) { + signed int v1; + signed int v2; + int v3; + const byte *v4; + + v1 = 0; + do { + PALPCX[v1] = *(byte *)(palette + v1); + ++v1; + } while (v1 < PALETTE_BLOCK_SIZE); + + v2 = 0; + do { + v3 = 3 * v2; + cmap[v3] = *(byte *)(palette + 3 * v2); + v4 = palette + 3 * v2; + cmap[v3 + 1] = *(byte *)(v4 + 1); + cmap[v3 + 2] = *(byte *)(v4 + 2); + + // TODO: Validate pixel encoding is correct + *(uint16 *)&SD_PIXELS[2 * v2++] = + *(byte *)v4 | (*(byte *)(v4 + 1) << 5) | (*(byte *)(v4 + 2) << 10); + } while (v2 < PALETTE_SIZE); + + g_system->getPaletteManager()->setPalette(cmap, 0, PALETTE_SIZE); +} + +void GraphicsManager::DD_VBL() { + // TODO: Is this okay here? + g_system->updateScreen(); +} + + /*------------------------------------------------------------------------*/ byte *ObjectManager::CHANGE_OBJET(int objIndex) { |