[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