From d3720d572d8dad946c786e6d5d9b4fadb9b67a40 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Sun, 20 Feb 2011 23:16:58 -0800 Subject: [PATCH] Experiment to try to account for source clipping --- src/render/SDL_render.c | 56 ++++++++++++++++++++++++++++------------- 1 file changed, 39 insertions(+), 17 deletions(-) diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c index 0b265ad0c..2adc04ec2 100755 --- a/src/render/SDL_render.c +++ b/src/render/SDL_render.c @@ -999,6 +999,7 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, { SDL_Window *window; SDL_Rect real_srcrect; + SDL_Rect clip_dstrect; SDL_Rect real_dstrect; CHECK_RENDERER_MAGIC(renderer, -1); @@ -1010,6 +1011,16 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, } window = renderer->window; + if (dstrect) { + clip_dstrect = *dstrect; + } else { + clip_dstrect.x = 0; + clip_dstrect.y = 0; + clip_dstrect.w = renderer->viewport.w; + clip_dstrect.h = renderer->viewport.h; + } + dstrect = &clip_dstrect; + real_srcrect.x = 0; real_srcrect.y = 0; real_srcrect.w = texture->w; @@ -1018,29 +1029,40 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, if (!SDL_IntersectRect(srcrect, &real_srcrect, &real_srcrect)) { return 0; } + /* Clip dstrect by the same amount as srcrect was clipped */ + if (srcrect->w != real_srcrect.w) { + int deltax = (real_srcrect.x - srcrect->x); + int deltaw = (real_srcrect.w - srcrect->w); + clip_dstrect.x += (deltax * clip_dstrect.w) / srcrect->w; + clip_dstrect.w += (deltaw * clip_dstrect.w) / srcrect->w; + } + if (srcrect->h != real_srcrect.h) { + int deltay = (real_srcrect.y - srcrect->y); + int deltah = (real_srcrect.h - srcrect->h); + clip_dstrect.y += (deltay * clip_dstrect.h) / srcrect->h; + clip_dstrect.h += (deltah * clip_dstrect.h) / srcrect->h; + } } real_dstrect.x = 0; real_dstrect.y = 0; real_dstrect.w = renderer->viewport.w; real_dstrect.h = renderer->viewport.h; - if (dstrect) { - if (!SDL_IntersectRect(dstrect, &real_dstrect, &real_dstrect)) { - return 0; - } - /* Clip srcrect by the same amount as dstrect was clipped */ - if (dstrect->w != real_dstrect.w) { - int deltax = (real_dstrect.x - dstrect->x); - int deltaw = (real_dstrect.w - dstrect->w); - real_srcrect.x += (deltax * real_srcrect.w) / dstrect->w; - real_srcrect.w += (deltaw * real_srcrect.w) / dstrect->w; - } - if (dstrect->h != real_dstrect.h) { - int deltay = (real_dstrect.y - dstrect->y); - int deltah = (real_dstrect.h - dstrect->h); - real_srcrect.y += (deltay * real_srcrect.h) / dstrect->h; - real_srcrect.h += (deltah * real_srcrect.h) / dstrect->h; - } + if (!SDL_IntersectRect(&clip_dstrect, &real_dstrect, &real_dstrect)) { + return 0; + } + /* Clip srcrect by the same amount as dstrect was clipped */ + if (dstrect->w != real_dstrect.w) { + int deltax = (real_dstrect.x - dstrect->x); + int deltaw = (real_dstrect.w - dstrect->w); + real_srcrect.x += (deltax * real_srcrect.w) / dstrect->w; + real_srcrect.w += (deltaw * real_srcrect.w) / dstrect->w; + } + if (dstrect->h != real_dstrect.h) { + int deltay = (real_dstrect.y - dstrect->y); + int deltah = (real_dstrect.h - dstrect->h); + real_srcrect.y += (deltay * real_srcrect.h) / dstrect->h; + real_srcrect.h += (deltah * real_srcrect.h) / dstrect->h; } if (texture->native) {