[Scummvm-git-logs] scummvm master -> bcec13802f2b599e25767429f68bb4cde91a5a07
sev-
noreply at scummvm.org
Thu Mar 12 01:55:20 UTC 2026
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
bcec13802f CHAMBER: Implement Hercule scaling
Commit: bcec13802f2b599e25767429f68bb4cde91a5a07
https://github.com/scummvm/scummvm/commit/bcec13802f2b599e25767429f68bb4cde91a5a07
Author: 11-andy-11 (lecturatul2017 at gmail.com)
Date: 2026-03-12T02:55:17+01:00
Commit Message:
CHAMBER: Implement Hercule scaling
Changed paths:
engines/chamber/cga.cpp
engines/chamber/chamber.cpp
engines/chamber/kult.cpp
diff --git a/engines/chamber/cga.cpp b/engines/chamber/cga.cpp
index 94be0f600fe..74e503d5357 100644
--- a/engines/chamber/cga.cpp
+++ b/engines/chamber/cga.cpp
@@ -21,6 +21,7 @@
#include "common/system.h"
#include "graphics/paletteman.h"
+#include "graphics/surface.h"
#include "chamber/chamber.h"
#include "chamber/common.h"
@@ -64,7 +65,7 @@ uint16 HGA_CalcXY(uint16 x, uint16 y) {
extern byte backbuffer[0xB800]; ///< CGA: 0x4000, HGS: 0xB800
byte CGA_SCREENBUFFER[0xB800];
-byte scrbuffer[720*348]; ///< Screen buffer for blitting, it is intentionally left larger instead of dynamic memory allocation
+Graphics::Surface *mainSurface = nullptr;
extern byte *scratch_mem2;
@@ -119,7 +120,11 @@ static const uint8 PALETTE_CGA2[4 * 3] = {
Switch to CGA 320x200x2bpp mode
*/
void switchToGraphicsMode(void) {
- g_system->getPaletteManager()->setPalette(PALETTE_CGA, 0, 4);
+ if (g_system->getWidth() == 720) {
+ g_system->getPaletteManager()->setPalette(Graphics::HGC_G_PALETTE, 0, 2);
+ } else {
+ g_system->getPaletteManager()->setPalette(PALETTE_CGA, 0, 4);
+ }
}
/*
@@ -135,63 +140,116 @@ void waitVBlank(void) {
}
void cga_ColorSelect(byte csel) {
- const byte *pal;
- if (csel & 0x10)
- pal = PALETTE_CGA;
- else
- pal = PALETTE_CGA2;
-
- g_system->getPaletteManager()->setPalette(pal, 0, 4);
- g_system->setCursorPalette(pal, 0, 4);
+ if (g_system->getWidth() == 720) {
+ g_system->getPaletteManager()->setPalette(Graphics::HGC_G_PALETTE, 0, 2);
+ g_system->setCursorPalette(Graphics::HGC_G_PALETTE, 0, 2);
+ } else {
+ const byte *pal;
+ if (csel & 0x10)
+ pal = PALETTE_CGA;
+ else
+ pal = PALETTE_CGA2;
+
+ g_system->getPaletteManager()->setPalette(pal, 0, 4);
+ g_system->setCursorPalette(pal, 0, 4);
+ }
}
void cga_blitToScreen(int16 dx, int16 dy, int16 w, int16 h) {
- dx = dy = 0;
- w = g_vm->_screenW; h = g_vm->_screenH;
+ if (!mainSurface) {
+ mainSurface = new Graphics::Surface();
+ }
+ if (g_system->getWidth() != 720) {
+ if (mainSurface->w != g_vm->_screenW) {
+ mainSurface->free();
+ mainSurface->create(g_vm->_screenW, g_vm->_screenH, Graphics::PixelFormat::createFormatCLUT8());
+ }
+ dx = dy = 0;
+ w = g_vm->_screenW; h = g_vm->_screenH;
- int16 align = dx & (0x8 / g_vm->_screenBits - 1);
+ int16 align = dx & (0x8 / g_vm->_screenBits - 1);
- dx -= align;
- w += align;
+ dx -= align;
+ w += align;
- if (dy + h >= g_vm->_screenH)
- h = g_vm->_screenH - dy;
+ if (dy + h >= g_vm->_screenH)
+ h = g_vm->_screenH - dy;
- if (dx + w >= g_vm->_screenW)
- w = g_vm->_screenW - dx;
+ if (dx + w >= g_vm->_screenW)
+ w = g_vm->_screenW - dx;
- w = (w + (0x8 / g_vm->_screenBits - 1)) / (0x8 / g_vm->_screenBits);
+ w = (w + (0x8 / g_vm->_screenBits - 1)) / (0x8 / g_vm->_screenBits);
- for (int16 y = 0; y < h; y++) {
- uint16 line_start = 0;
- if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
- line_start = HGA_CALCXY_RAW(dx, dy + y);
- } else {
- line_start = cga_CalcXY(dx, dy + y);
- }
- byte *src = CGA_SCREENBUFFER + line_start;
- byte *dst = scrbuffer + (y + dy) * g_vm->_screenW + dx;
+ for (int16 y = 0; y < h; y++) {
+ uint16 line_start = cga_CalcXY(dx, dy + y);
+ byte *src = CGA_SCREENBUFFER + line_start;
+ byte *dst = (byte *)mainSurface->getBasePtr(dx, y + dy);
- for (int16 x = 0; x < w; x++) {
- byte colors = *src++;
- if (g_vm->_videoMode == Common::RenderMode::kRenderCGA) {
+ for (int16 x = 0; x < w; x++) {
+ byte colors = *src++;
for (int16 c = 0; c < 4; c++) {
byte color = (colors & 0xC0) >> 6;
colors <<= 2;
- *dst++ = color;
- }
- } else if (g_vm->_videoMode == Common::RenderMode::kRenderHercG) {
- for (int16 c = 0; c < 8; c++) {
- byte color = (colors & 0x80) >> 7;
- colors <<= 1;
- *dst++ = color;
+ *dst++ = color;
}
}
- }
+ }
+
+ g_system->copyRectToScreen((const byte *)mainSurface->getBasePtr(dx, dy), mainSurface->pitch, dx, dy, w * (0x8 / g_vm->_screenBits), h);
+ g_system->updateScreen();
+ return;
+ }
+ dx = 0;
+ dy = 0;
+ w = 320;
+ h = 200;
+
+ if (mainSurface->w != 720) {
+ mainSurface->free();
+ mainSurface->create(720, 348, Graphics::PixelFormat::createFormatCLUT8());
+ memset(mainSurface->getPixels(), 0, 720 * 348);
}
- g_system->copyRectToScreen(scrbuffer + dy * g_vm->_screenW + dx, g_vm->_screenW, dx, dy, w * (0x8 / g_vm->_screenBits), h);
+ int16 startY = dy;
+ int16 endY = dy + h;
+
+ if (endY > 200)
+ endY = 200;
+
+ int16 startX_bytes = dx / 4;
+ int16 endX_bytes = (dx + w + 3) / 4;
+
+ if (endX_bytes > 80)
+ endX_bytes = 80;
+
+ for (int y = startY; y < endY; y++) {
+ uint16 bank = (y % 2) * 8192;
+ uint16 line = (y / 2) * 80;
+
+ int destY = y + 74;
+ int destX = 40 + (startX_bytes * 8);
+
+ byte *dst = (byte *)mainSurface->getBasePtr(destX, destY);
+
+ for (int x_bytes = startX_bytes; x_bytes < endX_bytes; x_bytes++) {
+ byte cga_byte = CGA_SCREENBUFFER[bank + line + x_bytes];
+ for (int p = 0; p < 4; p++) {
+ byte color = (cga_byte >> (6 - p * 2)) & 3;
+ byte finalColor = (color == 0) ? 0 : 1;
+ *dst++ = finalColor;
+ *dst++ = finalColor;
+ }
+ }
+ }
+
+ int renderX = 40 + (startX_bytes * 8);
+ int renderY = startY + 74;
+ int renderW = (endX_bytes - startX_bytes) * 8;
+ int renderH = endY - startY;
+
+ g_system->copyRectToScreen((const byte *)mainSurface->getBasePtr(renderX, renderY), mainSurface->pitch, renderX, renderY, renderW, renderH);
g_system->updateScreen();
+ return;
}
void cga_blitToScreen(int16 ofs, int16 w, int16 h) {
diff --git a/engines/chamber/chamber.cpp b/engines/chamber/chamber.cpp
index b2185d34c66..a111fa8ac64 100644
--- a/engines/chamber/chamber.cpp
+++ b/engines/chamber/chamber.cpp
@@ -91,16 +91,10 @@ void ChamberEngine::syncGameStream(Common::Serializer &s) {
}
int ChamberEngine::getX(int original_x) {
- if (_videoMode == Common::RenderMode::kRenderHercG) {
- return original_x + 40;
- }
return original_x;
}
int ChamberEngine::getY(int original_y) {
- if (_videoMode == Common::RenderMode::kRenderHercG) {
- return original_y + 74;
- }
return original_y;
}
diff --git a/engines/chamber/kult.cpp b/engines/chamber/kult.cpp
index f646c7ac3dd..af360a36e6e 100644
--- a/engines/chamber/kult.cpp
+++ b/engines/chamber/kult.cpp
@@ -69,7 +69,7 @@ Graphics::Surface *loadSplash(const char *filename) {
Graphics::Surface *surface = new Graphics::Surface();
int width = (g_vm->_videoMode == Common::kRenderHercG) ? 640 : 320;
- int height = (g_vm->_videoMode == Common::kRenderHercG) ? 640 : 200;
+ int height = 200;
surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
decompress(scratch_mem1 + 8, backbuffer);
@@ -232,30 +232,26 @@ Common::Error ChamberEngine::init() {
byte c;
// Initialize graphics using following:
- if (_videoMode == Common::RenderMode::kRenderCGA) {
- // 320x200x2
- _screenW = 320;
- _screenH = 200;
- _screenBits = 2;
- _screenPPB = 8 / _screenBits;
- _screenBPL = _screenW / _screenPPB;
- _line_offset = 0x2000;
- _fontHeight = 6;
- _fontWidth = 4;
- initGraphics(_screenW, _screenH);
- } else if (_videoMode == Common::RenderMode::kRenderHercG) {
- // 720x348x1
- _screenW = 720;
- _screenH = 348;
- _screenBits = 1;
- _screenPPB = 8 / _screenBits;
- _screenBPL = _screenW / _screenPPB;
- _line_offset = 0x2000;
- _line_offset2 = 0x2000;
- _fontHeight = 6;
- _fontWidth = 4;
+ bool isCustomHerc = false;
+ if (_videoMode == Common::RenderMode::kRenderHercG) {
+ isCustomHerc = true;
+ _videoMode = Common::RenderMode::kRenderCGA;
+ }
+ _screenW = 320;
+ _screenH = 200;
+ _screenBits = 2;
+ _screenPPB = 8 / _screenBits;
+ _screenBPL = _screenW / _screenPPB;
+ _line_offset = 0x2000;
+ _line_offset2 = 0x2000;
+ _fontHeight = 6;
+ _fontWidth = 4;
+ if (isCustomHerc) {
+ initGraphics(720, 348);
+ } else {
initGraphics(_screenW, _screenH);
}
+
initSound();
/*TODO: DetectCPU*/
@@ -285,22 +281,16 @@ Common::Error ChamberEngine::init() {
exitGame();
}
- if (_videoMode == Common::RenderMode::kRenderCGA) {
+ if (!isCustomHerc) {
/* Select intense cyan-mageta palette */
cga_ColorSelect(0x30);
cga_BackBufferToRealFull();
- } else if (_videoMode == Common::RenderMode::kRenderHercG) {
- /* Select intense cyan-mageta palette */
- cga_ColorSelect(0x30);
+ } else {
+ /* Set authentic Hercules Green phosphor palette */
+ g_system->getPaletteManager()->setPalette(Graphics::HGC_G_PALETTE, 0, 2);
cga_BackBufferToRealFull();
}
- int splash_x = getX(0);
- int splash_y = getY(0);
-
- g_system->copyRectToScreen(splash->getPixels(), splash->pitch, splash_x, splash_y, splash->w, splash->h);
- g_system->updateScreen();
-
splash->free();
delete splash;
More information about the Scummvm-git-logs
mailing list