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

dreammaster noreply at scummvm.org
Wed Jun 1 02:18:39 UTC 2022


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

Summary:
e699d4a371 ULTIMA8: Refactor RenderSurface _format from being a global object


Commit: e699d4a37171cd2950e7d3d7ee058ff1b0e89a4a
    https://github.com/scummvm/scummvm/commit/e699d4a37171cd2950e7d3d7ee058ff1b0e89a4a
Author: Paul Gilbert (dreammaster at scummvm.org)
Date: 2022-05-31T19:18:27-07:00

Commit Message:
ULTIMA8: Refactor RenderSurface _format from being a global object

Changed paths:
    engines/ultima/ultima8/graphics/base_soft_render_surface.cpp
    engines/ultima/ultima8/graphics/render_surface.cpp
    engines/ultima/ultima8/graphics/render_surface.h
    engines/ultima/ultima8/graphics/soft_render_surface.cpp
    engines/ultima/ultima8/ultima8.cpp
    engines/ultima/ultima8/ultima8.h


diff --git a/engines/ultima/ultima8/graphics/base_soft_render_surface.cpp b/engines/ultima/ultima8/graphics/base_soft_render_surface.cpp
index aaa647a1df7..e89e7b8a204 100644
--- a/engines/ultima/ultima8/graphics/base_soft_render_surface.cpp
+++ b/engines/ultima/ultima8/graphics/base_soft_render_surface.cpp
@@ -51,31 +51,31 @@ BaseSoftRenderSurface::BaseSoftRenderSurface(Graphics::ManagedSurface *s) :
 	_bytesPerPixel = _surface->format.bytesPerPixel;
 
 	// TODO: Slight hack - set the global surface format only once.
-	if (!RenderSurface::_format.bytesPerPixel) {
-		RenderSurface::_format.bytesPerPixel = _bytesPerPixel;
-		RenderSurface::_format.rLoss = _surface->format.rLoss;
-		RenderSurface::_format.gLoss = _surface->format.gLoss;
-		RenderSurface::_format.bLoss = _surface->format.bLoss;
-		RenderSurface::_format.aLoss = _surface->format.aLoss;
-		RenderSurface::_format.rLoss16 = _format.rLoss + 8;
-		RenderSurface::_format.gLoss16 = _format.gLoss + 8;
-		RenderSurface::_format.bLoss16 = _format.bLoss + 8;
-		RenderSurface::_format.aLoss16 = _format.aLoss + 8;
-		RenderSurface::_format.rShift = _surface->format.rShift;
-		RenderSurface::_format.gShift = _surface->format.gShift;
-		RenderSurface::_format.bShift = _surface->format.bShift;
-		RenderSurface::_format.aShift = _surface->format.aShift;
-		RenderSurface::_format.rMask = _surface->format.rMax() << _surface->format.rShift;
-		RenderSurface::_format.gMask = _surface->format.gMax() << _surface->format.gShift;
-		RenderSurface::_format.bMask = _surface->format.bMax() << _surface->format.bShift;
-		RenderSurface::_format.aMask = _surface->format.aMax() << _surface->format.aShift;
+	if (!RenderSurface::_format->bytesPerPixel) {
+		RenderSurface::_format->bytesPerPixel = _bytesPerPixel;
+		RenderSurface::_format->rLoss = _surface->format.rLoss;
+		RenderSurface::_format->gLoss = _surface->format.gLoss;
+		RenderSurface::_format->bLoss = _surface->format.bLoss;
+		RenderSurface::_format->aLoss = _surface->format.aLoss;
+		RenderSurface::_format->rLoss16 = _format->rLoss + 8;
+		RenderSurface::_format->gLoss16 = _format->gLoss + 8;
+		RenderSurface::_format->bLoss16 = _format->bLoss + 8;
+		RenderSurface::_format->aLoss16 = _format->aLoss + 8;
+		RenderSurface::_format->rShift = _surface->format.rShift;
+		RenderSurface::_format->gShift = _surface->format.gShift;
+		RenderSurface::_format->bShift = _surface->format.bShift;
+		RenderSurface::_format->aShift = _surface->format.aShift;
+		RenderSurface::_format->rMask = _surface->format.rMax() << _surface->format.rShift;
+		RenderSurface::_format->gMask = _surface->format.gMax() << _surface->format.gShift;
+		RenderSurface::_format->bMask = _surface->format.bMax() << _surface->format.bShift;
+		RenderSurface::_format->aMask = _surface->format.aMax() << _surface->format.aShift;
 	}
 
 	SetPixelsPointer();
 
 	// Trickery to get the alpha channel
-	if (_format.aMask == 0 && _bytesPerPixel == 4) {
-		uint32 mask = ~(_format.rMask | _format.gMask | _format.bMask);
+	if (_format->aMask == 0 && _bytesPerPixel == 4) {
+		uint32 mask = ~(_format->rMask | _format->gMask | _format->bMask);
 
 		// Using all bits????
 		if (!mask) return;
@@ -104,10 +104,10 @@ BaseSoftRenderSurface::BaseSoftRenderSurface(Graphics::ManagedSurface *s) :
 		if (zero < last) return;
 
 		// Set it
-		_format.aShift = first;
-		_format.aLoss = 8 - (last + 1 - first);
-		_format.aLoss16 = _format.aLoss + 8;
-		_format.aMask = mask;
+		_format->aShift = first;
+		_format->aLoss = 8 - (last + 1 - first);
+		_format->aLoss16 = _format->aLoss + 8;
+		_format->aMask = mask;
 	}
 }
 
diff --git a/engines/ultima/ultima8/graphics/render_surface.cpp b/engines/ultima/ultima8/graphics/render_surface.cpp
index 72af703d199..a2e54a35ec2 100644
--- a/engines/ultima/ultima8/graphics/render_surface.cpp
+++ b/engines/ultima/ultima8/graphics/render_surface.cpp
@@ -21,6 +21,7 @@
 
 #include "ultima/ultima8/misc/pent_include.h"
 #include "ultima/ultima8/graphics/soft_render_surface.h"
+#include "ultima/ultima8/ultima8.h"
 #include "common/system.h"
 #include "engines/util.h"
 #include "graphics/screen.h"
@@ -28,7 +29,7 @@
 namespace Ultima {
 namespace Ultima8 {
 
-RenderSurface::U8PixelFormat RenderSurface::_format;
+U8PixelFormat *RenderSurface::_format = nullptr;
 
 uint8 RenderSurface::_gamma10toGamma22[256];
 uint8 RenderSurface::_gamma22toGamma10[256];
@@ -41,6 +42,8 @@ uint8 RenderSurface::_gamma22toGamma10[256];
 //
 
 RenderSurface *RenderSurface::SetVideoMode(uint32 width, uint32 height, int bpp) {
+	_format = &Ultima8Engine::get_instance()->_renderFormat;
+
 	// Set up the pixel format to use
 	Graphics::PixelFormat pixelFormat;
 
@@ -79,8 +82,8 @@ RenderSurface *RenderSurface::CreateSecondaryRenderSurface(uint32 width, uint32
 	RenderSurface *surf;
 
 	// TODO: Change this
-	Graphics::ManagedSurface *managedSurface = new Graphics::ManagedSurface(width, height, _format);
-	if (_format.bytesPerPixel == 4) surf = new SoftRenderSurface<uint32>(managedSurface);
+	Graphics::ManagedSurface *managedSurface = new Graphics::ManagedSurface(width, height, *_format);
+	if (_format->bytesPerPixel == 4) surf = new SoftRenderSurface<uint32>(managedSurface);
 	else surf = new SoftRenderSurface<uint16>(managedSurface);
 	return surf;
 }
diff --git a/engines/ultima/ultima8/graphics/render_surface.h b/engines/ultima/ultima8/graphics/render_surface.h
index 80eee2298c6..05211dcac3e 100644
--- a/engines/ultima/ultima8/graphics/render_surface.h
+++ b/engines/ultima/ultima8/graphics/render_surface.h
@@ -37,13 +37,24 @@ struct Palette;
 struct Rect;
 class Scaler;
 
-#define UNPACK_RGB8(pix,r,g,b) { r = (((pix)&RenderSurface::_format.rMask)>>RenderSurface::_format.rShift)<<RenderSurface::_format.rLoss; g = (((pix)&RenderSurface::_format.gMask)>>RenderSurface::_format.gShift)<<RenderSurface::_format.gLoss; b = (((pix)&RenderSurface::_format.bMask)>>RenderSurface::_format.bShift)<<RenderSurface::_format.bLoss; }
-#define PACK_RGB8(r,g,b) ((((r)>>RenderSurface::_format.rLoss)<<RenderSurface::_format.rShift) | (((g)>>RenderSurface::_format.gLoss)<<RenderSurface::_format.gShift) | (((b)>>RenderSurface::_format.bLoss)<<RenderSurface::_format.bShift))
-#define PACK_RGB16(r,g,b) ((((r)>>RenderSurface::_format.rLoss16)<<RenderSurface::_format.rShift) | (((g)>>RenderSurface::_format.gLoss16)<<RenderSurface::_format.gShift) | (((b)>>RenderSurface::_format.bLoss16)<<RenderSurface::_format.bShift))
-
-#define UNPACK_RGBA8(pix,r,g,b,a) { r = (((pix)&RenderSurface::_format.rMask)>>RenderSurface::_format.rShift)<<RenderSurface::_format.rLoss; g = (((pix)&RenderSurface::_format.gMask)>>RenderSurface::_format.gShift)<<RenderSurface::_format.gLoss; b = (((pix)&RenderSurface::_format.bMask)>>RenderSurface::_format.bShift)<<RenderSurface::_format.bLoss; ; a = (((pix)&RenderSurface::_format.aMask)>>RenderSurface::_format.aShift)<<RenderSurface::_format.aLoss; }
-#define PACK_RGBA8(r,g,b,a) ((((r)>>RenderSurface::_format.rLoss)<<RenderSurface::_format.rShift) | (((g)>>RenderSurface::_format.gLoss)<<RenderSurface::_format.gShift) | (((b)>>RenderSurface::_format.bLoss)<<RenderSurface::_format.bShift) | (((a)>>RenderSurface::_format.aLoss)<<RenderSurface::_format.aShift))
-#define PACK_RGBA16(r,g,b,a) ((((r)>>RenderSurface::_format.rLoss16)<<RenderSurface::_format.rShift) | (((g)>>RenderSurface::_format.gLoss16)<<RenderSurface::_format.gShift) | (((b)>>RenderSurface::_format.bLoss16)<<RenderSurface::_format.bShift) | (((a)>>RenderSurface::_format.aLoss16)<<RenderSurface::_format.aShift))
+#define UNPACK_RGB8(pix,r,g,b) { r = (((pix)&RenderSurface::_format->rMask)>>RenderSurface::_format->rShift)<<RenderSurface::_format->rLoss; g = (((pix)&RenderSurface::_format->gMask)>>RenderSurface::_format->gShift)<<RenderSurface::_format->gLoss; b = (((pix)&RenderSurface::_format->bMask)>>RenderSurface::_format->bShift)<<RenderSurface::_format->bLoss; }
+#define PACK_RGB8(r,g,b) ((((r)>>RenderSurface::_format->rLoss)<<RenderSurface::_format->rShift) | (((g)>>RenderSurface::_format->gLoss)<<RenderSurface::_format->gShift) | (((b)>>RenderSurface::_format->bLoss)<<RenderSurface::_format->bShift))
+#define PACK_RGB16(r,g,b) ((((r)>>RenderSurface::_format->rLoss16)<<RenderSurface::_format->rShift) | (((g)>>RenderSurface::_format->gLoss16)<<RenderSurface::_format->gShift) | (((b)>>RenderSurface::_format->bLoss16)<<RenderSurface::_format->bShift))
+
+#define UNPACK_RGBA8(pix,r,g,b,a) { r = (((pix)&RenderSurface::_format->rMask)>>RenderSurface::_format->rShift)<<RenderSurface::_format->rLoss; g = (((pix)&RenderSurface::_format->gMask)>>RenderSurface::_format->gShift)<<RenderSurface::_format->gLoss; b = (((pix)&RenderSurface::_format->bMask)>>RenderSurface::_format->bShift)<<RenderSurface::_format->bLoss; ; a = (((pix)&RenderSurface::_format->aMask)>>RenderSurface::_format->aShift)<<RenderSurface::_format->aLoss; }
+#define PACK_RGBA8(r,g,b,a) ((((r)>>RenderSurface::_format->rLoss)<<RenderSurface::_format->rShift) | (((g)>>RenderSurface::_format->gLoss)<<RenderSurface::_format->gShift) | (((b)>>RenderSurface::_format->bLoss)<<RenderSurface::_format->bShift) | (((a)>>RenderSurface::_format->aLoss)<<RenderSurface::_format->aShift))
+#define PACK_RGBA16(r,g,b,a) ((((r)>>RenderSurface::_format->rLoss16)<<RenderSurface::_format->rShift) | (((g)>>RenderSurface::_format->gLoss16)<<RenderSurface::_format->gShift) | (((b)>>RenderSurface::_format->bLoss16)<<RenderSurface::_format->bShift) | (((a)>>RenderSurface::_format->aLoss16)<<RenderSurface::_format->aShift))
+
+struct U8PixelFormat : Graphics::PixelFormat {
+	// Extend with some extra attributes
+	byte  rLoss16, gLoss16, bLoss16, aLoss16;
+	uint32  rMask, gMask, bMask, aMask;
+
+	inline U8PixelFormat() : Graphics::PixelFormat(),
+		rLoss16(0), gLoss16(0), bLoss16(0), aLoss16(0),
+		rMask(0), gMask(0), bMask(0), aMask(0) {
+	}
+};
 
 //
 // RenderSurface
@@ -52,19 +63,7 @@ class Scaler;
 //
 class RenderSurface {
 public:
-	struct U8PixelFormat : Graphics::PixelFormat {
-		// Extend with some extra attributes
-		byte  rLoss16, gLoss16, bLoss16, aLoss16;
-		uint32  rMask,   gMask,   bMask,   aMask;
-
-		inline U8PixelFormat() : Graphics::PixelFormat(),
-			rLoss16(0), gLoss16(0), bLoss16(0), aLoss16(0),
-			rMask(0), gMask(0), bMask(0), aMask(0)
-		{
-		}
-	};
-
-	static U8PixelFormat _format;
+	static U8PixelFormat *_format;
 
 	static uint8 _gamma10toGamma22[256];
 	static uint8 _gamma22toGamma10[256];
diff --git a/engines/ultima/ultima8/graphics/soft_render_surface.cpp b/engines/ultima/ultima8/graphics/soft_render_surface.cpp
index 983bf4a10ef..cfc1de83036 100644
--- a/engines/ultima/ultima8/graphics/soft_render_surface.cpp
+++ b/engines/ultima/ultima8/graphics/soft_render_surface.cpp
@@ -75,7 +75,7 @@ template<class uintX> void SoftRenderSurface<uintX>::FillAlpha(uint8 alpha, int3
 	w = rect.width();
 	h = rect.height();
 
-	if (!w || !h || !RenderSurface::_format.aMask) return;
+	if (!w || !h || !RenderSurface::_format->aMask) return;
 
 	// An optimization.
 	if ((int)(w * sizeof(uintX)) == _pitch) {
@@ -89,24 +89,24 @@ template<class uintX> void SoftRenderSurface<uintX>::FillAlpha(uint8 alpha, int3
 	uint8 *line_end = pixel + w * sizeof(uintX);
 	int diff = _pitch - w * sizeof(uintX);
 
-	uintX a = (((uintX)alpha) << RenderSurface::_format.aShift)&RenderSurface::_format.aMask;
+	uintX a = (((uintX)alpha) << RenderSurface::_format->aShift)&RenderSurface::_format->aMask;
 
 #ifdef CHECK_ALPHA_FILLS
 	uintX c;
 	uintX m;
 	if (a == 0) {
-		c = (RenderSurface::_format.bMask >> 1)&RenderSurface::_format.bMask;
-		m = RenderSurface::_format.bMask;
+		c = (RenderSurface::_format->bMask >> 1)&RenderSurface::_format->bMask;
+		m = RenderSurface::_format->bMask;
 	} else {
-		c = (RenderSurface::_format.rMask >> 1)&RenderSurface::_format.rMask;
-		m = RenderSurface::_format.rMask;
+		c = (RenderSurface::_format->rMask >> 1)&RenderSurface::_format->rMask;
+		m = RenderSurface::_format->rMask;
 	}
 #endif
 
 	while (pixel != end) {
 		while (pixel != line_end) {
 			uintX *dest = reinterpret_cast<uintX *>(pixel);
-			*dest = (*dest & ~RenderSurface::_format.aMask) | a;
+			*dest = (*dest & ~RenderSurface::_format->aMask) | a;
 #ifdef CHECK_ALPHA_FILLS
 			*dest = (*dest & ~m) | (c + (((*dest & m) >> 1)&m));
 #endif
@@ -154,7 +154,7 @@ template<class uintX> void SoftRenderSurface<uintX>::FillBlended(uint32 rgba, in
 		while (pixel != line_end) {
 			uintX *dest = reinterpret_cast<uintX *>(pixel);
 			uintX d = *dest;
-			*dest = (d & RenderSurface::_format.aMask) | BlendPreModFast(rgba, d);
+			*dest = (d & RenderSurface::_format->aMask) | BlendPreModFast(rgba, d);
 			pixel += sizeof(uintX);
 		}
 
@@ -342,7 +342,7 @@ template<class uintX> void SoftRenderSurface<uintX>::FadedBlit(const Graphics::M
 			pixel += diff;
 			texel += tex_diff;
 		}
-	} else if (texformat == _format) {
+	} else if (texformat == *_format) {
 		const uintX *texel = reinterpret_cast<const uintX *>(tex->getBasePtr(sx, sy));
 		int tex_diff = tex->w - w;
 
@@ -362,7 +362,7 @@ template<class uintX> void SoftRenderSurface<uintX>::FadedBlit(const Graphics::M
 			texel += tex_diff;
 		}
 	} else {
-		error("FadedBlit not supported from %d bpp to %d bpp", texformat.bpp(), _format.bpp());
+		error("FadedBlit not supported from %d bpp to %d bpp", texformat.bpp(), _format->bpp());
 	}
 }
 
@@ -422,7 +422,7 @@ template<class uintX> void SoftRenderSurface<uintX>::MaskedBlit(const Graphics::
 					uintX *dest = reinterpret_cast<uintX *>(pixel);
 
 					if (*texel & TEX32_A_MASK) {
-						if (!RenderSurface::_format.aMask || (*dest & RenderSurface::_format.aMask)) {
+						if (!RenderSurface::_format->aMask || (*dest & RenderSurface::_format->aMask)) {
 							*dest = static_cast<uintX>(
 								PACK_RGB8(
 									(TEX32_R(*texel) * ia + r) >> 8,
@@ -439,7 +439,7 @@ template<class uintX> void SoftRenderSurface<uintX>::MaskedBlit(const Graphics::
 				while (pixel != line_end) {
 					uintX *dest = reinterpret_cast<uintX *>(pixel);
 
-					if (!RenderSurface::_format.aMask || (*dest & RenderSurface::_format.aMask)) {
+					if (!RenderSurface::_format->aMask || (*dest & RenderSurface::_format->aMask)) {
 						uint32 alpha = *texel & TEX32_A_MASK;
 						if (alpha == 0xFF) {
 							*dest = static_cast<uintX>(
@@ -473,7 +473,7 @@ template<class uintX> void SoftRenderSurface<uintX>::MaskedBlit(const Graphics::
 			pixel += diff;
 			texel += tex_diff;
 		}
-	} else if (texbpp == _format.bpp()) {
+	} else if (texbpp == _format->bpp()) {
 		const uintX *texel = reinterpret_cast<const uintX *>(tex->getBasePtr(sx, sy));
 		int tex_diff = tex->w - w;
 
@@ -482,8 +482,8 @@ template<class uintX> void SoftRenderSurface<uintX>::MaskedBlit(const Graphics::
 				uintX *dest = reinterpret_cast<uintX *>(pixel);
 
 				// Uh, not completely supported right now
-				//if ((*texel & RenderSurface::_format.a_mask) && (*dest & RenderSurface::_format.a_mask))
-				if (*dest & RenderSurface::_format.aMask) {
+				//if ((*texel & RenderSurface::_format->a_mask) && (*dest & RenderSurface::_format->a_mask))
+				if (*dest & RenderSurface::_format->aMask) {
 					*dest = BlendHighlight(*texel, r, g, b, 1, ia);
 				}
 				pixel += sizeof(uintX);
diff --git a/engines/ultima/ultima8/ultima8.cpp b/engines/ultima/ultima8/ultima8.cpp
index 87718408982..122f79c19c3 100644
--- a/engines/ultima/ultima8/ultima8.cpp
+++ b/engines/ultima/ultima8/ultima8.cpp
@@ -671,7 +671,7 @@ void Ultima8Engine::GraphicSysInit() {
 		_screen->GetSurfaceDims(old_dims);
 		if (width == old_dims.width() && height == old_dims.height())
 			return;
-		bpp = RenderSurface::_format.bpp();
+		bpp = RenderSurface::_format->bpp();
 
 		delete _screen;
 	}
diff --git a/engines/ultima/ultima8/ultima8.h b/engines/ultima/ultima8/ultima8.h
index bf6ad2b7ba7..bb00ddb2b23 100644
--- a/engines/ultima/ultima8/ultima8.h
+++ b/engines/ultima/ultima8/ultima8.h
@@ -29,6 +29,7 @@
 #include "ultima/ultima8/usecode/intrinsics.h"
 #include "ultima/ultima8/misc/common_types.h"
 #include "ultima/ultima8/games/game_info.h"
+#include "ultima/ultima8/graphics/render_surface.h"
 #include "ultima/detection.h"
 
 namespace Ultima {
@@ -378,6 +379,8 @@ public:
 	bool isInterpolationEnabled() const {
 		return _interpolate;
 	}
+public:
+	U8PixelFormat _renderFormat;
 };
 
 } // End of namespace Ultima8




More information about the Scummvm-git-logs mailing list