[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

Re: [pygame] BUG: Segfault when rotating a HWSURFACE



On Mon, May 14, 2007 at 02:52:38PM -0600, John Krukoff wrote:
> import sys, pygame
> 
> pygame.init( )
> screen = pygame.display.set_mode( ( 640, 480 ), pygame.HWSURFACE | pygame.DOUBLEBUF | pygame.FULLSCREEN )
> hwSurface = pygame.surface.Surface( ( 64, 64 ), pygame.HWSURFACE )
> hwSurface.fill( ( 0, 0, 0 ) )
> print 'Should show 1 to indicate hardware surface:', hwSurface.get_flags( )
> # Crash occurs on next line.
> rotated = pygame.transform.rotate( hwSurface, 1 )
> print 'Will never be displayed.'
> sys.exit( 0 )

I can reproduce this with the latest svn although I have to set an environment
variable to get the directx backend (with actual hardware surfaces). Here is a
patch to fix it:

Index: src/transform.c
===================================================================
--- src/transform.c	(revision 1003)
+++ src/transform.c	(working copy)
@@ -528,6 +528,7 @@
 	}
 	else
 	{
+		SDL_LockSurface(surf);
 		switch(surf->format->BytesPerPixel)
 		{
 		case 1: bgcolor = *(Uint8*)surf->pixels; break;
@@ -540,6 +541,7 @@
 			bgcolor = (((Uint8*)surf->pixels)[2]) + (((Uint8*)surf->pixels)[1]<<8) + (((Uint8*)surf->pixels)[0]<<16);
 #endif
 		}
+		SDL_UnlockSurface(surf);
 		bgcolor &= ~surf->format->Amask;
 	}


Whilst I was doing this I found a small regression building movie.c on Windows
with the Microsoft compiler. Here is a patch to fix it:

Index: src/movie.c
===================================================================
--- src/movie.c	(revision 1003)
+++ src/movie.c	(working copy)
@@ -148,8 +148,8 @@
 
 		if(posobj == NULL)
 		{
+			SMPEG_Info info;
                         Py_BEGIN_ALLOW_THREADS
-			SMPEG_Info info;
 			SMPEG_getinfo(movie, &info);
 			SMPEG_scaleXY(movie, info.width, info.height);
                         Py_END_ALLOW_THREADS
@@ -157,8 +157,8 @@
 		}
 		else if(TwoIntsFromObj(posobj, &x, &y))
 		{
+			SMPEG_Info info;
                         Py_BEGIN_ALLOW_THREADS
-			SMPEG_Info info;
 			SMPEG_getinfo(movie, &info);
 			SMPEG_scaleXY(movie, info.width, info.height);
                         Py_END_ALLOW_THREADS

Hope this helps,

regards,
John.