Diagonal flipping with RenderCopyEx
authorSam Lantinga <slouken@libsdl.org>
Wed, 13 Nov 2013 21:50:59 -0800
changeset 7976 e8f93c2ebda3
parent 7975 1b49b680f319
child 7977 5272ae8fccd7
Diagonal flipping with RenderCopyEx Ivan Rubinson As it turns out, it was impossible to render a texture flipped diagonally (both vertically and horizontally) with one RenderCopyEx call. With help from #SDL @ freenode, we came up with a fix.
src/render/direct3d/SDL_render_d3d.c
src/render/opengl/SDL_render_gl.c
--- a/src/render/direct3d/SDL_render_d3d.c	Wed Nov 13 11:18:37 2013 -0300
+++ b/src/render/direct3d/SDL_render_d3d.c	Wed Nov 13 21:50:59 2013 -0800
@@ -1635,22 +1635,26 @@
     centerx = center->x;
     centery = center->y;
 
-    if (flip & SDL_FLIP_HORIZONTAL) {
-        minx = dstrect->w - centerx - 0.5f;
-        maxx = -centerx - 0.5f;
-    }
-    else {
-        minx = -centerx - 0.5f;
-        maxx = dstrect->w - centerx - 0.5f;
-    }
-
-    if (flip & SDL_FLIP_VERTICAL) {
-        miny = dstrect->h - centery - 0.5f;
-        maxy = -centery - 0.5f;
-    }
-    else {
-        miny = -centery - 0.5f;
-        maxy = dstrect->h - centery - 0.5f;
+    if ((flip & SDL_FLIP_VERTICAL) && (flip & SDL_FLIP_HORIZONTAL)) {
+        miny = dstrect->h - centery;
+        maxy = -centery;
+        minx = dstrect->w - centerx;
+        maxx = -centerx;
+    } else if (flip & SDL_FLIP_HORIZONTAL) {
+        miny = -centery;
+        maxy = dstrect->h - centery;
+        minx = dstrect->w - centerx;
+        maxx = -centerx;
+    } else if (flip & SDL_FLIP_VERTICAL) {
+        miny = dstrect->h - centery;
+        maxy = -centery;
+        minx = -centerx;
+        maxx = dstrect->w - centerx;
+    } else {
+        miny = -centery;
+        maxy = dstrect->h - centery;
+        minx = -centerx;
+        maxx = dstrect->w - centerx;
     }
 
     minu = (float) srcrect->x / texture->w;
--- a/src/render/opengl/SDL_render_gl.c	Wed Nov 13 11:18:37 2013 -0300
+++ b/src/render/opengl/SDL_render_gl.c	Wed Nov 13 21:50:59 2013 -0800
@@ -1250,22 +1250,26 @@
     centerx = center->x;
     centery = center->y;
 
-    if (flip & SDL_FLIP_HORIZONTAL) {
-        minx =  dstrect->w - centerx;
+    if ((flip & SDL_FLIP_VERTICAL) && (flip & SDL_FLIP_HORIZONTAL)) {
+        miny = dstrect->h - centery;
+        maxy = -centery;
+        minx = dstrect->w - centerx;
         maxx = -centerx;
-    }
-    else {
+    } else if (flip & SDL_FLIP_HORIZONTAL) {
+        miny = -centery;
+        maxy = dstrect->h - centery;
+        minx = dstrect->w - centerx;
+        maxx = -centerx;
+    } else if (flip & SDL_FLIP_VERTICAL) {
+        miny = dstrect->h - centery;
+        maxy = -centery;
         minx = -centerx;
-        maxx =  dstrect->w - centerx;
-    }
-
-    if (flip & SDL_FLIP_VERTICAL) {
-        miny =  dstrect->h - centery;
-        maxy = -centery;
-    }
-    else {
+        maxx = dstrect->w - centerx;
+    } else {
         miny = -centery;
-        maxy =  dstrect->h - centery;
+        maxy = dstrect->h - centery;
+        minx = -centerx;
+        maxx = dstrect->w - centerx;
     }
 
     minu = (GLfloat) srcrect->x / texture->w;