SDL: SDL_RenderTexture() and SDL_RenderTextureRotated() take floating point source coordinates

From bd2e2ee7aaa35317920b362d92923db28fd94d27 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Thu, 2 Mar 2023 08:56:54 -0800
Subject: [PATCH] SDL_RenderTexture() and SDL_RenderTextureRotated() take
 floating point source coordinates

See the discussion at https://discourse.libsdl.org/t/sdl-rendercopyf-uses-ints/36732/8
---
 include/SDL3/SDL_render.h           |  4 +-
 src/dynapi/SDL_dynapi_procs.h       |  4 +-
 src/render/SDL_render.c             | 74 ++++++++++++++---------------
 src/render/SDL_sysrender.h          |  6 +--
 src/render/psp/SDL_render_psp.c     |  4 +-
 src/render/software/SDL_render_sw.c | 15 ++++--
 src/test/SDL_test_font.c            | 10 ++--
 test/testime.c                      |  8 ++--
 test/testshape.c                    | 32 +++++++------
 9 files changed, 82 insertions(+), 75 deletions(-)

diff --git a/include/SDL3/SDL_render.h b/include/SDL3/SDL_render.h
index f502cb9fc826..766a72767408 100644
--- a/include/SDL3/SDL_render.h
+++ b/include/SDL3/SDL_render.h
@@ -1282,7 +1282,7 @@ extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer *renderer, const SD
  *
  * \since This function is available since SDL 3.0.0.
  */
-extern DECLSPEC int SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect);
+extern DECLSPEC int SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect);
 
 /**
  * Copy a portion of the source texture to the current rendering target, with
@@ -1307,7 +1307,7 @@ extern DECLSPEC int SDLCALL SDL_RenderTexture(SDL_Renderer *renderer, SDL_Textur
  * \since This function is available since SDL 3.0.0.
  */
 extern DECLSPEC int SDLCALL SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
-                                                     const SDL_Rect *srcrect, const SDL_FRect *dstrect,
+                                                     const SDL_FRect *srcrect, const SDL_FRect *dstrect,
                                                      const double angle, const SDL_FPoint *center,
                                                      const SDL_RendererFlip flip);
 
diff --git a/src/dynapi/SDL_dynapi_procs.h b/src/dynapi/SDL_dynapi_procs.h
index cb0e4caf41ae..e253666ff152 100644
--- a/src/dynapi/SDL_dynapi_procs.h
+++ b/src/dynapi/SDL_dynapi_procs.h
@@ -611,8 +611,8 @@ SDL_DYNAPI_PROC(int,SDL_RenderPresent,(SDL_Renderer *a),(a),return)
 SDL_DYNAPI_PROC(int,SDL_RenderReadPixels,(SDL_Renderer *a, const SDL_Rect *b, Uint32 c, void *d, int e),(a,b,c,d,e),return)
 SDL_DYNAPI_PROC(int,SDL_RenderRect,(SDL_Renderer *a, const SDL_FRect *b),(a,b),return)
 SDL_DYNAPI_PROC(int,SDL_RenderRects,(SDL_Renderer *a, const SDL_FRect *b, int c),(a,b,c),return)
-SDL_DYNAPI_PROC(int,SDL_RenderTexture,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_FRect *d),(a,b,c,d),return)
-SDL_DYNAPI_PROC(int,SDL_RenderTextureRotated,(SDL_Renderer *a, SDL_Texture *b, const SDL_Rect *c, const SDL_FRect *d, const double e, const SDL_FPoint *f, const SDL_RendererFlip g),(a,b,c,d,e,f,g),return)
+SDL_DYNAPI_PROC(int,SDL_RenderTexture,(SDL_Renderer *a, SDL_Texture *b, const SDL_FRect *c, const SDL_FRect *d),(a,b,c,d),return)
+SDL_DYNAPI_PROC(int,SDL_RenderTextureRotated,(SDL_Renderer *a, SDL_Texture *b, const SDL_FRect *c, const SDL_FRect *d, const double e, const SDL_FPoint *f, const SDL_RendererFlip g),(a,b,c,d,e,f,g),return)
 SDL_DYNAPI_PROC(int,SDL_RenderCoordinatesFromWindow,(SDL_Renderer *a, float b, float c, float *d, float *e),(a,b,c,d,e),return)
 SDL_DYNAPI_PROC(SDL_AssertState,SDL_ReportAssertion,(SDL_AssertData *a, const char *b, const char *c, int d),(a,b,c,d),return)
 SDL_DYNAPI_PROC(void,SDL_ResetAssertionReport,(void),(),)
diff --git a/src/render/SDL_render.c b/src/render/SDL_render.c
index e43592869f32..6ed669ea4776 100644
--- a/src/render/SDL_render.c
+++ b/src/render/SDL_render.c
@@ -599,7 +599,7 @@ static int QueueCmdFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, con
     return retval;
 }
 
-static int QueueCmdCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
+static int QueueCmdCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect)
 {
     SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_COPY, texture);
     int retval = -1;
@@ -613,7 +613,7 @@ static int QueueCmdCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_
 }
 
 static int QueueCmdCopyEx(SDL_Renderer *renderer, SDL_Texture *texture,
-                          const SDL_Rect *srcquad, const SDL_FRect *dstrect,
+                          const SDL_FRect *srcquad, const SDL_FRect *dstrect,
                           const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y)
 {
     SDL_RenderCommand *cmd = PrepQueueCmdDraw(renderer, SDL_RENDERCMD_COPY_EX, texture);
@@ -2150,10 +2150,10 @@ static int UpdateLogicalPresentation(SDL_Renderer *renderer)
         real_aspect = (float)output_w / output_h;
     }
 
-    renderer->logical_src_rect.x = 0;
-    renderer->logical_src_rect.y = 0;
-    renderer->logical_src_rect.w = logical_w;
-    renderer->logical_src_rect.h = logical_h;
+    renderer->logical_src_rect.x = 0.0f;
+    renderer->logical_src_rect.y = 0.0f;
+    renderer->logical_src_rect.w = (float)logical_w;
+    renderer->logical_src_rect.h = (float)logical_h;
 
     if (renderer->logical_presentation_mode == SDL_LOGICAL_PRESENTATION_INTEGER_SCALE) {
         if (want_aspect > real_aspect) {
@@ -2309,7 +2309,7 @@ int SDL_RenderCoordinatesFromWindow(SDL_Renderer *renderer, float window_x, floa
 
     /* Convert from pixels within the window to pixels within the view */
     if (renderer->logical_target) {
-        const SDL_Rect *src = &renderer->logical_src_rect;
+        const SDL_FRect *src = &renderer->logical_src_rect;
         const SDL_FRect *dst = &renderer->logical_dst_rect;
         render_x = ((render_x - dst->x) * src->w) / dst->w;
         render_y = ((render_y - dst->y) * src->h) / dst->h;
@@ -2350,7 +2350,7 @@ int SDL_RenderCoordinatesToWindow(SDL_Renderer *renderer, float x, float y, floa
 
     /* Convert from pixels within the view to pixels within the window */
     if (renderer->logical_target) {
-        const SDL_Rect *src = &renderer->logical_src_rect;
+        const SDL_FRect *src = &renderer->logical_src_rect;
         const SDL_FRect *dst = &renderer->logical_dst_rect;
         x = dst->x + ((x * dst->w) / src->w);
         y = dst->y + ((y * dst->h) / src->h);
@@ -2386,7 +2386,7 @@ int SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event
 
                 /* Convert from pixels within the window to pixels within the view */
                 if (renderer->logical_target) {
-                    const SDL_Rect *src = &renderer->logical_src_rect;
+                    const SDL_FRect *src = &renderer->logical_src_rect;
                     const SDL_FRect *dst = &renderer->logical_dst_rect;
                     scale = (scale * src->w) / dst->w;
                 }
@@ -2409,7 +2409,7 @@ int SDL_ConvertEventToRenderCoordinates(SDL_Renderer *renderer, SDL_Event *event
 
                 /* Convert from pixels within the window to pixels within the view */
                 if (renderer->logical_target) {
-                    const SDL_Rect *src = &renderer->logical_src_rect;
+                    const SDL_FRect *src = &renderer->logical_src_rect;
                     const SDL_FRect *dst = &renderer->logical_dst_rect;
                     scale = (scale * src->h) / dst->h;
                 }
@@ -3129,9 +3129,9 @@ int SDL_RenderFillRects(SDL_Renderer *renderer, const SDL_FRect *rects, int coun
     return retval < 0 ? retval : FlushRenderCommandsIfNotBatching(renderer);
 }
 
-int SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, const SDL_FRect *dstrect)
+int SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_FRect *srcrect, const SDL_FRect *dstrect)
 {
-    SDL_Rect real_srcrect;
+    SDL_FRect real_srcrect;
     SDL_FRect real_dstrect;
     int retval;
     int use_rendergeometry;
@@ -3152,12 +3152,12 @@ int SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Re
 
     use_rendergeometry = (renderer->QueueCopy == NULL);
 
-    real_srcrect.x = 0;
-    real_srcrect.y = 0;
-    real_srcrect.w = texture->w;
-    real_srcrect.h = texture->h;
+    real_srcrect.x = 0.0f;
+    real_srcrect.y = 0.0f;
+    real_srcrect.w = (float)texture->w;
+    real_srcrect.h = (float)texture->h;
     if (srcrect) {
-        if (!SDL_GetRectIntersection(srcrect, &real_srcrect, &real_srcrect)) {
+        if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect)) {
             return 0;
         }
     }
@@ -3188,10 +3188,10 @@ int SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Re
         float minu, minv, maxu, maxv;
         float minx, miny, maxx, maxy;
 
-        minu = (float)(real_srcrect.x) / (float)texture->w;
-        minv = (float)(real_srcrect.y) / (float)texture->h;
-        maxu = (float)(real_srcrect.x + real_srcrect.w) / (float)texture->w;
-        maxv = (float)(real_srcrect.y + real_srcrect.h) / (float)texture->h;
+        minu = real_srcrect.x / texture->w;
+        minv = real_srcrect.y / texture->h;
+        maxu = (real_srcrect.x + real_srcrect.w) / texture->w;
+        maxv = (real_srcrect.y + real_srcrect.h) / texture->h;
 
         minx = real_dstrect.x;
         miny = real_dstrect.y;
@@ -3235,10 +3235,10 @@ int SDL_RenderTexture(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Re
 }
 
 int SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
-                      const SDL_Rect *srcrect, const SDL_FRect *dstrect,
+                      const SDL_FRect *srcrect, const SDL_FRect *dstrect,
                       const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip)
 {
-    SDL_Rect real_srcrect;
+    SDL_FRect real_srcrect;
     SDL_FRect real_dstrect;
     SDL_FPoint real_center;
     int retval;
@@ -3267,12 +3267,12 @@ int SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
 
     use_rendergeometry = (renderer->QueueCopyEx == NULL);
 
-    real_srcrect.x = 0;
-    real_srcrect.y = 0;
-    real_srcrect.w = texture->w;
-    real_srcrect.h = texture->h;
+    real_srcrect.x = 0.0f;
+    real_srcrect.y = 0.0f;
+    real_srcrect.w = (float)texture->w;
+    real_srcrect.h = (float)texture->h;
     if (srcrect) {
-        if (!SDL_GetRectIntersection(srcrect, &real_srcrect, &real_srcrect)) {
+        if (!SDL_GetRectIntersectionFloat(srcrect, &real_srcrect, &real_srcrect)) {
             return 0;
         }
     }
@@ -3317,10 +3317,10 @@ int SDL_RenderTextureRotated(SDL_Renderer *renderer, SDL_Texture *texture,
         const float s = SDL_sinf(radian_angle);
         const float c = SDL_cosf(radian_angle);
 
-        minu = (float)(real_srcrect.x) / (float)texture->w;
-        minv = (float)(real_srcrect.y) / (float)texture->h;
-        maxu = (float)(real_srcrect.x + real_srcrect.w) / (float)texture->w;
-        maxv = (float)(real_srcrect.y + real_srcrect.h) / (float)texture->h;
+        minu = real_srcrect.x / texture->w;
+        minv = real_srcrect.y / texture->h;
+        maxu = (real_srcrect.x + real_srcrect.w) / texture->w;
+        maxv = (real_srcrect.y + real_srcrect.h) / texture->h;
 
         centerx = real_center.x + real_dstrect.x;
         centery = real_center.y + real_dstrect.y;
@@ -3667,7 +3667,7 @@ static int SDLCALL SDL_SW_RenderGeometryRaw(SDL_Renderer *renderer,
 
         /* Start rendering rect */
         if (is_quad) {
-            SDL_Rect s;
+            SDL_FRect s;
             SDL_FRect d;
             const float *xy0_, *xy1_, *uv0_, *uv1_;
             SDL_Color col0_ = *(const SDL_Color *)((const char *)color + k0 * color_stride);
@@ -3678,10 +3678,10 @@ static int SDLCALL SDL_SW_RenderGeometryRaw(SDL_Renderer *renderer,
             if (texture) {
                 uv0_ = (const float *)((const char *)uv + A * uv_stride);
                 uv1_ = (const float *)((const char *)uv + B * uv_stride);
-                s.x = (int)(uv0_[0] * texw);
-                s.y = (int)(uv0_[1] * texh);
-                s.w = (int)(uv1_[0] * texw - s.x);
-                s.h = (int)(uv1_[1] * texh - s.y);
+                s.x = uv0_[0] * texw;
+                s.y = uv0_[1] * texh;
+                s.w = uv1_[0] * texw - s.x;
+                s.h = uv1_[1] * texh - s.y;
             }
 
             d.x = xy0_[0];
diff --git a/src/render/SDL_sysrender.h b/src/render/SDL_sysrender.h
index c0886661d1f0..bd3e71ace6ad 100644
--- a/src/render/SDL_sysrender.h
+++ b/src/render/SDL_sysrender.h
@@ -168,9 +168,9 @@ struct SDL_Renderer
     int (*QueueFillRects)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, const SDL_FRect *rects,
                           int count);
     int (*QueueCopy)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                     const SDL_Rect *srcrect, const SDL_FRect *dstrect);
+                     const SDL_FRect *srcrect, const SDL_FRect *dstrect);
     int (*QueueCopyEx)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                       const SDL_Rect *srcquad, const SDL_FRect *dstrect,
+                       const SDL_FRect *srcquad, const SDL_FRect *dstrect,
                        const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y);
     int (*QueueGeometry)(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
                          const float *xy, int xy_stride, const SDL_Color *color, int color_stride, const float *uv, int uv_stride,
@@ -229,7 +229,7 @@ struct SDL_Renderer
     SDL_Texture *logical_target;
     SDL_RendererLogicalPresentation logical_presentation_mode;
     SDL_ScaleMode logical_scale_mode;
-    SDL_Rect logical_src_rect;
+    SDL_FRect logical_src_rect;
     SDL_FRect logical_dst_rect;
 
     SDL_RenderViewState *view;
diff --git a/src/render/psp/SDL_render_psp.c b/src/render/psp/SDL_render_psp.c
index e6cb4cb0c485..848d29c2e0fc 100644
--- a/src/render/psp/SDL_render_psp.c
+++ b/src/render/psp/SDL_render_psp.c
@@ -757,7 +757,7 @@ static int PSP_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, co
 }
 
 static int PSP_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                         const SDL_Rect *srcrect, const SDL_FRect *dstrect)
+                         const SDL_FRect *srcrect, const SDL_FRect *dstrect)
 {
     VertTV *verts;
     const float x = dstrect->x;
@@ -841,7 +841,7 @@ static int PSP_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Tex
 }
 
 static int PSP_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                           const SDL_Rect *srcrect, const SDL_FRect *dstrect,
+                           const SDL_FRect *srcrect, const SDL_FRect *dstrect,
                            const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y)
 {
     VertTV *verts = (VertTV *)SDL_AllocateRenderVertices(renderer, 4 * sizeof(VertTV), 4, &cmd->data.draw.first);
diff --git a/src/render/software/SDL_render_sw.c b/src/render/software/SDL_render_sw.c
index 8b5900589896..3822b0e6ce4c 100644
--- a/src/render/software/SDL_render_sw.c
+++ b/src/render/software/SDL_render_sw.c
@@ -227,7 +227,7 @@ static int SW_QueueFillRects(SDL_Renderer *renderer, SDL_RenderCommand *cmd, con
 }
 
 static int SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                        const SDL_Rect *srcrect, const SDL_FRect *dstrect)
+                        const SDL_FRect *srcrect, const SDL_FRect *dstrect)
 {
     SDL_Rect *verts = (SDL_Rect *)SDL_AllocateRenderVertices(renderer, 2 * sizeof(SDL_Rect), 0, &cmd->data.draw.first);
 
@@ -237,7 +237,10 @@ static int SW_QueueCopy(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Text
 
     cmd->data.draw.count = 1;
 
-    SDL_copyp(verts, srcrect);
+    verts->x = (int)srcrect->x;
+    verts->y = (int)srcrect->y;
+    verts->w = (int)srcrect->w;
+    verts->h = (int)srcrect->h;
     verts++;
 
     verts->x = (int)dstrect->x;
@@ -260,7 +263,7 @@ typedef struct CopyExData
 } CopyExData;
 
 static int SW_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *texture,
-                          const SDL_Rect *srcrect, const SDL_FRect *dstrect,
+                          const SDL_FRect *srcrect, const SDL_FRect *dstrect,
                           const double angle, const SDL_FPoint *center, const SDL_RendererFlip flip, float scale_x, float scale_y)
 {
     CopyExData *verts = (CopyExData *)SDL_AllocateRenderVertices(renderer, sizeof(CopyExData), 0, &cmd->data.draw.first);
@@ -271,8 +274,10 @@ static int SW_QueueCopyEx(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Te
 
     cmd->data.draw.count = 1;
 
-    SDL_copyp(&verts->srcrect, srcrect);
-
+    verts->srcrect.x = (int)srcrect->x;
+    verts->srcrect.y = (int)srcrect->y;
+    verts->srcrect.w = (int)srcrect->w;
+    verts->srcrect.h = (int)srcrect->h;
     verts->dstrect.x = (int)dstrect->x;
     verts->dstrect.y = (int)dstrect->y;
     verts->dstrect.w = (int)dstrect->w;
diff --git a/src/test/SDL_test_font.c b/src/test/SDL_test_font.c
index 9dfbad3597dd..be9a7aee2eb1 100644
--- a/src/test/SDL_test_font.c
+++ b/src/test/SDL_test_font.c
@@ -3131,7 +3131,7 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, float x, float y, Uint32 c)
     const Uint32 charWidth = FONT_CHARACTER_SIZE;
     const Uint32 charHeight = FONT_CHARACTER_SIZE;
     const Uint32 charSize = FONT_CHARACTER_SIZE;
-    SDL_Rect srect;
+    SDL_FRect srect;
     SDL_FRect drect;
     int result;
     Uint32 ix, iy;
@@ -3147,10 +3147,10 @@ int SDLTest_DrawCharacter(SDL_Renderer *renderer, float x, float y, Uint32 c)
     /*
      * Setup source rectangle
      */
-    srect.x = 0;
-    srect.y = 0;
-    srect.w = charWidth;
-    srect.h = charHeight;
+    srect.x = 0.0f;
+    srect.y = 0.0f;
+    srect.w = (float)charWidth;
+    srect.h = (float)charHeight;
 
     /*
      * Setup destination rectangle
diff --git a/test/testime.c b/test/testime.c
index 16340ec90969..75a582e7fbbb 100644
--- a/test/testime.c
+++ b/test/testime.c
@@ -330,8 +330,8 @@ static Sint32 unifont_draw_glyph(Uint32 codepoint, int rendererID, SDL_FRect *ds
 {
     SDL_Texture *texture;
     const Uint32 textureID = codepoint / UNIFONT_GLYPHS_IN_TEXTURE;
-    SDL_Rect srcrect;
-    srcrect.w = srcrect.h = 16;
+    SDL_FRect srcrect;
+    srcrect.w = srcrect.h = 16.0f;
     if (codepoint > UNIFONT_MAX_CODEPOINT) {
         return 0;
     }
@@ -343,8 +343,8 @@ static Sint32 unifont_draw_glyph(Uint32 codepoint, int rendererID, SDL_FRect *ds
     texture = unifontTexture[UNIFONT_NUM_TEXTURES * rendererID + textureID];
     if (texture != NULL) {
         const Uint32 cInTex = codepoint % UNIFONT_GLYPHS_IN_TEXTURE;
-        srcrect.x = cInTex % UNIFONT_GLYPHS_IN_ROW * 16;
-        srcrect.y = cInTex / UNIFONT_GLYPHS_IN_ROW * 16;
+        srcrect.x = (float)(cInTex % UNIFONT_GLYPHS_IN_ROW * 16);
+        srcrect.y = (float)(cInTex / UNIFONT_GLYPHS_IN_ROW * 16);
         SDL_RenderTexture(state->renderers[rendererID], texture, &srcrect, dst);
     }
     return unifontGlyph[codepoint].width;
diff --git a/test/testshape.c b/test/testshape.c
index 53af1e0d5ea3..48e4d0754c65 100644
--- a/test/testshape.c
+++ b/test/testshape.c
@@ -26,7 +26,7 @@ typedef struct LoadedPicture
     const char *name;
 } LoadedPicture;
 
-void render(SDL_Renderer *renderer, SDL_Texture *texture, SDL_Rect texture_dimensions)
+void render(SDL_Renderer *renderer, SDL_Texture *texture, SDL_FRect texture_dimensions)
 {
     SDL_FRect dst;
 
@@ -35,10 +35,10 @@ void render(SDL_Renderer *renderer, SDL_Texture *texture, SDL_Rect texture_dimen
     SDL_RenderClear(renderer);
 
     /* Render the texture. */
-    dst.x = (float)texture_dimensions.x;
-    dst.y = (float)texture_dimensions.y;
-    dst.w = (float)texture_dimensions.w;
-    dst.h = (float)texture_dimensions.h;
+    dst.x = texture_dimensions.x;
+    dst.y = texture_dimensions.y;
+    dst.w = texture_dimensions.w;
+    dst.h = texture_dimensions.h;
     SDL_RenderTexture(renderer, texture, &texture_dimensions, &dst);
 
     SDL_RenderPresent(renderer);
@@ -58,8 +58,8 @@ int main(int argc, char **argv)
     unsigned int current_picture;
     int button_down;
     Uint32 pixelFormat = 0;
-    int access = 0;
-    SDL_Rect texture_dimensions;
+    int w, h, access = 0;
+    SDL_FRect texture_dimensions;
 
     /* Enable standard application logging */
     SDL_LogSetPriority(SDL_LOG_CATEGORY_APPLICATION, SDL_LOG_PRIORITY_INFO);
@@ -158,13 +158,13 @@ int main(int argc, char **argv)
     should_exit = 0;
     current_picture = 0;
     button_down = 0;
-    texture_dimensions.h = 0;
-    texture_dimensions.w = 0;
-    texture_dimensions.x = 0;
-    texture_dimensions.y = 0;
     SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name);
-    SDL_QueryTexture(pictures[current_picture].texture, &pixelFormat, &access, &texture_dimensions.w, &texture_dimensions.h);
-    SDL_SetWindowSize(window, texture_dimensions.w, texture_dimensions.h);
+    SDL_QueryTexture(pictures[current_picture].texture, &pixelFormat, &access, &w, &h);
+    texture_dimensions.x = 0.0f;
+    texture_dimensions.y = 0.0f;
+    texture_dimensions.h = (float)w;
+    texture_dimensions.w = (float)h;
+    SDL_SetWindowSize(window, w, h);
     SDL_SetWindowShape(window, pictures[current_picture].surface, &pictures[current_picture].mode);
     while (should_exit == 0) {
         while (SDL_PollEvent(&event)) {
@@ -182,8 +182,10 @@ int main(int argc, char **argv)
                     current_picture = 0;
                 }
                 SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Changing to shaped bmp: %s", pictures[current_picture].name);
-                SDL_QueryTexture(pictures[current_picture].texture, &pixelFormat, &access, &texture_dimensions.w, &texture_dimensions.h);
-                SDL_SetWindowSize(window, texture_dimensions.w, texture_dimensions.h);
+                SDL_QueryTexture(pictures[current_picture].texture, &pixelFormat, &access, &w, &h);
+                texture_dimensions.h = (float)w;
+                texture_dimensions.w = (float)h;
+                SDL_SetWindowSize(window, w, h);
                 SDL_SetWindowShape(window, pictures[current_picture].surface, &pictures[current_picture].mode);
             }
             if (event.type == SDL_EVENT_QUIT) {