[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