summaryrefslogtreecommitdiffstatshomepage
path: root/3rdparty/SDL2/src/render/SDL_render.c
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/SDL2/src/render/SDL_render.c')
-rw-r--r--3rdparty/SDL2/src/render/SDL_render.c72
1 files changed, 58 insertions, 14 deletions
diff --git a/3rdparty/SDL2/src/render/SDL_render.c b/3rdparty/SDL2/src/render/SDL_render.c
index 923973ec78d..94750810d8b 100644
--- a/3rdparty/SDL2/src/render/SDL_render.c
+++ b/3rdparty/SDL2/src/render/SDL_render.c
@@ -234,12 +234,11 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
return NULL;
}
- hint = SDL_GetHint(SDL_HINT_RENDER_VSYNC);
- if (hint) {
- if (*hint == '0') {
- flags &= ~SDL_RENDERER_PRESENTVSYNC;
- } else {
+ if (SDL_GetHint(SDL_HINT_RENDER_VSYNC)) {
+ if (SDL_GetHintBoolean(SDL_HINT_RENDER_VSYNC, SDL_TRUE)) {
flags |= SDL_RENDERER_PRESENTVSYNC;
+ } else {
+ flags &= ~SDL_RENDERER_PRESENTVSYNC;
}
}
@@ -1106,6 +1105,8 @@ SDL_SetRenderTarget(SDL_Renderer *renderer, SDL_Texture *texture)
renderer->viewport.y = 0;
renderer->viewport.w = texture->w;
renderer->viewport.h = texture->h;
+ SDL_zero(renderer->clip_rect);
+ renderer->clipping_enabled = SDL_FALSE;
renderer->scale.x = 1.0f;
renderer->scale.y = 1.0f;
renderer->logical_w = texture->w;
@@ -1144,6 +1145,9 @@ UpdateLogicalSize(SDL_Renderer *renderer)
float scale;
SDL_Rect viewport;
+ if (!renderer->logical_w || !renderer->logical_h) {
+ return 0;
+ }
if (SDL_GetRendererOutputSize(renderer, &w, &h) < 0) {
return -1;
}
@@ -1154,7 +1158,19 @@ UpdateLogicalSize(SDL_Renderer *renderer)
/* Clear the scale because we're setting viewport in output coordinates */
SDL_RenderSetScale(renderer, 1.0f, 1.0f);
- if (SDL_fabs(want_aspect-real_aspect) < 0.0001) {
+ if (renderer->integer_scale) {
+ if (want_aspect > real_aspect) {
+ scale = (float)(w / renderer->logical_w);
+ } else {
+ scale = (float)(h / renderer->logical_h);
+ }
+ viewport.w = (int)SDL_ceil(renderer->logical_w * scale);
+ viewport.x = (w - viewport.w) / 2;
+ viewport.h = (int)SDL_ceil(renderer->logical_h * scale);
+ viewport.y = (h - viewport.h) / 2;
+
+ SDL_RenderSetViewport(renderer, &viewport);
+ } else if (SDL_fabs(want_aspect-real_aspect) < 0.0001) {
/* The aspect ratios are the same, just scale appropriately */
scale = (float)w / renderer->logical_w;
SDL_RenderSetViewport(renderer, NULL);
@@ -1216,6 +1232,24 @@ SDL_RenderGetLogicalSize(SDL_Renderer * renderer, int *w, int *h)
}
int
+SDL_RenderSetIntegerScale(SDL_Renderer * renderer, SDL_bool enable)
+{
+ CHECK_RENDERER_MAGIC(renderer, -1);
+
+ renderer->integer_scale = enable;
+
+ return UpdateLogicalSize(renderer);
+}
+
+SDL_bool
+SDLCALL SDL_RenderGetIntegerScale(SDL_Renderer * renderer)
+{
+ CHECK_RENDERER_MAGIC(renderer, SDL_FALSE);
+
+ return renderer->integer_scale;
+}
+
+int
SDL_RenderSetViewport(SDL_Renderer * renderer, const SDL_Rect * rect)
{
CHECK_RENDERER_MAGIC(renderer, -1);
@@ -1425,6 +1459,7 @@ SDL_RenderDrawPoints(SDL_Renderer * renderer,
if (count < 1) {
return 0;
}
+
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
@@ -1534,6 +1569,7 @@ SDL_RenderDrawLines(SDL_Renderer * renderer,
if (count < 2) {
return 0;
}
+
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
@@ -1607,6 +1643,7 @@ SDL_RenderDrawRects(SDL_Renderer * renderer,
if (renderer->hidden) {
return 0;
}
+
for (i = 0; i < count; ++i) {
if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) {
return -1;
@@ -1648,6 +1685,7 @@ SDL_RenderFillRects(SDL_Renderer * renderer,
if (count < 1) {
return 0;
}
+
/* Don't draw while we're hidden */
if (renderer->hidden) {
return 0;
@@ -1686,6 +1724,11 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
return SDL_SetError("Texture was not created with this renderer");
}
+ /* Don't draw while we're hidden */
+ if (renderer->hidden) {
+ return 0;
+ }
+
real_srcrect.x = 0;
real_srcrect.y = 0;
real_srcrect.w = texture->w;
@@ -1710,11 +1753,6 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
texture = texture->native;
}
- /* Don't draw while we're hidden */
- if (renderer->hidden) {
- return 0;
- }
-
frect.x = real_dstrect.x * renderer->scale.x;
frect.y = real_dstrect.y * renderer->scale.y;
frect.w = real_dstrect.w * renderer->scale.x;
@@ -1735,7 +1773,7 @@ SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
SDL_FRect frect;
SDL_FPoint fcenter;
- if (flip == SDL_FLIP_NONE && angle == 0) { /* fast path when we don't need rotation or flipping */
+ if (flip == SDL_FLIP_NONE && (int)(angle/360) == angle/360) { /* fast path when we don't need rotation or flipping */
return SDL_RenderCopy(renderer, texture, srcrect, dstrect);
}
@@ -1749,6 +1787,11 @@ SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
return SDL_SetError("Renderer does not support RenderCopyEx");
}
+ /* Don't draw while we're hidden */
+ if (renderer->hidden) {
+ return 0;
+ }
+
real_srcrect.x = 0;
real_srcrect.y = 0;
real_srcrect.w = texture->w;
@@ -1772,8 +1815,9 @@ SDL_RenderCopyEx(SDL_Renderer * renderer, SDL_Texture * texture,
texture = texture->native;
}
- if(center) real_center = *center;
- else {
+ if (center) {
+ real_center = *center;
+ } else {
real_center.x = real_dstrect.w/2;
real_center.y = real_dstrect.h/2;
}