[Scummvm-cvs-logs] scummvm master -> f5e10f33f59dd21c82768dd12dd13cc9e021c760

lordhoto lordhoto at gmail.com
Thu Feb 24 05:15:01 CET 2011


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:
f5e10f33f5 OPENGL: Properly setup pixel data alignment.


Commit: f5e10f33f59dd21c82768dd12dd13cc9e021c760
    https://github.com/scummvm/scummvm/commit/f5e10f33f59dd21c82768dd12dd13cc9e021c760
Author: Johannes Schickel (lordhoto at scummvm.org)
Date: 2011-02-23T20:11:00-08:00

Commit Message:
OPENGL: Properly setup pixel data alignment.

If we do not do this, we might end up with a default alignment of 4, which will
fail (as in the graphics will be messed up) in case the screen resolution is
not divisible by 4.

Thanks to digitall for noticing this problem and finding out about
GL_UNPACK_ALIGNMENT.

Changed paths:
    backends/graphics/opengl/opengl-graphics.cpp



diff --git a/backends/graphics/opengl/opengl-graphics.cpp b/backends/graphics/opengl/opengl-graphics.cpp
index beac2f6..d1804e7 100644
--- a/backends/graphics/opengl/opengl-graphics.cpp
+++ b/backends/graphics/opengl/opengl-graphics.cpp
@@ -341,9 +341,9 @@ void OpenGLGraphicsManager::copyRectToScreen(const byte *buf, int pitch, int x,
 
 	// Copy buffer data to game screen internal buffer
 	const byte *src = buf;
-	byte *dst = (byte *)_screenData.pixels + y * _screenData.pitch;
+	byte *dst = (byte *)_screenData.pixels + y * _screenData.pitch + x * _screenData.bytesPerPixel;
 	for (int i = 0; i < h; i++) {
-		memcpy(dst + x * _screenData.bytesPerPixel, src, w * _screenData.bytesPerPixel);
+		memcpy(dst, src, w * _screenData.bytesPerPixel);
 		src += pitch;
 		dst += _screenData.pitch;
 	}
@@ -1063,6 +1063,8 @@ void OpenGLGraphicsManager::loadTextures() {
 		delete _gameTexture;
 #endif
 
+	uint gameScreenBPP = 0;
+
 	if (!_gameTexture) {
 		byte bpp;
 		GLenum intformat;
@@ -1073,6 +1075,7 @@ void OpenGLGraphicsManager::loadTextures() {
 #else
 		getGLPixelFormat(Graphics::PixelFormat::createFormatCLUT8(), bpp, intformat, format, type);
 #endif
+		gameScreenBPP = bpp;
 		_gameTexture = new GLTexture(bpp, intformat, format, type);
 	} else
 		_gameTexture->refresh();
@@ -1119,6 +1122,14 @@ void OpenGLGraphicsManager::loadTextures() {
 	_overlayNeedsRedraw = true;
 	_cursorNeedsRedraw = true;
 
+	// We need to setup a proper unpack alignment value here, else we will
+	// get problems with the texture updates, in case the surface data is
+	// not properly aligned.
+	// For now we use the gcd of the game screen format and 2, since 2 is
+	// the BPP value for the overlay and the OSD.
+	if (gameScreenBPP)
+		glPixelStorei(GL_UNPACK_ALIGNMENT, Common::gcd<uint>(gameScreenBPP, 2));
+
 #ifdef USE_OSD
 	if (!_osdTexture)
 		_osdTexture = new GLTexture(2, GL_RGBA, GL_RGBA, GL_UNSIGNED_SHORT_5_5_5_1);






More information about the Scummvm-git-logs mailing list