Skip to content

Commit

Permalink
Diagonal flipping with RenderCopyEx
Browse files Browse the repository at this point in the history
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 b36d98b
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 29 deletions.
36 changes: 20 additions & 16 deletions src/render/direct3d/SDL_render_d3d.c
Expand Up @@ -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;
Expand Down
30 changes: 17 additions & 13 deletions src/render/opengl/SDL_render_gl.c
Expand Up @@ -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;
Expand Down

0 comments on commit b36d98b

Please sign in to comment.