[Scummvm-git-logs] scummvm master -> dd5ff1e4417fcd07641198b85d79b2eb74b02740
bluegr
noreply at scummvm.org
Mon Jun 30 14:08:04 UTC 2025
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://api.github.com/repos/scummvm/scummvm .
Summary:
dd5ff1e441 FREESCAPE: Reduce pixel format conversion when loading images
Commit: dd5ff1e4417fcd07641198b85d79b2eb74b02740
https://github.com/scummvm/scummvm/commit/dd5ff1e4417fcd07641198b85d79b2eb74b02740
Author: Cameron Cawley (ccawley2011 at gmail.com)
Date: 2025-06-30T17:08:00+03:00
Commit Message:
FREESCAPE: Reduce pixel format conversion when loading images
Changed paths:
engines/freescape/freescape.cpp
engines/freescape/freescape.h
engines/freescape/games/castle/zx.cpp
engines/freescape/games/dark/zx.cpp
engines/freescape/games/driller/zx.cpp
engines/freescape/games/eclipse/zx.cpp
engines/freescape/gfx.cpp
engines/freescape/gfx.h
engines/freescape/gfx_tinygl.cpp
engines/freescape/gfx_tinygl_texture.cpp
image/scr.cpp
diff --git a/engines/freescape/freescape.cpp b/engines/freescape/freescape.cpp
index a3aa4e9953d..b64a8a6e435 100644
--- a/engines/freescape/freescape.cpp
+++ b/engines/freescape/freescape.cpp
@@ -1151,7 +1151,7 @@ Graphics::ManagedSurface *FreescapeEngine::loadAndConvertNeoImage(Common::Seekab
decoder.loadStream(*stream);
Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
surface->copyFrom(*decoder.getSurface());
- surface->convertToInPlace(_gfx->_currentPixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
+ surface->convertToInPlace(_gfx->_texturePixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
return surface;
}
@@ -1160,18 +1160,18 @@ Graphics::ManagedSurface *FreescapeEngine::loadAndConvertDoodleImage(Common::See
decoder.loadStreams(*bitmap, *color1, *color2);
Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
surface->copyFrom(*decoder.getSurface());
- surface->convertToInPlace(_gfx->_currentPixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
+ surface->convertToInPlace(_gfx->_texturePixelFormat, decoder.getPalette().data(), decoder.getPalette().size());
return surface;
}
-Graphics::ManagedSurface *FreescapeEngine::loadAndCenterScrImage(Common::SeekableReadStream *stream) {
+Graphics::ManagedSurface *FreescapeEngine::loadAndConvertScrImage(Common::SeekableReadStream *stream) {
Image::ScrDecoder decoder;
decoder.loadStream(*stream);
Graphics::ManagedSurface *surface = new Graphics::ManagedSurface();
const Graphics::Surface *decoded = decoder.getSurface();
- surface->create(320, 200, decoded->format);
- surface->copyRectToSurface(*decoded, (320 - decoded->w) / 2, (200 - decoded->h) / 2, Common::Rect(decoded->w, decoded->h));
+ surface->create(320, 200, _gfx->_texturePixelFormat);
+ surface->simpleBlitFrom(*decoded, Common::Point((320 - decoded->w) / 2, (200 - decoded->h) / 2), &decoder.getPalette());
return surface;
}
diff --git a/engines/freescape/freescape.h b/engines/freescape/freescape.h
index e7c6b21d5da..682a7553a83 100644
--- a/engines/freescape/freescape.h
+++ b/engines/freescape/freescape.h
@@ -263,7 +263,7 @@ public:
Graphics::Surface *loadBundledImage(const Common::String &name, bool appendRenderMode = true);
byte *getPaletteFromNeoImage(Common::SeekableReadStream *stream, int offset);
Graphics::ManagedSurface *loadAndConvertNeoImage(Common::SeekableReadStream *stream, int offset, byte *palette = nullptr);
- Graphics::ManagedSurface *loadAndCenterScrImage(Common::SeekableReadStream *stream);
+ Graphics::ManagedSurface *loadAndConvertScrImage(Common::SeekableReadStream *stream);
Graphics::ManagedSurface *loadAndConvertDoodleImage(Common::SeekableReadStream *bitmap, Common::SeekableReadStream *color1, Common::SeekableReadStream *color2, byte *palette);
void loadPalettes(Common::SeekableReadStream *file, int offset);
diff --git a/engines/freescape/games/castle/zx.cpp b/engines/freescape/games/castle/zx.cpp
index c51e47b0599..1484a2eb7a2 100644
--- a/engines/freescape/games/castle/zx.cpp
+++ b/engines/freescape/games/castle/zx.cpp
@@ -92,14 +92,14 @@ void CastleEngine::loadAssetsZXFullGame() {
file.open("castlemaster.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find castlemaster.zx.title");
file.close();
file.open("castlemaster.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find castlemaster.zx.border");
file.close();
diff --git a/engines/freescape/games/dark/zx.cpp b/engines/freescape/games/dark/zx.cpp
index b3c64a56eb6..d526b2a606a 100644
--- a/engines/freescape/games/dark/zx.cpp
+++ b/engines/freescape/games/dark/zx.cpp
@@ -55,14 +55,14 @@ void DarkEngine::loadAssetsZXFullGame() {
file.open("darkside.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find darkside.zx.title");
file.close();
file.open("darkside.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find driller.zx.border");
file.close();
@@ -92,14 +92,14 @@ void DarkEngine::loadAssetsZXDemo() {
file.open("darkside.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find darkside.zx.title");
file.close();
file.open("darkside.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find driller.zx.border");
file.close();
diff --git a/engines/freescape/games/driller/zx.cpp b/engines/freescape/games/driller/zx.cpp
index 1a0deaac29e..b42bbba4bcd 100644
--- a/engines/freescape/games/driller/zx.cpp
+++ b/engines/freescape/games/driller/zx.cpp
@@ -35,7 +35,7 @@ void DrillerEngine::loadAssetsZXFullGame() {
Common::File file;
file.open("driller.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find driller.zx.title");
@@ -43,7 +43,7 @@ void DrillerEngine::loadAssetsZXFullGame() {
file.open("driller.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find driller.zx.border");
file.close();
@@ -157,4 +157,4 @@ void DrillerEngine::drawZXUI(Graphics::Surface *surface) {
drawCompass(surface, 220 - 3, 160, _pitch - 30, 10, 60, front);
}
-} // End of namespace Freescape
\ No newline at end of file
+} // End of namespace Freescape
diff --git a/engines/freescape/games/eclipse/zx.cpp b/engines/freescape/games/eclipse/zx.cpp
index dd4c49228d8..07de90a3ef9 100644
--- a/engines/freescape/games/eclipse/zx.cpp
+++ b/engines/freescape/games/eclipse/zx.cpp
@@ -57,14 +57,14 @@ void EclipseEngine::loadAssetsZXFullGame() {
file.open("totaleclipse.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find totaleclipse.zx.title");
file.close();
file.open("totaleclipse.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find totaleclipse.zx.border");
file.close();
@@ -100,14 +100,14 @@ void EclipseEngine::loadAssetsZXDemo() {
file.open("totaleclipse.zx.title");
if (file.isOpen()) {
- _title = loadAndCenterScrImage(&file);
+ _title = loadAndConvertScrImage(&file);
} else
error("Unable to find totaleclipse.zx.title");
file.close();
file.open("totaleclipse.zx.border");
if (file.isOpen()) {
- _border = loadAndCenterScrImage(&file);
+ _border = loadAndConvertScrImage(&file);
} else
error("Unable to find totaleclipse.zx.border");
file.close();
diff --git a/engines/freescape/gfx.cpp b/engines/freescape/gfx.cpp
index 3aff643aa8f..d7cbd89ff53 100644
--- a/engines/freescape/gfx.cpp
+++ b/engines/freescape/gfx.cpp
@@ -41,7 +41,6 @@ const Graphics::PixelFormat getRGBAPixelFormat() {
Renderer::Renderer(int screenW, int screenH, Common::RenderMode renderMode, bool authenticGraphics) {
_screenW = screenW;
_screenH = screenH;
- _currentPixelFormat = Graphics::PixelFormat(4, 8, 8, 8, 8, 24, 16, 8, 0);
_keyColor = -1;
_inkColor = -1;
_paperColor = -1;
diff --git a/engines/freescape/gfx.h b/engines/freescape/gfx.h
index 57eb93d17b8..69edbce0857 100644
--- a/engines/freescape/gfx.h
+++ b/engines/freescape/gfx.h
@@ -62,7 +62,6 @@ public:
Renderer(int screenW, int screenH, Common::RenderMode renderMode, bool authenticGraphics);
virtual ~Renderer();
- Graphics::PixelFormat _currentPixelFormat;
Graphics::PixelFormat _texturePixelFormat;
bool _isAccelerated;
bool _authenticGraphics;
diff --git a/engines/freescape/gfx_tinygl.cpp b/engines/freescape/gfx_tinygl.cpp
index 9b08986d199..c2fc21f2ee3 100644
--- a/engines/freescape/gfx_tinygl.cpp
+++ b/engines/freescape/gfx_tinygl.cpp
@@ -40,6 +40,7 @@ Renderer *CreateGfxTinyGL(int screenW, int screenH, Common::RenderMode renderMod
TinyGLRenderer::TinyGLRenderer(int screenW, int screenH, Common::RenderMode renderMode) : Renderer(screenW, screenH, renderMode, true) {
_verts = (Vertex *)malloc(sizeof(Vertex) * kVertexArraySize);
_texCoord = (Coord *)malloc(sizeof(Coord) * kVertexArraySize);
+ // TODO: Select this based on the screen format
_texturePixelFormat = getRGBAPixelFormat();
_variableStippleArray = nullptr;
}
diff --git a/engines/freescape/gfx_tinygl_texture.cpp b/engines/freescape/gfx_tinygl_texture.cpp
index c3ad12c027b..543474f7f65 100644
--- a/engines/freescape/gfx_tinygl_texture.cpp
+++ b/engines/freescape/gfx_tinygl_texture.cpp
@@ -42,7 +42,7 @@ TinyGL2DTexture::~TinyGL2DTexture() {
}
void TinyGL2DTexture::update(const Graphics::Surface *surface) {
- uint32 keyColor = getRGBAPixelFormat().RGBToColor(0xA0, 0xA0, 0xA0);
+ uint32 keyColor = surface->format.RGBToColor(0xA0, 0xA0, 0xA0);
tglUploadBlitImage(_blitImage, *surface, keyColor, true);
}
diff --git a/image/scr.cpp b/image/scr.cpp
index 360d0827b52..ae38a28f314 100644
--- a/image/scr.cpp
+++ b/image/scr.cpp
@@ -28,7 +28,26 @@
namespace Image {
-ScrDecoder::ScrDecoder() : _surface(nullptr), _palette(0) {
+static const byte scrPalette[16 * 3] = {
+ 0x00, 0x00, 0x00, /* black */
+ 0x00, 0x00, 0xD8, /* blue */
+ 0xD8, 0x00, 0x00, /* red */
+ 0xD8, 0x00, 0xD8, /* magenta */
+ 0x00, 0xD8, 0x00, /* green */
+ 0x00, 0xD8, 0xD8, /* cyan */
+ 0xD8, 0xD8, 0x00, /* yellow */
+ 0xD8, 0xD8, 0xD8, /* white */
+ 0x00, 0x00, 0x00, /* bright black */
+ 0x00, 0x00, 0xFF, /* bright blue */
+ 0xFF, 0x00, 0x00, /* bright red */
+ 0xFF, 0x00, 0xFF, /* bright magenta */
+ 0x00, 0xFF, 0x00, /* bright green */
+ 0x00, 0xFF, 0xFF, /* bright cyan */
+ 0xFF, 0xFF, 0x00, /* bright yellow */
+ 0xFF, 0xFF, 0xFF, /* bright white */
+};
+
+ScrDecoder::ScrDecoder() : _surface(nullptr), _palette(scrPalette, 16) {
}
ScrDecoder::~ScrDecoder() {
@@ -69,12 +88,10 @@ bool ScrDecoder::loadStream(Common::SeekableReadStream &stream) {
int width = 256;
int height = 192;
- Graphics::PixelFormat format(4, 8, 8, 8, 8, 24, 16, 8, 0);
-
_surface = new Graphics::Surface();
- _surface->create(width, height, format);
+ _surface->create(width, height, Graphics::PixelFormat::createFormatCLUT8());
- for (int y = 0; y < height; y++) {
+ for (int y = 0; y < height; y++) {
for (int col = 0; col < width >> 3; col++) {
int x = col << 3;
byte byt = data[getPixelAddress(x, y)];
@@ -82,16 +99,10 @@ bool ScrDecoder::loadStream(Common::SeekableReadStream &stream) {
byte ink = attr & 0x07;
byte paper = (attr >> 3) & 0x07;
byte bright = (attr >> 6) & 1;
- byte val = bright ? 0xff : 0xd8;
for (int bit = 0; bit < 8; bit++) {
bool set = (byt >> (7 - bit)) & 1;
- int color = set ? ink : paper;
-
- byte r = val * (color >> 1 & 1);
- byte g = val * (color >> 2 & 1);
- byte b = val * (color >> 0 & 1);
-
- _surface->setPixel(x + bit, y, format.ARGBToColor(0xFF, r, g, b));
+ int color = (bright << 3) | (set ? ink : paper);
+ _surface->setPixel(x + bit, y, color);
}
}
}
More information about the Scummvm-git-logs
mailing list