Mercurial > sdl-ios-xcode
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); }