[Scummvm-git-logs] scummvm master -> f04c4d04a21317ed044cb7ea2f38fca9975ef225

bluegr bluegr at gmail.com
Fri Oct 23 23:55:24 UTC 2020


This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
0be765b288 SCI: Add support for RGB rendering
fd126fba7a SCI: Add GAMEOPTION for RGB rendering
f04c4d04a2 NEWS: Mention the SCI RGB mode feature


Commit: 0be765b288437f29391cb18ca620ace6a513bd91
    https://github.com/scummvm/scummvm/commit/0be765b288437f29391cb18ca620ace6a513bd91
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2020-10-24T02:55:01+03:00

Commit Message:
SCI: Add support for RGB rendering

Changed paths:
    engines/sci/engine/kvideo.cpp
    engines/sci/graphics/cursor.cpp
    engines/sci/graphics/palette.cpp
    engines/sci/graphics/palette.h
    engines/sci/graphics/screen.cpp
    engines/sci/graphics/screen.h
    engines/sci/graphics/transitions.cpp


diff --git a/engines/sci/engine/kvideo.cpp b/engines/sci/engine/kvideo.cpp
index c7e0d340fb..1848b02e7d 100644
--- a/engines/sci/engine/kvideo.cpp
+++ b/engines/sci/engine/kvideo.cpp
@@ -77,7 +77,7 @@ void playVideo(Video::VideoDecoder &videoDecoder) {
 
 	if (videoDecoder.hasDirtyPalette()) {
 		const byte *palette = videoDecoder.getPalette();
-		g_system->getPaletteManager()->setPalette(palette, 0, 255);
+		g_sci->_gfxScreen->setPalette(palette, 0, 255);
 	}
 
 	while (!g_engine->shouldQuit() && !videoDecoder.endOfVideo() && !skipVideo) {
@@ -85,18 +85,19 @@ void playVideo(Video::VideoDecoder &videoDecoder) {
 			const Graphics::Surface *frame = videoDecoder.decodeNextFrame();
 
 			if (frame) {
+				Common::Rect rect(x, y, x+width, y+height);
 				if (scaleBuffer) {
 					const SciSpan<const byte> input((const byte *)frame->getPixels(), frame->w * frame->h * bytesPerPixel);
 					// TODO: Probably should do aspect ratio correction in KQ6
 					g_sci->_gfxScreen->scale2x(input, *scaleBuffer, videoDecoder.getWidth(), videoDecoder.getHeight(), bytesPerPixel);
-					g_system->copyRectToScreen(scaleBuffer->getUnsafeDataAt(0, pitch * height), pitch, x, y, width, height);
+					g_sci->_gfxScreen->copyVideoFrameToScreen(scaleBuffer->getUnsafeDataAt(0, pitch * height), pitch, rect, bytesPerPixel == 1);
 				} else {
-					g_system->copyRectToScreen(frame->getPixels(), frame->pitch, x, y, width, height);
+					g_sci->_gfxScreen->copyVideoFrameToScreen((const byte *)frame->getPixels(), frame->pitch, rect, bytesPerPixel == 1);
 				}
 
 				if (videoDecoder.hasDirtyPalette()) {
 					const byte *palette = videoDecoder.getPalette();
-					g_system->getPaletteManager()->setPalette(palette, 0, 255);
+					g_sci->_gfxScreen->setPalette(palette, 0, 255);
 				}
 
 				g_system->updateScreen();
@@ -127,6 +128,8 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {
 
 	Common::ScopedPtr<Video::VideoDecoder> videoDecoder;
 
+	bool switchedGraphicsMode = false;
+
 	if (argv[0].isPointer()) {
 		Common::String filename = s->_segMan->getString(argv[0]);
 
@@ -135,7 +138,10 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {
 			// The only argument is the string for the video
 
 			// HACK: Switch to 16bpp graphics for Cinepak.
-			initGraphics(screenWidth, screenHeight, nullptr);
+			if (g_system->getScreenFormat().bytesPerPixel == 1) {
+				initGraphics(screenWidth, screenHeight, nullptr);
+				switchedGraphicsMode = true;
+			}
 
 			if (g_system->getScreenFormat().bytesPerPixel == 1) {
 				warning("This video requires >8bpp color to be displayed, but could not switch to RGB color mode");
@@ -177,13 +183,15 @@ reg_t kShowMovie(EngineState *s, int argc, reg_t *argv) {
 	}
 
 	if (videoDecoder) {
+		bool is8bit = videoDecoder->getPixelFormat().bytesPerPixel == 1;
+
 		playVideo(*videoDecoder);
 
 		// HACK: Switch back to 8bpp if we played a true color video.
 		// We also won't be copying the screen to the SCI screen...
-		if (g_system->getScreenFormat().bytesPerPixel != 1)
+		if (switchedGraphicsMode)
 			initGraphics(screenWidth, screenHeight);
-		else {
+		else if (is8bit) {
 			g_sci->_gfxScreen->kernelSyncWithFramebuffer();
 			g_sci->_gfxPalette16->kernelSyncScreenPalette();
 		}
diff --git a/engines/sci/graphics/cursor.cpp b/engines/sci/graphics/cursor.cpp
index c2d737b32b..63a9185d5a 100644
--- a/engines/sci/graphics/cursor.cpp
+++ b/engines/sci/graphics/cursor.cpp
@@ -179,6 +179,12 @@ void GfxCursor::kernelSetShape(GuiResourceId resourceId) {
 	}
 
 	CursorMan.replaceCursor(rawBitmap->getUnsafeDataAt(0, heightWidth * heightWidth), heightWidth, heightWidth, hotspot.x, hotspot.y, SCI_CURSOR_SCI0_TRANSPARENCYCOLOR);
+	if (g_system->getScreenFormat().bytesPerPixel != 1) {
+		byte buf[3*256];
+		g_sci->_gfxScreen->grabPalette(buf, 0, 256);
+		CursorMan.replaceCursorPalette(buf, 0, 256);
+	}
+
 	kernelShow();
 }
 
@@ -247,6 +253,11 @@ void GfxCursor::kernelSetView(GuiResourceId viewNum, int loopNum, int celNum, Co
 	} else {
 		CursorMan.replaceCursor(rawBitmap.getUnsafeDataAt(0, width * height), width, height, cursorHotspot->x, cursorHotspot->y, clearKey);
 	}
+	if (g_system->getScreenFormat().bytesPerPixel != 1) {
+		byte buf[3*256];
+		g_sci->_gfxScreen->grabPalette(buf, 0, 256);
+		CursorMan.replaceCursorPalette(buf, 0, 256);
+	}
 
 	kernelShow();
 
@@ -399,6 +410,11 @@ void GfxCursor::refreshPosition() {
 		}
 
 		CursorMan.replaceCursor(_cursorSurface->getUnsafeDataAt(0, cursorCelInfo->width * cursorCelInfo->height), cursorCelInfo->width, cursorCelInfo->height, cursorHotspot.x, cursorHotspot.y, cursorCelInfo->clearKey);
+		if (g_system->getScreenFormat().bytesPerPixel != 1) {
+			byte buf[3*256];
+			g_sci->_gfxScreen->grabPalette(buf, 0, 256);
+			CursorMan.replaceCursorPalette(buf, 0, 256);
+		}
 	}
 }
 
diff --git a/engines/sci/graphics/palette.cpp b/engines/sci/graphics/palette.cpp
index 644d5b0edd..89766e2443 100644
--- a/engines/sci/graphics/palette.cpp
+++ b/engines/sci/graphics/palette.cpp
@@ -25,8 +25,6 @@
 #include "common/util.h"
 #include "common/system.h"
 
-#include "graphics/palette.h"
-
 #include "sci/sci.h"
 #include "sci/engine/state.h"
 #include "sci/graphics/cache.h"
@@ -231,7 +229,7 @@ bool GfxPalette::setAmiga() {
 		}
 
 		// Directly set the palette, because setOnScreen() wont do a thing for amiga
-		copySysPaletteToScreen();
+		copySysPaletteToScreen(true);
 		return true;
 	}
 
@@ -257,7 +255,7 @@ void GfxPalette::modifyAmigaPalette(const SciSpan<const byte> &data) {
 		}
 	}
 
-	copySysPaletteToScreen();
+	copySysPaletteToScreen(true);
 }
 
 static byte blendColors(byte c1, byte c2) {
@@ -493,20 +491,20 @@ void GfxPalette::getSys(Palette *pal) {
 		memcpy(pal, &_sysPalette,sizeof(Palette));
 }
 
-void GfxPalette::setOnScreen() {
-	copySysPaletteToScreen();
+void GfxPalette::setOnScreen(bool update) {
+	copySysPaletteToScreen(update);
 }
 
 static byte convertMacGammaToSCIGamma(int comp) {
 	return (byte)sqrt(comp * 255.0f);
 }
 
-void GfxPalette::copySysPaletteToScreen() {
+void GfxPalette::copySysPaletteToScreen(bool update) {
 	// just copy palette to system
 	byte bpal[3 * 256];
 
 	// Get current palette, update it and put back
-	g_system->getPaletteManager()->grabPalette(bpal, 0, 256);
+	_screen->grabPalette(bpal, 0, 256);
 
 	for (int16 i = 0; i < 256; i++) {
 		if (colorIsFromMacClut(i)) {
@@ -525,7 +523,7 @@ void GfxPalette::copySysPaletteToScreen() {
 	if (g_sci->_gfxRemap16)
 		g_sci->_gfxRemap16->updateRemapping();
 
-	g_system->getPaletteManager()->setPalette(bpal, 0, 256);
+	_screen->setPalette(bpal, 0, 256, update);
 }
 
 bool GfxPalette::kernelSetFromResource(GuiResourceId resourceId, bool force) {
@@ -682,10 +680,9 @@ void GfxPalette::kernelAssertPalette(GuiResourceId resourceId) {
 void GfxPalette::kernelSyncScreenPalette() {
 	// just copy palette to system
 	byte bpal[3 * 256];
+	_screen->grabPalette(bpal, 0, 256);
 
-	// Get current palette, update it and put back
-	g_system->getPaletteManager()->grabPalette(bpal, 0, 256);
-	for (int16 i = 0; i < 255; i++) {
+	for (int16 i = 1; i < 255; i++) {
 		_sysPalette.colors[i].r = bpal[i * 3];
 		_sysPalette.colors[i].g = bpal[i * 3 + 1];
 		_sysPalette.colors[i].b = bpal[i * 3 + 2];
diff --git a/engines/sci/graphics/palette.h b/engines/sci/graphics/palette.h
index 8d2ca9d29b..c3e163f52b 100644
--- a/engines/sci/graphics/palette.h
+++ b/engines/sci/graphics/palette.h
@@ -59,8 +59,10 @@ public:
 	void getSys(Palette *pal);
 	uint16 getTotalColorCount() const { return _totalScreenColors; }
 
-	void setOnScreen();
-	void copySysPaletteToScreen();
+	// Set palette on screen. If update is false, try not to change the palette
+	// on already painted areas, but this may be impossible.
+	void setOnScreen(bool update=true);
+	void copySysPaletteToScreen(bool update);
 
 	void drewPicture(GuiResourceId pictureId);
 
diff --git a/engines/sci/graphics/screen.cpp b/engines/sci/graphics/screen.cpp
index 240fcbfd4d..df979358d1 100644
--- a/engines/sci/graphics/screen.cpp
+++ b/engines/sci/graphics/screen.cpp
@@ -20,16 +20,20 @@
  *
  */
 
+#include "common/config-manager.h"
 #include "common/util.h"
 #include "common/system.h"
 #include "common/timer.h"
 #include "graphics/surface.h"
+#include "graphics/palette.h"
+#include "graphics/cursorman.h"
 #include "engines/util.h"
 
 #include "sci/sci.h"
 #include "sci/engine/state.h"
 #include "sci/graphics/screen.h"
 #include "sci/graphics/view.h"
+#include "sci/graphics/palette.h"
 
 namespace Sci {
 
@@ -172,6 +176,10 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
 	}
 
 	// Initialize the actual screen
+	Graphics::PixelFormat format8 = Graphics::PixelFormat::createFormatCLUT8();
+	const Graphics::PixelFormat *format = &format8;
+	if (ConfMan.getBool("rgb_rendering"))
+		format = 0; // Backend's preferred mode; RGB if available
 
 	if (g_sci->hasMacIconBar()) {
 		// For SCI1.1 Mac games with the custom icon bar, we need to expand the screen
@@ -179,13 +187,28 @@ GfxScreen::GfxScreen(ResourceManager *resMan) : _resMan(resMan) {
 		// We add 2 to the height of the icon bar to add a buffer between the screen and the
 		// icon bar (as did the original interpreter).
 		if (g_sci->getGameId() == GID_KQ6)
-			initGraphics(_displayWidth, _displayHeight + 26 + 2);
+			initGraphics(_displayWidth, _displayHeight + 26 + 2, format);
 		else if (g_sci->getGameId() == GID_FREDDYPHARKAS)
-			initGraphics(_displayWidth, _displayHeight + 28 + 2);
+			initGraphics(_displayWidth, _displayHeight + 28 + 2, format);
 		else
 			error("Unknown SCI1.1 Mac game");
 	} else
-		initGraphics(_displayWidth, _displayHeight);
+		initGraphics(_displayWidth, _displayHeight, format);
+
+
+	_format = g_system->getScreenFormat();
+
+	// If necessary, allocate buffers for RGB mode
+	if (_format.bytesPerPixel != 1) {
+		_displayedScreen = (byte *)calloc(_displayPixels, 1);
+		_rgbScreen = (byte *)calloc(_format.bytesPerPixel*_displayPixels, 1);
+		_palette = new byte[3*256];
+	} else {
+		_displayedScreen = 0;
+		_palette = 0;
+		_rgbScreen = 0;
+	}
+	_backupScreen = 0;
 }
 
 GfxScreen::~GfxScreen() {
@@ -193,8 +216,89 @@ GfxScreen::~GfxScreen() {
 	free(_priorityScreen);
 	free(_controlScreen);
 	free(_displayScreen);
+
+	free(_displayedScreen);
+	free(_rgbScreen);
+	delete[] _palette;
+	delete[] _backupScreen;
 }
 
+void GfxScreen::convertToRGB(const Common::Rect &rect) {
+	assert(_format.bytesPerPixel != 1);
+
+	for (int y = rect.top; y < rect.bottom; ++y) {
+
+		const byte *in = _displayedScreen + y * _displayWidth + rect.left;
+		byte *out = _rgbScreen + (y * _displayWidth + rect.left) * _format.bytesPerPixel;
+
+		// TODO: Reduce code duplication here
+
+		if (_format.bytesPerPixel == 2) {
+
+			for (int x = 0; x < rect.width(); ++x) {
+				byte i = *in;
+				byte r = _palette[3*i + 0];
+				byte g = _palette[3*i + 1];
+				byte b = _palette[3*i + 2];
+				uint16 c = (uint16)_format.RGBToColor(r, g, b);
+				WRITE_UINT16(out, c);
+				in += 1;
+				out += 2;
+			}
+
+		} else {
+			assert(_format.bytesPerPixel == 4);
+
+			for (int x = 0; x < rect.width(); ++x) {
+				byte i = *in;
+				byte r = _palette[3*i + 0];
+				byte g = _palette[3*i + 1];
+				byte b = _palette[3*i + 2];
+				uint32 c = _format.RGBToColor(r, g, b);
+				WRITE_UINT32(out, c);
+				in += 1;
+				out += 4;
+			}
+		}
+	}
+}
+
+void GfxScreen::displayRectRGB(const Common::Rect &rect, int x, int y) {
+	// Display rect from _activeScreen to screen location x, y.
+	// Clipping is assumed to be done already.
+
+	Common::Rect targetRect;
+	targetRect.left = x;
+	targetRect.setWidth(rect.width());
+	targetRect.top = y;
+	targetRect.setHeight(rect.height());
+
+	// 1. Update _displayedScreen
+	for (int i = 0; i < rect.height(); ++i) {
+		int offset = (rect.top + i) * _displayWidth + rect.left;
+		int targetOffset = (targetRect.top + i) * _displayWidth + targetRect.left;
+		memcpy(_displayedScreen + targetOffset, _activeScreen + offset, rect.width());
+	}
+
+	// 2. Convert to RGB
+	convertToRGB(targetRect);
+
+	// 3. Copy to screen
+	g_system->copyRectToScreen(_rgbScreen + (targetRect.top * _displayWidth + targetRect.left) * _format.bytesPerPixel, _displayWidth * _format.bytesPerPixel, targetRect.left, targetRect.top, targetRect.width(), targetRect.height());
+}
+
+void GfxScreen::displayRect(const Common::Rect &rect, int x, int y) {
+	// Display rect from _activeScreen to screen location x, y.
+	// Clipping is assumed to be done already.
+
+	if (_format.bytesPerPixel == 1) {
+		g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, x, y, rect.width(), rect.height());
+	} else {
+		displayRectRGB(rect, x, y);
+	}
+}
+
+
 // should not be used regularly; only meant for restore game
 void GfxScreen::clearForRestoreGame() {
 	// reset all screen data
@@ -202,45 +306,59 @@ void GfxScreen::clearForRestoreGame() {
 	memset(_priorityScreen, 0, _pixels);
 	memset(_controlScreen, 0, _pixels);
 	memset(_displayScreen, 0, _displayPixels);
+	if (_displayedScreen) {
+		memset(_displayedScreen, 0, _displayPixels);
+		memset(_rgbScreen, 0, _format.bytesPerPixel*_displayPixels);
+	}
 	memset(&_ditheredPicColors, 0, sizeof(_ditheredPicColors));
 	_fontIsUpscaled = false;
 	copyToScreen();
 }
 
 void GfxScreen::copyToScreen() {
-	g_system->copyRectToScreen(_activeScreen, _displayWidth, 0, 0, _displayWidth, _displayHeight);
+	Common::Rect r(0, 0, _displayWidth, _displayHeight);
+	displayRect(r, 0, 0);
 }
 
-void GfxScreen::copyFromScreen(byte *buffer) {
-	Graphics::Surface *screen = g_system->lockScreen();
-
-	if (screen->pitch == _displayWidth) {
-		memcpy(buffer, screen->getPixels(), _displayPixels);
+void GfxScreen::copyVideoFrameToScreen(const byte *buffer, int pitch, const Common::Rect &rect, bool is8bit) {
+	if (_format.bytesPerPixel == 1 || !is8bit) {
+		g_system->copyRectToScreen(buffer, pitch, rect.left, rect.top, rect.width(), rect.height());
 	} else {
-		const byte *src = (const byte *)screen->getPixels();
-		uint height = _displayHeight;
-
-		while (height--) {
-			memcpy(buffer, src, _displayWidth);
-			buffer += _displayWidth;
-			src    += screen->pitch;
+		for (int i = 0; i < rect.height(); ++i) {
+			int offset = i * pitch;
+			int targetOffset = (rect.top + i) * _displayWidth + rect.left;
+			memcpy(_displayedScreen + targetOffset, buffer + offset, rect.width());
 		}
+		convertToRGB(rect);
+		g_system->copyRectToScreen(_rgbScreen + (rect.top * _displayWidth + rect.left) * _format.bytesPerPixel, _displayWidth * _format.bytesPerPixel, rect.left, rect.top, rect.width(), rect.height());
 	}
-
-	g_system->unlockScreen();
 }
 
 void GfxScreen::kernelSyncWithFramebuffer() {
-	copyFromScreen(_displayScreen);
+	if (_format.bytesPerPixel == 1) {
+		Graphics::Surface *screen = g_system->lockScreen();
+		const byte *pix = (const byte *)screen->getPixels();
+		for (int y = 0; y < _displayHeight; ++y)
+			memcpy(_displayScreen + y * _displayWidth, pix + y * screen->pitch, _displayWidth);
+		g_system->unlockScreen();
+	} else {
+		memcpy(_displayScreen, _displayedScreen, _displayPixels);
+	}
 }
 
 void GfxScreen::copyRectToScreen(const Common::Rect &rect) {
 	if (!_upscaledHires)  {
-		g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, rect.left, rect.top, rect.width(), rect.height());
+		displayRect(rect, rect.left, rect.top);
 	} else {
 		int rectHeight = _upscaledHeightMapping[rect.bottom] - _upscaledHeightMapping[rect.top];
 		int rectWidth  = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
-		g_system->copyRectToScreen(_activeScreen + _upscaledHeightMapping[rect.top] * _displayWidth + _upscaledWidthMapping[rect.left], _displayWidth, _upscaledWidthMapping[rect.left], _upscaledHeightMapping[rect.top], rectWidth, rectHeight);
+
+		Common::Rect r;
+		r.left =  _upscaledWidthMapping[rect.left];
+		r.top = _upscaledHeightMapping[rect.top];
+		r.setWidth(rectWidth);
+		r.setHeight(rectHeight);
+		displayRect(r, r.left, r.top);
 	}
 }
 
@@ -251,17 +369,23 @@ void GfxScreen::copyRectToScreen(const Common::Rect &rect) {
 void GfxScreen::copyDisplayRectToScreen(const Common::Rect &rect) {
 	if (!_upscaledHires)
 		error("copyDisplayRectToScreen: not in upscaled hires mode");
-	g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, rect.left, rect.top, rect.width(), rect.height());
+
+	displayRect(rect, rect.left, rect.top);
 }
 
 void GfxScreen::copyRectToScreen(const Common::Rect &rect, int16 x, int16 y) {
 	if (!_upscaledHires)  {
-		g_system->copyRectToScreen(_activeScreen + rect.top * _displayWidth + rect.left, _displayWidth, x, y, rect.width(), rect.height());
+		displayRect(rect, x, y);
 	} else {
 		int rectHeight = _upscaledHeightMapping[rect.bottom] - _upscaledHeightMapping[rect.top];
 		int rectWidth  = _upscaledWidthMapping[rect.right] - _upscaledWidthMapping[rect.left];
 
-		g_system->copyRectToScreen(_activeScreen + _upscaledHeightMapping[rect.top] * _displayWidth + _upscaledWidthMapping[rect.left], _displayWidth, _upscaledWidthMapping[x], _upscaledHeightMapping[y], rectWidth, rectHeight);
+		Common::Rect r;
+		r.left =  _upscaledWidthMapping[rect.left];
+		r.top = _upscaledHeightMapping[rect.top];
+		r.setWidth(rectWidth);
+		r.setHeight(rectHeight);
+		displayRect(r, _upscaledWidthMapping[x], _upscaledHeightMapping[y]);
 	}
 }
 
@@ -481,7 +605,7 @@ void GfxScreen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) {
 
 	if (mask & GFX_SCREEN_MASK_VISUAL) {
 		bitsSaveScreen(rect, _visualScreen, _width, memoryPtr);
-		bitsSaveDisplayScreen(rect, memoryPtr);
+		bitsSaveDisplayScreen(rect, _displayScreen, memoryPtr);
 	}
 	if (mask & GFX_SCREEN_MASK_PRIORITY) {
 		bitsSaveScreen(rect, _priorityScreen, _width, memoryPtr);
@@ -496,20 +620,19 @@ void GfxScreen::bitsSave(Common::Rect rect, byte mask, byte *memoryPtr) {
 	}
 }
 
-void GfxScreen::bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWidth, byte *&memoryPtr) {
+void GfxScreen::bitsSaveScreen(Common::Rect rect, const byte *screen, uint16 screenWidth, byte *&memoryPtr) {
 	int width = rect.width();
 	int y;
 
 	screen += (rect.top * screenWidth) + rect.left;
 
 	for (y = rect.top; y < rect.bottom; y++) {
-		memcpy(memoryPtr, (void *)screen, width); memoryPtr += width;
+		memcpy(memoryPtr, screen, width); memoryPtr += width;
 		screen += screenWidth;
 	}
 }
 
-void GfxScreen::bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr) {
-	byte *screen = _displayScreen;
+void GfxScreen::bitsSaveDisplayScreen(Common::Rect rect, const byte *screen, byte *&memoryPtr) {
 	int width;
 	int y;
 
@@ -524,16 +647,16 @@ void GfxScreen::bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr) {
 	}
 
 	for (y = rect.top; y < rect.bottom; y++) {
-		memcpy(memoryPtr, (void *)screen, width); memoryPtr += width;
+		memcpy(memoryPtr, screen, width); memoryPtr += width;
 		screen += _displayWidth;
 	}
 }
 
-void GfxScreen::bitsGetRect(byte *memoryPtr, Common::Rect *destRect) {
-	memcpy((void *)destRect, memoryPtr, sizeof(Common::Rect));
+void GfxScreen::bitsGetRect(const byte *memoryPtr, Common::Rect *destRect) {
+	memcpy(destRect, memoryPtr, sizeof(Common::Rect));
 }
 
-void GfxScreen::bitsRestore(byte *memoryPtr) {
+void GfxScreen::bitsRestore(const byte *memoryPtr) {
 	Common::Rect rect;
 	byte mask;
 
@@ -542,7 +665,7 @@ void GfxScreen::bitsRestore(byte *memoryPtr) {
 
 	if (mask & GFX_SCREEN_MASK_VISUAL) {
 		bitsRestoreScreen(rect, memoryPtr, _visualScreen, _width);
-		bitsRestoreDisplayScreen(rect, memoryPtr);
+		bitsRestoreDisplayScreen(rect, memoryPtr, _displayScreen);
 	}
 	if (mask & GFX_SCREEN_MASK_PRIORITY) {
 		bitsRestoreScreen(rect, memoryPtr, _priorityScreen, _width);
@@ -562,7 +685,7 @@ void GfxScreen::bitsRestore(byte *memoryPtr) {
 	}
 }
 
-void GfxScreen::bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen, uint16 screenWidth) {
+void GfxScreen::bitsRestoreScreen(Common::Rect rect, const byte *&memoryPtr, byte *screen, uint16 screenWidth) {
 	int width = rect.width();
 	int y;
 
@@ -574,8 +697,7 @@ void GfxScreen::bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *scr
 	}
 }
 
-void GfxScreen::bitsRestoreDisplayScreen(Common::Rect rect, byte *&memoryPtr) {
-	byte *screen = _displayScreen;
+void GfxScreen::bitsRestoreDisplayScreen(Common::Rect rect, const byte *&memoryPtr, byte *screen) {
 	int width;
 	int y;
 
@@ -820,4 +942,62 @@ int16 GfxScreen::kernelPicNotValid(int16 newPicNotValid) {
 	return oldPicNotValid;
 }
 
+
+void GfxScreen::grabPalette(byte *buffer, uint start, uint num) const {
+	assert(start + num <= 256);
+	if (_format.bytesPerPixel == 1) {
+		g_system->getPaletteManager()->grabPalette(buffer, start, num);
+	} else {
+		memcpy(buffer, _palette + 3*start, 3*num);
+	}
+}
+
+void GfxScreen::setPalette(const byte *buffer, uint start, uint num, bool update) {
+	assert(start + num <= 256);
+	if (_format.bytesPerPixel == 1) {
+		g_system->getPaletteManager()->setPalette(buffer, start, num);
+	} else {
+		memcpy(_palette + 3*start, buffer, 3*num);
+		if (update) {
+			// directly paint from _displayedScreen, not from _activeScreen
+			Common::Rect r(0, 0, _displayWidth, _displayHeight);
+			convertToRGB(r);
+			g_system->copyRectToScreen(_rgbScreen, _displayWidth * _format.bytesPerPixel, 0, 0, _displayWidth, _displayHeight);
+		}
+		// CHECKME: Inside or outside the if (update)?
+		// (The !update case only happens inside transitions.)
+		CursorMan.replaceCursorPalette(_palette, 0, 256);
+	}
+}
+
+
+void GfxScreen::bakCreateBackup() {
+	assert(!_backupScreen);
+	_backupScreen = new byte[_format.bytesPerPixel * _displayPixels];
+	if (_format.bytesPerPixel == 1) {
+		Graphics::Surface *screen = g_system->lockScreen();
+		memcpy(_backupScreen, screen->getPixels(), _displayPixels);
+		g_system->unlockScreen();
+	} else {
+		memcpy(_backupScreen, _rgbScreen, _format.bytesPerPixel * _displayPixels);
+	}
+}
+
+void GfxScreen::bakDiscard() {
+	assert(_backupScreen);
+	delete[] _backupScreen;
+	_backupScreen = nullptr;
+}
+
+void GfxScreen::bakCopyRectToScreen(const Common::Rect &rect, int16 x, int16 y) {
+	assert(_backupScreen);
+	const byte *ptr = _backupScreen;
+	ptr += _format.bytesPerPixel * (rect.left + rect.top * _displayWidth);
+	g_system->copyRectToScreen(ptr, _format.bytesPerPixel * _displayWidth, x, y, rect.width(), rect.height());
+}
+
+
+
+
+
 } // End of namespace Sci
diff --git a/engines/sci/graphics/screen.h b/engines/sci/graphics/screen.h
index a9baf2bc10..7284de7e56 100644
--- a/engines/sci/graphics/screen.h
+++ b/engines/sci/graphics/screen.h
@@ -28,6 +28,7 @@
 #include "sci/graphics/view.h"
 
 #include "graphics/sjis.h"
+#include "graphics/pixelformat.h"
 
 namespace Sci {
 
@@ -80,12 +81,19 @@ public:
 
 	void clearForRestoreGame();
 	void copyToScreen();
-	void copyFromScreen(byte *buffer);
 	void kernelSyncWithFramebuffer();
 	void copyRectToScreen(const Common::Rect &rect);
 	void copyDisplayRectToScreen(const Common::Rect &rect);
 	void copyRectToScreen(const Common::Rect &rect, int16 x, int16 y);
 
+	// functions to manipulate a backup copy of the screen (for transitions)
+	void bakCreateBackup();
+	void bakCopyRectToScreen(const Common::Rect &rect, int16 x, int16 y);
+	void bakDiscard();
+
+	// video frame displaying
+	void copyVideoFrameToScreen(const byte *buffer, int pitch, const Common::Rect &rect, bool is8bit);
+
 	// Vector drawing
 private:
 	void vectorPutLinePixel(int16 x, int16 y, byte drawMask, byte color, byte priority, byte control);
@@ -114,8 +122,8 @@ public:
 
 	int bitsGetDataSize(Common::Rect rect, byte mask);
 	void bitsSave(Common::Rect rect, byte mask, byte *memoryPtr);
-	void bitsGetRect(byte *memoryPtr, Common::Rect *destRect);
-	void bitsRestore(byte *memoryPtr);
+	void bitsGetRect(const byte *memoryPtr, Common::Rect *destRect);
+	void bitsRestore(const byte *memoryPtr);
 
 	void scale2x(const SciSpan<const byte> &src, SciSpan<byte> &dst, int16 srcWidth, int16 srcHeight, byte bytesPerPixel = 1);
 
@@ -139,6 +147,9 @@ public:
 	void setFontIsUpscaled(bool isUpscaled) { _fontIsUpscaled = isUpscaled; }
 	bool fontIsUpscaled() const { return _fontIsUpscaled; }
 
+	void grabPalette(byte *buffer, uint start, uint num) const;
+	void setPalette(const byte *buffer, uint start, uint num, bool update = true);
+
 private:
 	uint16 _width;
 	uint16 _height;
@@ -149,13 +160,15 @@ private:
 	uint16 _displayHeight;
 	uint _displayPixels;
 
+	Graphics::PixelFormat _format;
+
 	byte _colorWhite;
 	byte _colorDefaultVectorData;
 
-	void bitsRestoreScreen(Common::Rect rect, byte *&memoryPtr, byte *screen, uint16 screenWidth);
-	void bitsRestoreDisplayScreen(Common::Rect rect, byte *&memoryPtr);
-	void bitsSaveScreen(Common::Rect rect, byte *screen, uint16 screenWidth, byte *&memoryPtr);
-	void bitsSaveDisplayScreen(Common::Rect rect, byte *&memoryPtr);
+	void bitsRestoreScreen(Common::Rect rect, const byte *&memoryPtr, byte *screen, uint16 screenWidth);
+	void bitsRestoreDisplayScreen(Common::Rect rect, const byte *&memoryPtr, byte *screen);
+	void bitsSaveScreen(Common::Rect rect, const byte *screen, uint16 screenWidth, byte *&memoryPtr);
+	void bitsSaveDisplayScreen(Common::Rect rect, const byte *screen, byte *&memoryPtr);
 
 	void setShakePos(uint16 shakeXOffset, uint16 shakeYOffset);
 
@@ -179,6 +192,17 @@ private:
 	 */
 	byte *_displayScreen;
 
+	// Screens for RGB mode support
+	byte *_displayedScreen;
+	byte *_rgbScreen;
+
+	byte *_backupScreen; // for bak* functions
+
+	void convertToRGB(const Common::Rect &rect);
+	void displayRectRGB(const Common::Rect &rect, int x, int y);
+	void displayRect(const Common::Rect &rect, int x, int y);
+	byte *_palette;
+
 	ResourceManager *_resMan;
 
 	/**
diff --git a/engines/sci/graphics/transitions.cpp b/engines/sci/graphics/transitions.cpp
index a51324b2c7..96ed3eacb6 100644
--- a/engines/sci/graphics/transitions.cpp
+++ b/engines/sci/graphics/transitions.cpp
@@ -272,7 +272,7 @@ void GfxTransitions::doTransition(int16 number, bool blackoutFlag) {
 
 void GfxTransitions::setNewPalette(bool blackoutFlag) {
 	if (!blackoutFlag)
-		_palette->setOnScreen();
+		_palette->setOnScreen(false);
 }
 
 void GfxTransitions::setNewScreen(bool blackoutFlag) {
@@ -308,7 +308,7 @@ void GfxTransitions::fadeOut() {
 	//  several pictures (e.g. qfg3 demo/intro), so the fading looked weird
 	int16 tillColorNr = getSciVersion() >= SCI_VERSION_1_1 ? 255 : 254;
 
-	g_system->getPaletteManager()->grabPalette(oldPalette, 0, 256);
+	_screen->grabPalette(oldPalette, 0, 256);
 
 	for (stepNr = 100; stepNr >= 0; stepNr -= 10) {
 		for (colorNr = 1; colorNr <= tillColorNr; colorNr++) {
@@ -322,7 +322,7 @@ void GfxTransitions::fadeOut() {
 				workPalette[colorNr * 3 + 2] = oldPalette[colorNr * 3 + 2] * stepNr / 100;
 			}
 		}
-		g_system->getPaletteManager()->setPalette(workPalette + 3, 1, tillColorNr);
+		_screen->setPalette(workPalette + 3, 1, tillColorNr);
 		g_sci->getEngineState()->sleep(2);
 	}
 }
@@ -463,15 +463,12 @@ void GfxTransitions::straight(int16 number, bool blackoutFlag) {
 }
 
 void GfxTransitions::scrollCopyOldToScreen(Common::Rect screenRect, int16 x, int16 y) {
-	byte *oldScreenPtr = _oldScreen;
-	int16 screenWidth = _screen->getDisplayWidth();
 	if (_screen->getUpscaledHires()) {
 		_screen->adjustToUpscaledCoordinates(screenRect.top, screenRect.left);
 		_screen->adjustToUpscaledCoordinates(screenRect.bottom, screenRect.right);
 		_screen->adjustToUpscaledCoordinates(y, x);
 	}
-	oldScreenPtr += screenRect.left + screenRect.top * screenWidth;
-	g_system->copyRectToScreen(oldScreenPtr, screenWidth, x, y, screenRect.width(), screenRect.height());
+	_screen->bakCopyRectToScreen(screenRect, x, y);
 }
 
 // Scroll old screen (up/down/left/right) and insert new screen that way - works
@@ -484,7 +481,7 @@ void GfxTransitions::scroll(int16 number) {
 	Common::Rect newScreenRect = _picRect;
 	uint32 msecCount = 0;
 
-	_screen->copyFromScreen(_oldScreen);
+	_screen->bakCreateBackup();
 
 	switch (number) {
 	case SCI_TRANSITIONS_SCROLL_LEFT:
@@ -561,6 +558,8 @@ void GfxTransitions::scroll(int16 number) {
 		break;
 	}
 
+	_screen->bakDiscard();
+
 	// Copy over final position just in case
 	_screen->copyRectToScreen(newScreenRect);
 }


Commit: fd126fba7a70ae1f29151377bcff93ab321ffa6c
    https://github.com/scummvm/scummvm/commit/fd126fba7a70ae1f29151377bcff93ab321ffa6c
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-10-24T02:55:01+03:00

Commit Message:
SCI: Add GAMEOPTION for RGB rendering

Adapted from commit 9f0f34abac463911e620be2ed7ebb15333006636

Changed paths:
    engines/sci/detection.cpp
    engines/sci/detection.h
    engines/sci/detection_tables.h


diff --git a/engines/sci/detection.cpp b/engines/sci/detection.cpp
index b3e651f59f..d19352a9b1 100644
--- a/engines/sci/detection.cpp
+++ b/engines/sci/detection.cpp
@@ -255,13 +255,25 @@ static const ADExtraGuiOptionsMap optionsList[] = {
 	// KQ7 - Upscale videos to double their size (The in-game "Full screen" video setting)
 	{
 		GAMEOPTION_UPSCALE_VIDEOS,
+		{
+			_s("Upscale videos"),
+			_s("Upscale videos to double their size"),
+			"enable_video_upscale",
+			true
+		}
+	},
+	
+	// SCI16 games: use RGB renderer instead of indexed
 	{
-		_s("Upscale videos"),
-		_s("Upscale videos to double their size"),
-		"enable_video_upscale",
-		true
-	}
+		GAMEOPTION_RGB_RENDERING,
+		{
+			_s("Use RGB rendering"),
+			_s("Use RGB rendering to improve screen transitions"),
+			"rgb_rendering",
+			false
+		}
 	},
+
 	AD_EXTRA_GUI_OPTIONS_TERMINATOR
 };
 
diff --git a/engines/sci/detection.h b/engines/sci/detection.h
index ec81fc0e36..5cb118347c 100644
--- a/engines/sci/detection.h
+++ b/engines/sci/detection.h
@@ -40,6 +40,7 @@ namespace Sci {
 #define GAMEOPTION_ENABLE_CENSORING         GUIO_GAMEOPTIONS11
 #define GAMEOPTION_LARRYSCALE               GUIO_GAMEOPTIONS12
 #define GAMEOPTION_UPSCALE_VIDEOS           GUIO_GAMEOPTIONS13
+#define GAMEOPTION_RGB_RENDERING            GUIO_GAMEOPTIONS14
 
 enum SciGameId {
 	GID_ASTROCHICKEN,
diff --git a/engines/sci/detection_tables.h b/engines/sci/detection_tables.h
index b784ecbb1d..645b8d64a4 100644
--- a/engines/sci/detection_tables.h
+++ b/engines/sci/detection_tables.h
@@ -22,11 +22,11 @@
 
 namespace Sci {
 
-#define GUIO_STD16 GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)
-#define GUIO_STD16_UNDITHER GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)
-#define GUIO_STD16_SPEECH GUIO3(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)
-#define GUIO_STD16_MAC GUIO3(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE)
-#define GUIO_STD16_MAC_UNDITHER GUIO4(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE)
+#define GUIO_STD16 GUIO5(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)
+#define GUIO_STD16_UNDITHER GUIO6(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)
+#define GUIO_STD16_SPEECH GUIO4(GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)
+#define GUIO_STD16_MAC GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)
+#define GUIO_STD16_MAC_UNDITHER GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)
 
 #define FANMADE_L(name, resMapMd5, resMapSize, resMd5, resSize, resVol, lang) \
 	{"sci-fanmade", name, { \
@@ -176,7 +176,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "27ec5fa09cd12a7fd16e86d96a2ed245", 548272},
 		{"resource.001", 0, "7c3e82c390e934de9b7afcab6de9cec4", 1117317},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO6(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 #ifdef ENABLE_SCI32
 	// Inside the Chest / Behind the Developer's Shield
@@ -298,7 +298,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.003", 0, "1f2f79e399098859c73e49ac6a3545d8", 622122},
 		{"resource.004", 0, "64f342463f6f35ba71b3509ef696ae3f", 669179},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO6(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Codename: Iceman - English DOS (supplied by ssburnout in bug report #3049193)
 	// 1.022 9x5.25" (label: Int#0.000.668)
@@ -538,7 +538,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "a4b73d5d2b55bdb6e44345e99c8fbdd0", 4804},
 		{"resource.000", 0, "d908dbef56816ac6c60dd145fdeafb2b", 3536046},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)},
 
 	// Eco Quest - English DOS Floppy (reported by misterhands in bug #6599)
 	// Game v1.10, interpreter 2.000.286, INT #6.12.92
@@ -1368,7 +1368,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "459f5b04467bc2107aec02f5c4b71b37", 4878},
 		{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652150},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_JONES_CDAUDIO)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_JONES_CDAUDIO, GAMEOPTION_RGB_RENDERING)	},
 
 	// Jones in the Fast Lane - English DOS US CD (alternate version)
 	// Supplied by collector9 in bug #3614668
@@ -1376,7 +1376,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "4344ff3f796707843b992adec2c87663", 4878},
 		{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652062},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO1(GAMEOPTION_JONES_CDAUDIO)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO2(GAMEOPTION_JONES_CDAUDIO, GAMEOPTION_RGB_RENDERING)	},
 
 	// Jones in the Fast Lane - English DOS US CD (alternate version)
 	// Same entry as the DOS version above. This one is used for the alternate
@@ -1385,7 +1385,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "4344ff3f796707843b992adec2c87663", 4878},
 		{"resource.001", 0, "3876da2ce16fb7dea2f5d943d946fa84", 1652062},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_JONES_CDAUDIO)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_MIDI_MODE, GAMEOPTION_JONES_CDAUDIO, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 1 SCI Remake - English Amiga (from www.back2roots.org)
 	// Executable scanning reports "1.003.007"
@@ -1612,7 +1612,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "449471bfd77be52f18a3773c7f7d843d", 571368},
 		{"resource.001", 0, "b45a581ff8751e052c7e364f58d3617f", 16800210},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO4(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 5 - English DOS Floppy
 	// SCI interpreter version 1.000.060
@@ -1841,7 +1841,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "71afd220d46bde1109c58e6acc0f3a01", 469094},
 		{"resource.001", 0, "72a569f46f1abf2d9d2b1526ad3799c3", 12808839},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformFMTowns, ADGF_ADDENGLISH, GUIO3(GUIO_NOASPECT, GAMEOPTION_ORIGINAL_SAVELOAD, GUIO_MIDITOWNS) },
+		Common::JA_JPN, Common::kPlatformFMTowns, ADGF_ADDENGLISH, GUIO4(GUIO_NOASPECT, GAMEOPTION_ORIGINAL_SAVELOAD, GUIO_MIDITOWNS, GAMEOPTION_RGB_RENDERING) },
 
 	// King's Quest 5 - Japanese PC-98 Floppy 0.000.015 (supplied by omer_mor in bug report #3073583)
 	{"kq5", "", {
@@ -1853,7 +1853,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.004", 0, "e114ce8f884601c43308fb5cbbea4874", 1174129},
 		{"resource.005", 0, "349ad9438172265d00680075c5a988d0", 1019669},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO6(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 6 - English DOS Non-Interactive Demo
 	// Executable scanning reports "1.001.055", VERSION file reports "1.000.000"
@@ -1929,7 +1929,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376008},
 		{"resource.msg", 0, "3cf5de44de36191f109d425b8450efc8", 259510},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO5(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 6 - English Windows CD (supplied by trembyle)
 	// Executable scanning reports "1.001.069", VERSION file reports "1.000.000"
@@ -1938,7 +1938,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376008},
 		{"resource.msg", 0, "3cf5de44de36191f109d425b8450efc8", 259510},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO6(GUIO_NOASPECT, GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_KQ6_WINDOWS_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO7(GUIO_NOASPECT, GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_KQ6_WINDOWS_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 6 - English DOS CD (same version included in King's Quest Collection)
 	// Executable scanning reports "1.cfs.158", VERSION file reports "1.000.00G"
@@ -1947,7 +1947,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "7a550ebfeae2575ca00d47703a6a774c", 9215},
 		{"resource.000", 0, "233394a5f33b475ae5975e7e9a420865", 8376352},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO4(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO5(GAMEOPTION_HIGH_RESOLUTION_GRAPHICS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// King's Quest 6 - English Windows CD (same version included in King's Quest Collection)
 	// Executable scanning reports "1.001.069", VERSION file reports "1.000.00G"
@@ -2162,7 +2162,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "9b1cddecd4f0720d83661ba7aed28891", 162697},
 		{"resource.map", 0, "93a2251fa64e729d7a7d2fe56b217c8e", 502},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO6(GUIO_NOSUBTITLES, GUIO_NOMUSIC, GUIO_NOSPEECH, GUIO_NOSFX, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_NO_FLAGS, GUIO7(GUIO_NOSUBTITLES, GUIO_NOMUSIC, GUIO_NOSPEECH, GUIO_NOSFX, GUIO_NOMIDI, GUIO_NOLAUNCHLOAD, GAMEOPTION_RGB_RENDERING)	},
 
 #endif // ENABLE_SCI32
 
@@ -2285,7 +2285,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.000", 0, "57084910bc923bff5d6d9bc1b56e9604", 5028766},
 		{"resource.msg", 0, "c28ba1d0326d06eab69f94d9a70f5389", 285797},
 		AD_LISTEND},
-		Common::ES_ESP, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::ES_ESP, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Laura Bow 2 - Spanish DOS CD (from jvprat)
 	// Executable scanning reports "2.000.274", VERSION file reports "1.000.000, May 10, 1994"
@@ -2542,7 +2542,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{ "resource.004", 0, "17bfd686d59accc3fb3f079ad9278e66", 658874 },
 		{ "resource.005", 0, "17bfd686d59accc3fb3f079ad9278e66", 794252 },
 		AD_LISTEND },
-		Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE) },
+		Common::DE_DEU, Common::kPlatformAmiga, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING) },
 
 	// Larry 3 - English Atari ST
 	// Game version 1.021, 1990-01-27
@@ -3325,7 +3325,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "b11e971ccd2040bebba59dfb409a08ef", 5772},
 		{"resource.001", 0, "d49625d9b8005ec01c852f8322a82867", 4330713},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformFMTowns, ADGF_ADDENGLISH, GUIO4(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::JA_JPN, Common::kPlatformFMTowns, ADGF_ADDENGLISH, GUIO5(GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 #ifdef ENABLE_SCI32
 
@@ -3793,7 +3793,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.002", 0, "77f02def3094af804fd2371db25b7100", 334283},
 		{"resource.003", 0, "77f02def3094af804fd2371db25b7100", 308044},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO6(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Police Quest 2 - English Atari ST
 	// Game version 1.001.006 1989-01-16 13:30
@@ -3815,7 +3815,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.002", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 637662},
 		{"resource.003", 0, "05fdee43a228dd6ea4d1a92ccae3f788", 684395},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO6(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO7(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Police Quest 3 - English Amiga
 	// Executable scanning reports "1.004.024"
@@ -4179,7 +4179,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1136968},
 		{"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 769897},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_RGB_RENDERING)	},
 
 	// Quest for Glory 1 - Japanese PC-98 5.25" Floppy (also includes English language)
 	// Executable scanning reports "S.old.201"
@@ -4189,7 +4189,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.002", 0, "a21451ef6fa8179bd4b22c4950004c44", 1147121},
 		{"resource.003", 0, "a21451ef6fa8179bd4b22c4950004c44", 777575},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO3(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO4(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_RGB_RENDERING)	},
 
 	// Quest for Glory 1 - English Amiga
 	// Executable scanning reports "1.002.020"
@@ -4750,7 +4750,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.003", 0, "da52b87ce225d12a3aa35e6b157e785c", 1214406},
 		{"resource.004", 0, "424f08b7593e54aa0ae22478b73e628a", 1208608},
 		AD_LISTEND},
-		Common::RU_RUS, Common::kPlatformDOS, 0, GUIO4(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::RU_RUS, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 
 	// Space Quest 1 VGA Remake - English Mac (from Fingolfin)
@@ -4885,7 +4885,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.003", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 330305},
 		{"resource.004", 0, "8b55c4875298f45ea5696a5ee8f6a7fe", 325779},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO5(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, 0, GUIO6(GUIO_NOSPEECH, GAMEOPTION_EGA_UNDITHER, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 3 - English DOS (from telanus, bug report Trac#9626)
 	// Game version 1.0P 1989-03-22
@@ -5103,7 +5103,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088},
 		{"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249},
 		AD_LISTEND},
-		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::JA_JPN, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO6(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - Japanese PC-98 5.25" Floppy (also includes english language)
 	// SCI interpreter version 1.000.1068
@@ -5113,7 +5113,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.001", 0, "454684e3a7a68cbca073945e50778447", 1187088},
 		{"resource.002", 0, "6dc668326cc22cb9e8bd8ca9e68d2a66", 1181249},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO5(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformPC98, ADGF_ADDENGLISH, GUIO6(GUIO_NOSPEECH, GUIO_NOASPECT, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - English DOS CD (from the Space Quest Collection)
 	// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -5121,7 +5121,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054},
 		{"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_CD, GUIO5(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - English Windows CD (from the Space Quest Collection)
 	// Executable scanning reports "1.001.064", VERSION file reports "1.0"
@@ -5131,7 +5131,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "ed90a8e3ccc53af6633ff6ab58392bae", 7054},
 		{"resource.000", 0, "63247e3901ab8963d4eece73747832e0", 5157378},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO5(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformWindows, ADGF_CD, GUIO6(GUIO_MIDIGM, GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - English DOS CD "NRS SQ4 Update 1.2" (unofficial patch)
 	// This patch set was distributed as a mixture the CD and floppy versions (the whole game)
@@ -5142,7 +5142,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.map", 0, "38287a646458a1dabded55d094407793", 7139},
 		{"resource.000", 0, "231fd8421e1f211e1bcf9d7b8b6408e7", 9525849},
 		AD_LISTEND},
-		Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::EN_ANY, Common::kPlatformDOS, ADGF_PIRATED, GUIO5(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - Spanish DOS CD (from jvprat, is still text only, not talkie, also includes english language)
 	// Executable scanning reports "1.SQ4.057", VERSION file reports "1.000"
@@ -5156,7 +5156,7 @@ static const struct ADGameDescription SciGameDescriptions[] = {
 		{"resource.004", 0, "776fba81c110d1908776232cbe190e20", 1253752},
 		{"resource.005", 0, "55fae26c2a92f16ef72c1e216e827c0f", 1098328},
 		AD_LISTEND},
-		Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO4(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE)	},
+		Common::ES_ESP, Common::kPlatformDOS, ADGF_ADDENGLISH, GUIO5(GAMEOPTION_SQ4_SILVER_CURSORS, GAMEOPTION_PREFER_DIGITAL_SFX, GAMEOPTION_ORIGINAL_SAVELOAD, GAMEOPTION_MIDI_MODE, GAMEOPTION_RGB_RENDERING)	},
 
 	// Space Quest 4 - Spanish DOS Floppy (from jvprat, also includes english language)
 	// Executable scanning reports "1.SQ4.056", VERSION file reports "1.000"


Commit: f04c4d04a21317ed044cb7ea2f38fca9975ef225
    https://github.com/scummvm/scummvm/commit/f04c4d04a21317ed044cb7ea2f38fca9975ef225
Author: Filippos Karapetis (bluegr at gmail.com)
Date: 2020-10-24T02:55:02+03:00

Commit Message:
NEWS: Mention the SCI RGB mode feature

Changed paths:
    NEWS.md


diff --git a/NEWS.md b/NEWS.md
index 3a58fb8bf9..69b2fd0e7e 100644
--- a/NEWS.md
+++ b/NEWS.md
@@ -37,6 +37,10 @@ For a more comprehensive changelog of the latest experimental code, see:
  SAGA:
    - Added support for ITE GOG Mac CD v1.1.
 
+ SCI:
+   - Added RGB rendering mode (16/32bpp) for SCI0 - SCI1.1 games, which addresses palette
+     issues in screen transitions and avoids mode changes when playing Mac QuickTime videos.
+
  Tinsel:
    - Enabled the Return to Launcher feature.
 




More information about the Scummvm-git-logs mailing list