Commit 9efdafd43d1284143dc72b335620fed8ed5e98c1

Sylvain Becker 2020-12-28T18:07:03

SDL_RenderCopy: scale before doing intersection this prevents drawing 1 pixel outside the screen, in letterbox mode

diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index e80cf6c..7e55565 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -2999,24 +2999,25 @@ SDL_RenderCopyF(SDL_Renderer * renderer, SDL_Texture * texture,
     SDL_RenderGetViewport(renderer, &r);
     real_dstrect.x = 0.0f;
     real_dstrect.y = 0.0f;
-    real_dstrect.w = (float) r.w;
-    real_dstrect.h = (float) r.h;
+    real_dstrect.w = (float) r.w * renderer->scale.x;
+    real_dstrect.h = (float) r.h * renderer->scale.y;
     if (dstrect) {
-        if (!SDL_HasIntersectionF(dstrect, &real_dstrect)) {
+        SDL_FRect dstrect_scaled;
+        dstrect_scaled.x = dstrect->x * renderer->scale.x;
+        dstrect_scaled.y = dstrect->y * renderer->scale.y;
+        dstrect_scaled.w = dstrect->w * renderer->scale.x;
+        dstrect_scaled.h = dstrect->h * renderer->scale.y;
+
+        if (!SDL_HasIntersectionF(&dstrect_scaled, &real_dstrect)) {
             return 0;
         }
-        real_dstrect = *dstrect;
+        real_dstrect = dstrect_scaled;
     }
 
     if (texture->native) {
         texture = texture->native;
     }
 
-    real_dstrect.x *= renderer->scale.x;
-    real_dstrect.y *= renderer->scale.y;
-    real_dstrect.w *= renderer->scale.x;
-    real_dstrect.h *= renderer->scale.y;
-
     texture->last_command_generation = renderer->render_command_generation;
 
     retval = QueueCmdCopy(renderer, texture, &real_srcrect, &real_dstrect);