Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
Software scaling support. Not very fast, but it seems to work.
Browse files Browse the repository at this point in the history
  • Loading branch information
KenRogoway committed Feb 14, 2011
1 parent 69af9a3 commit ea308dc
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 1 deletion.
11 changes: 11 additions & 0 deletions include/SDL_surface.h
Expand Up @@ -464,6 +464,17 @@ extern DECLSPEC int SDLCALL SDL_SoftStretch(SDL_Surface * src,
SDL_Surface * dst,
const SDL_Rect * dstrect);

/**
* \brief Perform a fast, low quality, stretch blit between two surfaces of the
* different pixel formats.
*
* \note This function calls SDL_SoftStretch or SDL_LowerBlit.
*/
extern DECLSPEC int SDLCALL SDL_BlitScaled
(SDL_Surface * src, const SDL_Rect * srcrect,
SDL_Surface * dst, const SDL_Rect * dstrect);


/* Ends C function definitions when using C++ */
#ifdef __cplusplus
/* *INDENT-OFF* */
Expand Down
7 changes: 6 additions & 1 deletion src/render/software/SDL_render_sw.c
Expand Up @@ -364,7 +364,12 @@ SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
if (!surface) {
return -1;
}
return SDL_BlitSurface(src, srcrect, surface, &final_rect);

if ( srcrect->w == final_rect.w && srcrect->h == final_rect.h ) {
return SDL_BlitSurface(src, srcrect, surface, &final_rect);
} else {
return SDL_BlitScaled(src, srcrect, surface, &final_rect);
}
}

static int
Expand Down
45 changes: 45 additions & 0 deletions src/video/SDL_surface.c
Expand Up @@ -639,6 +639,51 @@ SDL_UpperBlit(SDL_Surface * src, const SDL_Rect * srcrect,
return 0;
}

/*
* Scale and blit a surface
*/
int
SDL_BlitScaled(SDL_Surface * src, const SDL_Rect * srcrect,
SDL_Surface * dst, const SDL_Rect * dstrect)
{
/* Save off the original dst width, height */
int dstW = dstrect->w;
int dstH = dstrect->h;
SDL_Rect final_dst = *dstrect;
SDL_Rect final_src = *srcrect;

/* Clip the dst surface to the dstrect */
SDL_SetClipRect( dst, &final_dst );

/* If the dest was clipped to a zero sized rect then exit */
if ( dst->clip_rect.w <= 0 || dst->clip_rect.h <= 0 ) {
return -1;
}

/* Did the dst width change? */
if ( dstW != dst->clip_rect.w ) {
/* scale the src width appropriately */
final_src.w = final_src.w * dst->clip_rect.w / dstW;
}

/* Did the dst height change? */
if ( dstH != dst->clip_rect.h ) {
/* scale the src width appropriately */
final_src.h = final_src.h * dst->clip_rect.h / dstH;
}

/* Clip the src surface to the srcrect */
SDL_SetClipRect( src, &final_src );

src->map->info.flags |= SDL_COPY_NEAREST;

if ( src->format->format == dst->format->format && !SDL_ISPIXELFORMAT_INDEXED(src->format->format) ) {
return SDL_SoftStretch( src, &final_src, dst, &final_dst );
} else {
return SDL_LowerBlit( src, &final_src, dst, &final_dst );
}
}

/*
* Lock a surface to directly access the pixels
*/
Expand Down

0 comments on commit ea308dc

Please sign in to comment.