mirror of
https://github.com/yawut/SDL.git
synced 2026-09-30 12:16:43 -05:00
Don't crash if the stretch routines are used on hardware surfaces
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user