diff src/video/SDL_stretch.c @ 894:1d1a823904d8

Don't crash if the stretch routines are used on hardware surfaces
author Sam Lantinga <slouken@libsdl.org>
date Sun, 16 May 2004 21:08:55 +0000
parents b8d311d90021
children 10b3fb28c86b
line wrap: on
line diff
--- a/src/video/SDL_stretch.c	Sun May 16 19:02:19 2004 +0000
+++ b/src/video/SDL_stretch.c	Sun May 16 21:08:55 2004 +0000
@@ -181,6 +181,8 @@
 int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect,
                     SDL_Surface *dst, SDL_Rect *dstrect)
 {
+	int src_locked;
+	int dst_locked;
 	int pos, inc;
 	int dst_width;
 	int dst_maxrow;
@@ -229,6 +231,28 @@
 		dstrect = &full_dst;
 	}
 
+	/* Lock the destination if it's in hardware */
+	dst_locked = 0;
+	if ( SDL_MUSTLOCK(dst) ) {
+		if ( SDL_LockSurface(dst) < 0 ) {
+			SDL_SetError("Unable to lock destination surface");
+			return(-1);
+		}
+		dst_locked = 1;
+	}
+	/* Lock the source if it's in hardware */
+	src_locked = 0;
+	if ( SDL_MUSTLOCK(src) ) {
+		if ( SDL_LockSurface(src) < 0 ) {
+			if ( dst_locked ) {
+				SDL_UnlockSurface(dst);
+			}
+			SDL_SetError("Unable to lock source surface");
+			return(-1);
+		}
+		src_locked = 1;
+	}
+
 	/* Set up the data... */
 	pos = 0x10000;
 	inc = (srcrect->h << 16) / dstrect->h;
@@ -307,6 +331,14 @@
 #endif
 		pos += inc;
 	}
+
+	/* We need to unlock the surfaces if they're locked */
+	if ( dst_locked ) {
+		SDL_UnlockSurface(dst);
+	}
+	if ( src_locked ) {
+		SDL_UnlockSurface(src);
+	}
 	return(0);
 }