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

peterkohaut peterkohaut at users.noreply.github.com
Sat Aug 31 23:12:52 CEST 2019


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:
a7399c5111 BLADERUNNER: Use best pixel format on every platform


Commit: a7399c5111cc7ebeea284498a1ee5ac7542bb96d
    https://github.com/scummvm/scummvm/commit/a7399c5111cc7ebeea284498a1ee5ac7542bb96d
Author: Peter Kohaut (peter.kohaut at gmail.com)
Date: 2019-08-31T23:09:19+02:00

Commit Message:
BLADERUNNER: Use best pixel format on every platform

Updated all drawing routines to be pixel format agnostic.
Might decrease performance.

Changed paths:
    engines/bladerunner/bladerunner.cpp
    engines/bladerunner/bladerunner.h
    engines/bladerunner/dialogue_menu.cpp
    engines/bladerunner/font.cpp
    engines/bladerunner/font.h
    engines/bladerunner/outtake.cpp
    engines/bladerunner/savefile.cpp
    engines/bladerunner/shape.cpp
    engines/bladerunner/slice_animations.cpp
    engines/bladerunner/slice_animations.h
    engines/bladerunner/slice_renderer.cpp
    engines/bladerunner/slice_renderer.h
    engines/bladerunner/ui/esper.cpp
    engines/bladerunner/ui/esper.h
    engines/bladerunner/ui/kia.cpp
    engines/bladerunner/ui/kia_section_diagnostic.cpp
    engines/bladerunner/ui/ui_slider.cpp
    engines/bladerunner/ui/vk.cpp
    engines/bladerunner/vqa_decoder.cpp


diff --git a/engines/bladerunner/bladerunner.cpp b/engines/bladerunner/bladerunner.cpp
index 2da701f..9262d41 100644
--- a/engines/bladerunner/bladerunner.cpp
+++ b/engines/bladerunner/bladerunner.cpp
@@ -324,8 +324,9 @@ Common::Error BladeRunnerEngine::run() {
 		return Common::Error(Common::kNoGameDataFoundError, missingFileStr);
 	}
 
-	Graphics::PixelFormat format = screenPixelFormat();
-	initGraphics(640, 480, &format);
+	_screenPixelFormat = g_system->getSupportedFormats().front();
+	debug("Using pixel format: %s", _screenPixelFormat.toString().c_str());
+	initGraphics(640, 480, &_screenPixelFormat);
 
 	_system->showMouse(true);
 
@@ -2256,12 +2257,12 @@ Graphics::Surface BladeRunnerEngine::generateThumbnail() const {
 		for (int x = 0; x < thumbnail.w; ++x) {
 			uint8 r, g, b;
 
-			uint16  srcPixel = *(const uint16 *)_surfaceFront.getBasePtr(CLIP(x * 8, 0, _surfaceFront.w - 1), CLIP(y * 8, 0, _surfaceFront.h - 1) );
-			uint16 *dstPixel = (uint16 *)thumbnail.getBasePtr(CLIP(x, 0, thumbnail.w - 1), CLIP(y, 0, thumbnail.h - 1));
+			uint32  srcPixel = *(const uint32 *)_surfaceFront.getBasePtr(CLIP(x * 8, 0, _surfaceFront.w - 1), CLIP(y * 8, 0, _surfaceFront.h - 1));
+			void   *dstPixel = thumbnail.getBasePtr(CLIP(x, 0, thumbnail.w - 1), CLIP(y, 0, thumbnail.h - 1));
 
 			// Throw away alpha channel as it is not needed
 			_surfaceFront.format.colorToRGB(srcPixel, r, g, b);
-			*dstPixel = thumbnail.format.RGBToColor(r, g, b);
+			drawPixel(thumbnail, dstPixel, thumbnail.format.RGBToColor(r, g, b));
 		}
 	}
 
diff --git a/engines/bladerunner/bladerunner.h b/engines/bladerunner/bladerunner.h
index 68c8c9b..8aee6b6 100644
--- a/engines/bladerunner/bladerunner.h
+++ b/engines/bladerunner/bladerunner.h
@@ -184,6 +184,8 @@ public:
 	Actor *_actors[kActorCount];
 	Actor *_playerActor;
 
+	Graphics::PixelFormat _screenPixelFormat;
+
 	Graphics::Surface  _surfaceFront;
 	Graphics::Surface  _surfaceBack;
 
@@ -327,8 +329,21 @@ static inline const Graphics::PixelFormat gameDataPixelFormat() {
 }
 
 static inline const Graphics::PixelFormat screenPixelFormat() {
-	// Should be a format supported by Android port
-	return Graphics::PixelFormat(2, 5, 5, 5, 1, 11, 6, 1, 0);
+	return ((BladeRunnerEngine*)g_engine)->_screenPixelFormat;
+}
+
+static inline void drawPixel(Graphics::Surface &surface, void* dst, uint32 value) {
+	switch (surface.format.bytesPerPixel) {
+		case 1:
+			*(uint8*)dst = (uint8)value;
+			break;
+		case 2:
+			*(uint16*)dst = (uint16)value;
+			break;
+		case 4:
+			*(uint32*)dst = (uint32)value;
+			break;
+	}
 }
 
 void blit(const Graphics::Surface &src, Graphics::Surface &dst);
diff --git a/engines/bladerunner/dialogue_menu.cpp b/engines/bladerunner/dialogue_menu.cpp
index 2a9dcd8..b7183f3 100644
--- a/engines/bladerunner/dialogue_menu.cpp
+++ b/engines/bladerunner/dialogue_menu.cpp
@@ -380,7 +380,7 @@ void DialogueMenu::draw(Graphics::Surface &s) {
 	for (int i = 0; i != _listSize; ++i) {
 		_shapes[1].draw(s, x1, y);
 		_shapes[4].draw(s, x2, y);
-		uint16 color = s.format.RGBToColor((_items[i].colorIntensity / 2) * (256 / 32), (_items[i].colorIntensity / 2) * (256 / 32), _items[i].colorIntensity * (256 / 32));
+		uint32 color = s.format.RGBToColor((_items[i].colorIntensity / 2) * (256 / 32), (_items[i].colorIntensity / 2) * (256 / 32), _items[i].colorIntensity * (256 / 32));
 		_vm->_mainFont->drawString(&s, _items[i].text, x, y, s.w, color);
 		y += kLineHeight;
 	}
@@ -552,13 +552,13 @@ void DialogueMenu::darkenRect(Graphics::Surface &s, int x1, int y1, int x2, int
 	if (x1 < x2 && y1 < y2) {
 		for (int y = y1; y != y2; ++y) {
 			for (int x = x1; x != x2; ++x) {
-				uint16 *p = (uint16 *)s.getBasePtr(CLIP(x, 0, s.w - 1), CLIP(y, 0, s.h - 1));
+				void *p = s.getBasePtr(CLIP(x, 0, s.w - 1), CLIP(y, 0, s.h - 1));
 				uint8 r, g, b;
-				s.format.colorToRGB(*p, r, g, b);
+				s.format.colorToRGB(*(uint32*)p, r, g, b);
 				r /= 4;
 				g /= 4;
 				b /= 4;
-				*p = s.format.RGBToColor(r, g, b);
+				drawPixel(s, p, s.format.RGBToColor(r, g, b));
 			}
 		}
 	}
diff --git a/engines/bladerunner/font.cpp b/engines/bladerunner/font.cpp
index 68e0408..8ab205e 100644
--- a/engines/bladerunner/font.cpp
+++ b/engines/bladerunner/font.cpp
@@ -92,7 +92,6 @@ void Font::reset() {
 	_screenHeight = 0;
 	_spacing = 0;
 	_useFontColor = false;
-	_intersperse = 0;
 
 	_characters.clear();
 }
@@ -118,13 +117,9 @@ void Font::drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 col
 		return;
 	}
 
-	uint16 *dstPtr = (uint16 *)dst->getBasePtr(CLIP(x + _characters[characterIndex].x, 0, dst->w - 1), CLIP(y + _characters[characterIndex].y, 0, dst->h - 1));
 	uint16 *srcPtr = &_data[_characters[characterIndex].dataOffset];
 	int width = _characters[characterIndex].width;
 	int height = _characters[characterIndex].height;
-	if (_intersperse && y & 1) {
-		dstPtr += dst->pitch / 2;
-	}
 
 	int endY = height + y - 1;
 	int currentY = y;
@@ -147,23 +142,17 @@ void Font::drawChar(Graphics::Surface *dst, uint32 chr, int x, int y, uint32 col
 			uint8 a, r, g, b;
 			gameDataPixelFormat().colorToARGB(*srcPtr, a, r, g, b);
 			if (!a) { // Alpha is inversed
+				uint32 outColor = color;
 				if (_useFontColor) {
 					// Ignore the alpha in the output as it is inversed in the input
-					*dstPtr = dst->format.RGBToColor(r, g, b);
-				} else {
-					*dstPtr = (uint16)color;
+					outColor = dst->format.RGBToColor(r, g, b);
 				}
+				void *dstPtr = dst->getBasePtr(CLIP(currentX + _characters[characterIndex].x, 0, dst->w - 1), CLIP(currentY + _characters[characterIndex].y, 0, dst->h - 1));
+				drawPixel(*dst, dstPtr, outColor);
 			}
-			dstPtr++;
 			srcPtr++;
 			currentX++;
 		}
-		dstPtr += dst->pitch / 2 - width;
-		if (_intersperse) {
-			srcPtr += width;
-			dstPtr += dst->pitch / 2;
-			currentY++;
-		}
 		currentY++;
 	}
 }
diff --git a/engines/bladerunner/font.h b/engines/bladerunner/font.h
index 38fd305..b874231 100644
--- a/engines/bladerunner/font.h
+++ b/engines/bladerunner/font.h
@@ -55,7 +55,6 @@ class Font : public Graphics::Font {
 	int                      _screenHeight;
 	int                      _spacing;
 	bool                     _useFontColor;
-	int                      _intersperse;
 
 public:
 	~Font();
diff --git a/engines/bladerunner/outtake.cpp b/engines/bladerunner/outtake.cpp
index cb54816..ba02bda 100644
--- a/engines/bladerunner/outtake.cpp
+++ b/engines/bladerunner/outtake.cpp
@@ -36,7 +36,7 @@ namespace BladeRunner {
 
 OuttakePlayer::OuttakePlayer(BladeRunnerEngine *vm) {
 	_vm = vm;
-	_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, screenPixelFormat());
+	_surfaceVideo.create(_vm->_surfaceBack.w, _vm->_surfaceBack.h, _vm->_surfaceBack.format);
 }
 
 OuttakePlayer::~OuttakePlayer() {
diff --git a/engines/bladerunner/savefile.cpp b/engines/bladerunner/savefile.cpp
index cf55cb0..1ea1a88 100644
--- a/engines/bladerunner/savefile.cpp
+++ b/engines/bladerunner/savefile.cpp
@@ -150,7 +150,7 @@ bool SaveFileManager::readHeader(Common::SeekableReadStream &in, SaveFileHeader
 		s.read(thumbnailData, kThumbnailSize);
 
 		header._thumbnail->init(80, 60, 160, thumbnailData, gameDataPixelFormat());
-		header._thumbnail->convertToInPlace(screenPixelFormat());
+
 		s.seek(pos);
 	}
 
diff --git a/engines/bladerunner/shape.cpp b/engines/bladerunner/shape.cpp
index de7a572..60fa869 100644
--- a/engines/bladerunner/shape.cpp
+++ b/engines/bladerunner/shape.cpp
@@ -112,11 +112,11 @@ void Shape::draw(Graphics::Surface &surface, int x, int y) const {
 
 			uint8 a, r, g, b;
 			gameDataPixelFormat().colorToARGB(shpColor, a, r, g, b);
-			// Ignore the alpha in the output as it is inversed in the input
-			uint16 outColor = (uint16)surface.format.RGBToColor(r, g, b);
 
 			if (!a) {
-				*(uint16 *)(surface.getBasePtr(CLIP(dst_x + xi, 0, surface.w - 1), CLIP(dst_y + yi, 0, surface.h - 1))) = outColor;
+				// Ignore the alpha in the output as it is inversed in the input
+				void *dstPtr = surface.getBasePtr(CLIP(dst_x + xi, 0, surface.w - 1), CLIP(dst_y + yi, 0, surface.h - 1));
+				drawPixel(surface, dstPtr, surface.format.RGBToColor(r, g, b));
 			}
 		}
 		src_p += 2 * (_width - rect_w);
diff --git a/engines/bladerunner/slice_animations.cpp b/engines/bladerunner/slice_animations.cpp
index 55a3d13..d9f44b9 100644
--- a/engines/bladerunner/slice_animations.cpp
+++ b/engines/bladerunner/slice_animations.cpp
@@ -46,6 +46,8 @@ bool SliceAnimations::open(const Common::String &name) {
 
 	_palettes.resize(_paletteCount);
 
+	Graphics::PixelFormat screenFormat = screenPixelFormat();
+
 	for (uint32 i = 0; i != _paletteCount; ++i) {
 		for (uint32 j = 0; j != 256; ++j) {
 			uint8 color_r = file.readByte();
@@ -57,8 +59,7 @@ bool SliceAnimations::open(const Common::String &name) {
 			_palettes[i].color[j].b = color_b;
 
 			const int bladeToScummVmConstant = 256 / 32; // 5 bits to 8 bits
-			uint16 rgb555 = screenPixelFormat().RGBToColor(color_r * bladeToScummVmConstant, color_g * bladeToScummVmConstant, color_b * bladeToScummVmConstant);
-			_palettes[i].color555[j] = rgb555;
+			_palettes[i].value[j] = screenFormat.RGBToColor(color_r * bladeToScummVmConstant, color_g * bladeToScummVmConstant, color_b * bladeToScummVmConstant);;
 		}
 	}
 
diff --git a/engines/bladerunner/slice_animations.h b/engines/bladerunner/slice_animations.h
index 79dd646..d9726b5 100644
--- a/engines/bladerunner/slice_animations.h
+++ b/engines/bladerunner/slice_animations.h
@@ -50,7 +50,7 @@ class SliceAnimations {
 	};
 
 	struct Palette {
-		uint16 color555[256];
+		uint32 value[256];
 		Color256 color[256];
 
 	//	uint16 &operator[](size_t i) { return color555[i]; }
diff --git a/engines/bladerunner/slice_renderer.cpp b/engines/bladerunner/slice_renderer.cpp
index f797d13..d21fca6 100644
--- a/engines/bladerunner/slice_renderer.cpp
+++ b/engines/bladerunner/slice_renderer.cpp
@@ -468,8 +468,7 @@ void SliceRenderer::drawInWorld(int animationId, int animationFrame, Vector3 pos
 		_setEffectColor.b = setEffectColor.b * 31.0f * 65536.0f;
 
 		if (frameY >= 0 && frameY < surface.h) {
-			// No need to CLIP frameY here in getBasePtr(), since it is within [0, surface.h - 1]
-			drawSlice((int)sliceLine, true, (uint16 *)surface.getBasePtr(0, frameY), zBufferLinePtr, frameY);
+			drawSlice((int)sliceLine, true, frameY, surface, zBufferLinePtr);
 		}
 
 		sliceLineIterator.advance();
@@ -531,15 +530,14 @@ void SliceRenderer::drawOnScreen(int animationId, int animationFrame, int screen
 	while (currentSlice < _frameSliceCount) {
 		if (currentY >= 0 && currentY < surface.h) {
 			memset(lineZbuffer, 0xFF, 640 * 2);
-			// No need to CLIP currentY here in getBasePtr(), since it is within [0, surface.h - 1]
-			drawSlice(currentSlice, false, (uint16 *)surface.getBasePtr(0, currentY), lineZbuffer, currentY);
+			drawSlice(currentSlice, false, currentY, surface, lineZbuffer);
 			currentSlice += sliceStep;
 			currentY--;
 		}
 	}
 }
 
-void SliceRenderer::drawSlice(int slice, bool advanced, uint16 *frameLinePtr, uint16 *zbufLinePtr, int y) {
+void SliceRenderer::drawSlice(int slice, bool advanced, int y, Graphics::Surface &surface, uint16 *zbufferLine) {
 	if (slice < 0 || (uint32)slice >= _frameSliceCount) {
 		return;
 	}
@@ -554,6 +552,7 @@ void SliceRenderer::drawSlice(int slice, bool advanced, uint16 *frameLinePtr, ui
 
 	uint32 polyCount = READ_LE_UINT32(p);
 	p += 4;
+
 	while (polyCount--) {
 		uint32 vertexCount = READ_LE_UINT32(p);
 		p += 4;
@@ -573,7 +572,7 @@ void SliceRenderer::drawSlice(int slice, bool advanced, uint16 *frameLinePtr, ui
 				int vertexZ = (_m21lookup[p[0]] + _m22lookup[p[1]] + _m23) / 64;
 
 				if (vertexZ >= 0 && vertexZ < 65536) {
-					int color555 = palette.color555[p[2]];
+					uint32 outColor = palette.value[p[2]];
 					if (advanced) {
 						Color256 aescColor = { 0, 0, 0 };
 						_screenEffects->getColor(&aescColor, vertexX, y, vertexZ);
@@ -584,12 +583,15 @@ void SliceRenderer::drawSlice(int slice, bool advanced, uint16 *frameLinePtr, ui
 						color.b = ((int)(_setEffectColor.b + _lightsColor.b * color.b) / 65536) + aescColor.b;
 
 						int bladeToScummVmConstant = 256 / 32;
-						color555 = _pixelFormat.RGBToColor(CLIP(color.r * bladeToScummVmConstant, 0, 255), CLIP(color.g * bladeToScummVmConstant, 0, 255), CLIP(color.b * bladeToScummVmConstant, 0, 255));
+						outColor = _pixelFormat.RGBToColor(CLIP(color.r * bladeToScummVmConstant, 0, 255), CLIP(color.g * bladeToScummVmConstant, 0, 255), CLIP(color.b * bladeToScummVmConstant, 0, 255));
 					}
+
 					for (int x = previousVertexX; x != vertexX; ++x) {
-						if (vertexZ < zbufLinePtr[x]) {
-							frameLinePtr[x] = color555;
-							zbufLinePtr[x] = (uint16)vertexZ;
+						if (vertexZ < zbufferLine[x]) {
+							zbufferLine[x] = (uint16)vertexZ;
+
+							void *dstPtr = surface.getBasePtr(CLIP(x, 0, surface.w - 1), CLIP(y, 0, surface.h - 1));
+							drawPixel(surface, dstPtr, outColor);
 						}
 					}
 				}
@@ -723,17 +725,18 @@ void SliceRenderer::drawShadowPolygon(int transparency, Graphics::Surface &surfa
 
 		for (int x = MIN(xMin, xMax); x < MAX(xMin, xMax); ++x) {
 			uint16 z = zbuffer[x + y * 640];
-			uint16 *pixel = (uint16*)surface.getBasePtr(CLIP(x, 0, surface.w - 1), CLIP(y, 0, surface.h - 1));
+			void *pixel = surface.getBasePtr(CLIP(x, 0, surface.w - 1), CLIP(y, 0, surface.h - 1));
 
 			if (z >= zMin) {
 				int index = (x & 3) + ((y & 3) << 2);
 				if (transparency - ditheringFactor[index] <= 0) {
 					uint8 r, g, b;
-					surface.format.colorToRGB(*pixel, r, g, b);
+					surface.format.colorToRGB(*(uint32*)pixel, r, g, b);
 					r *= 0.75f;
 					g *= 0.75f;
 					b *= 0.75f;
-					*pixel = surface.format.RGBToColor(r, g, b);
+
+					drawPixel(surface, pixel, surface.format.RGBToColor(r, g, b));
 				}
 			}
 		}
diff --git a/engines/bladerunner/slice_renderer.h b/engines/bladerunner/slice_renderer.h
index 2e36171..85b7d9f 100644
--- a/engines/bladerunner/slice_renderer.h
+++ b/engines/bladerunner/slice_renderer.h
@@ -114,7 +114,7 @@ private:
 	Matrix3x2 calculateFacingRotationMatrix();
 	void loadFrame(int animation, int frame);
 
-	void drawSlice(int slice, bool advanced, uint16 *frameLinePtr, uint16 *zbufLinePtr, int y);
+	void drawSlice(int slice, bool advanced, int y, Graphics::Surface &surface, uint16 *zbufferLine);
 	void drawShadowInWorld(int transparency, Graphics::Surface &surface, uint16 *zbuffer);
 	void drawShadowPolygon(int transparency, Graphics::Surface &surface, uint16 *zbuffer);
 };
diff --git a/engines/bladerunner/ui/esper.cpp b/engines/bladerunner/ui/esper.cpp
index bb97ae3..5f49830 100644
--- a/engines/bladerunner/ui/esper.cpp
+++ b/engines/bladerunner/ui/esper.cpp
@@ -672,7 +672,7 @@ void ESPER::drawPhotoOpening(Graphics::Surface &surface) {
 		_timePhotoOpeningNextDiff  = 20u;
 		_timePhotoOpeningNextStart = timeNow;
 	}
-	copyImageScale(&_surfacePhoto, _viewport, &surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
+	copyImageScale(_surfacePhoto, _viewport, surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
 
 	surface.hLine(_screen.left,           _photoOpeningHeight,     _screen.right  - 1, surface.format.RGBToColor(0, 248, 0));
 	surface.vLine(_photoOpeningWidth,     _screen.top,             _screen.bottom - 1, surface.format.RGBToColor(0, 248, 0));
@@ -830,12 +830,12 @@ void ESPER::drawPhotoSharpening(Graphics::Surface &surface) {
 
 	if (_regionSelectedAck && !_regions[_regionSelected].name.empty()) {
 		_vqaPlayerPhoto->update(true, false);
-		copyImageBlur(&_surfaceViewport, Common::Rect(0, 0, 299, 263), &surface, _screen, _blur);
-		copyImageBlit(&_surfaceViewport, Common::Rect(0, 0, 0, 0), &surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
+		copyImageBlur(_surfaceViewport, Common::Rect(0, 0, 299, 263), surface, _screen, _blur);
+		copyImageBlit(_surfaceViewport, Common::Rect(0, 0, 0, 0), surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
 	} else {
 		drawPhoto(surface);
-		copyImageScale(&_surfacePhoto, _viewport, &_surfaceViewport, Common::Rect(0, 0, _screen.width(), _screen.height()));
-		copyImageBlit(&_surfaceViewport, Common::Rect(0, 0, 0, 0), &surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
+		copyImageScale(_surfacePhoto, _viewport, _surfaceViewport, Common::Rect(0, 0, _screen.width(), _screen.height()));
+		copyImageBlit(_surfaceViewport, Common::Rect(0, 0, 0, 0), surface, Common::Rect(_screen.left, _screen.top, _photoOpeningWidth, _photoOpeningHeight));
 
 	}
 	drawGrid(surface);
@@ -921,7 +921,7 @@ void ESPER::drawVideoZooming(Graphics::Surface &surface) {
 		flashViewport();
 	}
 
-	copyImageBlur(&_surfaceViewport, Common::Rect(0, 0, 299, 263), &surface, _screen, _blur);
+	copyImageBlur(_surfaceViewport, Common::Rect(0, 0, 299, 263), surface, _screen, _blur);
 	drawGrid(surface);
 }
 
@@ -955,7 +955,7 @@ void ESPER::drawVideoZoomOut(Graphics::Surface &surface) {
 	if (flash) {
 		flashViewport();
 	}
-	copyImageBlit(&_surfaceViewport, Common::Rect(0, 0, 0, 0), &surface, _screen);
+	copyImageBlit(_surfaceViewport, Common::Rect(0, 0, 0, 0), surface, _screen);
 	drawGrid(surface);
 	// unsigned difference is intentional
 	if (timeNow - _timeZoomNextStart > _timeZoomNextDiff && _vqaLastFrame <= 0) {
@@ -972,7 +972,7 @@ void ESPER::drawVideoZoomOut(Graphics::Surface &surface) {
 }
 
 void ESPER::drawPhoto(Graphics::Surface &surface) {
-	copyImageBlur(&_surfacePhoto, _viewport, &surface, _screen, _blur);
+	copyImageBlur(_surfacePhoto, _viewport, surface, _screen, _blur);
 }
 
 void ESPER::drawGrid(Graphics::Surface &surface) {
@@ -986,7 +986,7 @@ void ESPER::drawGrid(Graphics::Surface &surface) {
 }
 
 void ESPER::drawPhotoWithGrid(Graphics::Surface &surface) {
-	copyImageScale(&_surfacePhoto, _viewport, &surface, _screen);
+	copyImageScale(_surfacePhoto, _viewport, surface, _screen);
 	drawGrid(surface);
 }
 
@@ -1049,7 +1049,7 @@ void ESPER::drawSelection(Graphics::Surface &surface, bool crosshair, int style)
 
 void ESPER::drawVideoFrame(Graphics::Surface &surface) {
 	_vqaPlayerPhoto->update(true, false);
-	copyImageBlit(&_surfaceViewport, Common::Rect(0, 0, 0, 0), &surface, _screen);
+	copyImageBlit(_surfaceViewport, Common::Rect(0, 0, 0, 0), surface, _screen);
 }
 
 void ESPER::drawTextCoords(Graphics::Surface &surface) {
@@ -1148,16 +1148,18 @@ void ESPER::drawMouse(Graphics::Surface &surface) {
 }
 
 void ESPER::flashViewport() {
-	uint16 *ptr = (uint16 *)_surfaceViewport.getPixels();
-	for (int i = 0; i < _surfaceViewport.w * _surfaceViewport.h; ++i, ++ptr) {
-		uint8 r, g, b;
-		_surfaceViewport.format.colorToRGB(*ptr, r, g, b);
-		b *= 2;
-		*ptr = _surfaceViewport.format.RGBToColor(r, g, b);
+	for (int y = 0; y < _surfaceViewport.h; ++y) {
+		for (int x = 0; x < _surfaceViewport.w; ++x) {
+			uint8 r, g, b;
+			void *ptr = _surfaceViewport.getBasePtr(x, y);
+			_surfaceViewport.format.colorToRGB(*(uint32*)ptr, r, g, b);
+			b *= 2;
+			drawPixel(_surfaceViewport, ptr, _surfaceViewport.format.RGBToColor(r, g, b));
+		}
 	}
 }
 
-void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect) {
+void ESPER::copyImageScale(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect) {
 	if (_flash) {
 		playSound(kSfxBR031_1P, 25);
 	}
@@ -1175,22 +1177,19 @@ void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphic
 			int srcX = srcRect.left;
 			int srcXCounter = 0;
 			for (int dstX = dstRect.left; dstX < dstRect.right; ++dstX) {
-				srcX = CLIP(srcX, 0, src->w - 1);
-				srcY = CLIP(srcY, 0, src->h - 1);
-
-				dstX = CLIP(dstX, 0, dst->w - 1);
-				dstY = CLIP(dstY, 0, dst->h - 1);
+				srcX = CLIP(srcX, 0, src.w - 1);
+				srcY = CLIP(srcY, 0, src.h - 1);
 
-				uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
-				uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
+				dstX = CLIP(dstX, 0, dst.w - 1);
+				dstY = CLIP(dstY, 0, dst.h - 1);
 
 				uint8 r, g, b;
-				src->format.colorToRGB(*srcPtr, r, g, b);
+				src.format.colorToRGB(*(uint32*)src.getBasePtr(srcX, srcY), r, g, b);
 				if (_flash) {
 					// add blue-ish tint
 					b *= 2;
 				}
-				*dstPtr = dst->format.RGBToColor(r, g, b);
+				drawPixel(dst, dst.getBasePtr(dstX, dstY), dst.format.RGBToColor(r, g, b));
 
 				srcX += srcDstWidthRatio;
 				srcXCounter += srcDstWidthRest;
@@ -1221,22 +1220,19 @@ void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphic
 					++srcX;
 				}
 
-				srcX = CLIP(srcX, 0, src->w - 1);
-				srcY = CLIP(srcY, 0, src->h - 1);
-
-				dstX = CLIP(dstX, 0, dst->w - 1);
-				dstY = CLIP(dstY, 0, dst->h - 1);
+				srcX = CLIP(srcX, 0, src.w - 1);
+				srcY = CLIP(srcY, 0, src.h - 1);
 
-				uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
-				uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
+				dstX = CLIP(dstX, 0, dst.w - 1);
+				dstY = CLIP(dstY, 0, dst.h - 1);
 
 				uint8 r, g, b;
-				src->format.colorToRGB(*srcPtr, r, g, b);
+				src.format.colorToRGB(*(uint32*)src.getBasePtr(srcX, srcY), r, g, b);
 				if (_flash) {
 					// add blue-ish tint
 					b *= 2;
 				}
-				*dstPtr = dst->format.RGBToColor(r, g, b);
+				drawPixel(dst, dst.getBasePtr(dstX, dstY), dst.format.RGBToColor(r, g, b));
 			}
 
 			srcYCounter += srcRect.height();
@@ -1249,7 +1245,7 @@ void ESPER::copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphic
 	_flash = false;
 }
 
-void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect, float blur) {
+void ESPER::copyImageBlur(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect, float blur) {
 	if (_flash) {
 		playSound(kSfxBR031_1P, 25);
 	}
@@ -1289,22 +1285,19 @@ void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics
 					int skipX = 0;
 					while (dstX < dstRect.right && skipX < skipXMax) {
 
-						srcX = CLIP(srcX, 0, src->w - 1);
-						srcY = CLIP(srcY, 0, src->h - 1);
+						srcX = CLIP(srcX, 0, src.w - 1);
+						srcY = CLIP(srcY, 0, src.h - 1);
 
-						dstX = CLIP(dstX, 0, dst->w - 1);
-						dstY = CLIP(dstY, 0, dst->h - 1);
-
-						uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
-						uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
+						dstX = CLIP(dstX, 0, dst.w - 1);
+						dstY = CLIP(dstY, 0, dst.h - 1);
 
 						uint8 r, g, b;
-						src->format.colorToRGB(*srcPtr, r, g, b);
+						src.format.colorToRGB(*(uint32*)src.getBasePtr(srcX, srcY), r, g, b);
 						if (_flash) {
 							// add blue-ish tint
 							b *= 2;
 						}
-						*dstPtr = dst->format.RGBToColor(r, g, b);
+						drawPixel(dst, dst.getBasePtr(dstX, dstY), dst.format.RGBToColor(r, g, b));
 
 						++dstX;
 						++skipX;
@@ -1362,22 +1355,19 @@ void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics
 							srcX += 1; // bug in original game? Is using 1 instead of skipX as for Y
 						}
 
-						srcX = CLIP(srcX, 0, src->w - 1);
-						srcY = CLIP(srcY, 0, src->h - 1);
-
-						dstX = CLIP(dstX, 0, dst->w - 1);
-						dstY = CLIP(dstY, 0, dst->h - 1);
+						srcX = CLIP(srcX, 0, src.w - 1);
+						srcY = CLIP(srcY, 0, src.h - 1);
 
-						uint16 *srcPtr = (uint16 *)src->getBasePtr(srcX, srcY);
-						uint16 *dstPtr = (uint16 *)dst->getBasePtr(dstX, dstY);
+						dstX = CLIP(dstX, 0, dst.w - 1);
+						dstY = CLIP(dstY, 0, dst.h - 1);
 
 						uint8 r, g, b;
-						src->format.colorToRGB(*srcPtr, r, g, b);
+						src.format.colorToRGB(*(uint32*)src.getBasePtr(srcX, srcY), r, g, b);
 						if (_flash) {
 							// add blue-ish tint
 							b *= 2;
 						}
-						*dstPtr = dst->format.RGBToColor(r, g, b);
+						drawPixel(dst, dst.getBasePtr(dstX, dstY), dst.format.RGBToColor(r, g, b));
 
 						++dstX;
 						++skipX;
@@ -1398,12 +1388,12 @@ void ESPER::copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics
 	_flash = false;
 }
 
-void ESPER::copyImageBlit(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect) {
+void ESPER::copyImageBlit(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect) {
 	for (int y = 0; y < dstRect.height(); ++y) {
 		for (int x = 0; x < dstRect.width(); ++x) {
-			uint16 *srcPtr = (uint16 *)src->getBasePtr(CLIP(srcRect.left + x, 0, src->w - 1), CLIP(srcRect.top + y, 0, src->h - 1));
-			uint16 *dstPtr = (uint16 *)dst->getBasePtr(CLIP(dstRect.left + x, 0, dst->w - 1), CLIP(dstRect.top + y, 0, dst->h - 1));
-			*dstPtr = *srcPtr;
+			uint8 r, g, b;
+			src.format.colorToRGB(*(uint32*)src.getBasePtr(CLIP(srcRect.left + x, 0, src.w - 1), CLIP(srcRect.top + y, 0, src.h - 1)), r, g, b);
+			drawPixel(dst, dst.getBasePtr(CLIP(dstRect.left + x, 0, dst.w - 1), CLIP(dstRect.top + y, 0, dst.h - 1)), dst.format.RGBToColor(r, g, b));
 		}
 	}
 }
diff --git a/engines/bladerunner/ui/esper.h b/engines/bladerunner/ui/esper.h
index 8360864..6feb2ca 100644
--- a/engines/bladerunner/ui/esper.h
+++ b/engines/bladerunner/ui/esper.h
@@ -247,9 +247,9 @@ private:
 
 	void flashViewport();
 
-	void copyImageScale(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect);
-	void copyImageBlur(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect, float u);
-	void copyImageBlit(Graphics::Surface *src, Common::Rect srcRect, Graphics::Surface *dst, Common::Rect dstRect);
+	void copyImageScale(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect);
+	void copyImageBlur(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect, float u);
+	void copyImageBlit(Graphics::Surface &src, Common::Rect srcRect, Graphics::Surface &dst, Common::Rect dstRect);
 
 	void tickSound();
 	void tickScroll();
diff --git a/engines/bladerunner/ui/kia.cpp b/engines/bladerunner/ui/kia.cpp
index ed5dabc..a40a786 100644
--- a/engines/bladerunner/ui/kia.cpp
+++ b/engines/bladerunner/ui/kia.cpp
@@ -601,6 +601,7 @@ void KIA::playPhotograph(int photographId) {
 
 void KIA::playImage(const Graphics::Surface &image) {
 	_playerImage.copyFrom(image);
+	_playerImage.convertToInPlace(screenPixelFormat());
 }
 
 void KIA::mouseDownCallback(int buttonId, void *callbackData) {
diff --git a/engines/bladerunner/ui/kia_section_diagnostic.cpp b/engines/bladerunner/ui/kia_section_diagnostic.cpp
index 662aef3..a592868 100644
--- a/engines/bladerunner/ui/kia_section_diagnostic.cpp
+++ b/engines/bladerunner/ui/kia_section_diagnostic.cpp
@@ -31,7 +31,7 @@
 
 namespace BladeRunner {
 
-const Color256  KIASectionDiagnostic::kTextColors[] = {
+const Color256 KIASectionDiagnostic::kTextColors[] = {
 	{ 0, 0, 0 },
 	{ 16, 8, 8 },
 	{ 32, 24, 8 },
diff --git a/engines/bladerunner/ui/ui_slider.cpp b/engines/bladerunner/ui/ui_slider.cpp
index 7a88575..18538e9 100644
--- a/engines/bladerunner/ui/ui_slider.cpp
+++ b/engines/bladerunner/ui/ui_slider.cpp
@@ -115,7 +115,7 @@ void UISlider::draw(Graphics::Surface &surface) {
 				colorIndex = 3;
 			}
 
-			uint16 color = surface.format.RGBToColor(kColors[colorIndex].r, kColors[colorIndex].g, kColors[colorIndex].b);
+			uint32 color = surface.format.RGBToColor(kColors[colorIndex].r, kColors[colorIndex].g, kColors[colorIndex].b);
 			if ((striding + x) & 1 || x == sliderX) {
 				color = surface.format.RGBToColor(0, 0, 0);
 			}
diff --git a/engines/bladerunner/ui/vk.cpp b/engines/bladerunner/ui/vk.cpp
index 5fbf763..06056c3 100644
--- a/engines/bladerunner/ui/vk.cpp
+++ b/engines/bladerunner/ui/vk.cpp
@@ -772,8 +772,8 @@ void VK::drawNeedle(Graphics::Surface &surface) {
 
 	float colorIntensity = MIN(78.0f, _needleValue + 39.0f) / 78.0f;
 
-	uint16 color1 = surface.format.RGBToColor(56 - 48 * colorIntensity, 144 - 64 * colorIntensity, 184 - 96 * colorIntensity);
-	uint16 color2 = surface.format.RGBToColor(56 - 24 * colorIntensity, 144 - 32 * colorIntensity, 184 - 48 * colorIntensity);
+	uint32 color1 = surface.format.RGBToColor(56 - 48 * colorIntensity, 144 - 64 * colorIntensity, 184 - 96 * colorIntensity);
+	uint32 color2 = surface.format.RGBToColor(56 - 24 * colorIntensity, 144 - 32 * colorIntensity, 184 - 48 * colorIntensity);
 
 	surface.drawLine(203, 324, x - 2, y,     color1);
 	surface.drawLine(203, 324, x + 2, y,     color1);
diff --git a/engines/bladerunner/vqa_decoder.cpp b/engines/bladerunner/vqa_decoder.cpp
index cb7028f..d325057 100644
--- a/engines/bladerunner/vqa_decoder.cpp
+++ b/engines/bladerunner/vqa_decoder.cpp
@@ -835,11 +835,11 @@ void VQADecoder::VQAVideoTrack::VPTRWriteBlock(Graphics::Surface *surface, unsig
 
 				uint8 a, r, g, b;
 				gameDataPixelFormat().colorToARGB(vqaColor, a, r, g, b);
-				// Ignore the alpha in the output as it is inversed in the input
-				uint16 outColor = (uint16)surface->format.RGBToColor(r, g, b);
 
 				if (!(alpha && a)) {
-					*(uint16 *)(surface->getBasePtr(CLIP(dst_x + x, (uint32)0, (uint32)(surface->w - 1)), CLIP(dst_y + y, (uint32)0, (uint32)(surface->h - 1)))) = outColor;
+					void* dstPtr = surface->getBasePtr(CLIP(dst_x + x, (uint32)0, (uint32)(surface->w - 1)), CLIP(dst_y + y, (uint32)0, (uint32)(surface->h - 1)));
+					// Ignore the alpha in the output as it is inversed in the input
+					drawPixel(*surface, dstPtr, surface->format.RGBToColor(r, g, b));
 				}
 			}
 		}





More information about the Scummvm-git-logs mailing list