Skip to content
Permalink
Browse files

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.
  • Loading branch information
slouken committed Nov 14, 2013
1 parent 5b8b403 commit b36d98bd9ce83ff5045e556d3d111c23a9e2f26c
Showing with 37 additions and 29 deletions.
  1. +20 −16 src/render/direct3d/SDL_render_d3d.c
  2. +17 −13 src/render/opengl/SDL_render_gl.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;
@@ -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;
if ((flip & SDL_FLIP_VERTICAL) && (flip & SDL_FLIP_HORIZONTAL)) {
miny = dstrect->h - centery;
maxy = -centery;
minx = dstrect->w - centerx;
maxx = -centerx;
}
else {
minx = -centerx;
maxx = dstrect->w - centerx;
}

if (flip & SDL_FLIP_VERTICAL) {
miny = dstrect->h - centery;
} 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;
}
else {
minx = -centerx;
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;

0 comments on commit b36d98b

Please sign in to comment.