Experiment to try to account for source clipping
authorSam Lantinga <slouken@libsdl.org>
Sun, 20 Feb 2011 23:16:58 -0800
changeset 5368 f0ee2c086931
parent 5367 71fe70373e58
child 5369 e049a7b85fd1
Experiment to try to account for source clipping
src/render/SDL_render.c
--- a/src/render/SDL_render.c	Sun Feb 20 20:49:31 2011 -0800
+++ b/src/render/SDL_render.c	Sun Feb 20 23:16:58 2011 -0800
@@ -999,6 +999,7 @@
 {
     SDL_Window *window;
     SDL_Rect real_srcrect;
+    SDL_Rect clip_dstrect;
     SDL_Rect real_dstrect;
 
     CHECK_RENDERER_MAGIC(renderer, -1);
@@ -1010,6 +1011,16 @@
     }
     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 @@
         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) {