Permalink
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Browse files
Don't crash if the stretch routines are used on hardware surfaces
- Loading branch information
Showing
with
32 additions
and
0 deletions.
-
+32
−0
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); |
|
|
} |
|
|
|