From 4afcf9ccabc185160a97094fb6a9408d9cb97ef5 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 16 May 2004 21:08:55 +0000 Subject: [PATCH] Don't crash if the stretch routines are used on hardware surfaces --- src/video/SDL_stretch.c | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/video/SDL_stretch.c b/src/video/SDL_stretch.c index 9f0b60a61..854531165 100644 --- a/src/video/SDL_stretch.c +++ b/src/video/SDL_stretch.c @@ -181,6 +181,8 @@ void copy_row3(Uint8 *src, int src_w, Uint8 *dst, int dst_w) 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 @@ int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, 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 @@ int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, #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); }