From cb3d7d3831bc21becfe422c8e3ef00578075b2a6 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 13 Nov 2013 21:50:59 -0800 Subject: [PATCH] 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 | 36 +++++++++++++++------------- src/render/opengl/SDL_render_gl.c | 32 ++++++++++++++----------- 2 files changed, 38 insertions(+), 30 deletions(-) diff --git a/src/render/direct3d/SDL_render_d3d.c b/src/render/direct3d/SDL_render_d3d.c index a4c602757..38fb6d082 100644 --- a/src/render/direct3d/SDL_render_d3d.c +++ b/src/render/direct3d/SDL_render_d3d.c @@ -1635,22 +1635,26 @@ D3D_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, 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; diff --git a/src/render/opengl/SDL_render_gl.c b/src/render/opengl/SDL_render_gl.c index 94914ead1..bb789c138 100644 --- a/src/render/opengl/SDL_render_gl.c +++ b/src/render/opengl/SDL_render_gl.c @@ -1250,22 +1250,26 @@ GL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture, centerx = center->x; centery = center->y; - if (flip & SDL_FLIP_HORIZONTAL) { - minx = dstrect->w - centerx; - maxx = -centerx; - } - else { - minx = -centerx; - maxx = dstrect->w - centerx; - } - - if (flip & SDL_FLIP_VERTICAL) { - miny = dstrect->h - centery; + if ((flip & SDL_FLIP_VERTICAL) && (flip & SDL_FLIP_HORIZONTAL)) { + miny = dstrect->h - centery; maxy = -centery; - } - else { + minx = dstrect->w - centerx; + maxx = -centerx; + } else if (flip & SDL_FLIP_HORIZONTAL) { miny = -centery; - maxy = dstrect->h - 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 = (GLfloat) srcrect->x / texture->w;