Fixed bug 1622 - SDL_RenderSetViewport with empty SDL_Rect raises wrong error for OpenGL rendering backend

It's now legal to set an empty viewport rect - it will prevent any rendering.

Also added an API to query the output size: SDL_GetRendererOutputSize()
This commit is contained in:
Sam Lantinga 2013-05-29 03:07:55 -07:00
parent b337b40e33
commit c55f53aa40
8 changed files with 103 additions and 64 deletions

View file

@ -337,6 +337,25 @@ SDL_GetRendererInfo(SDL_Renderer * renderer, SDL_RendererInfo * info)
return 0;
}
int
SDL_GetRendererOutputSize(SDL_Renderer * renderer, int *w, int *h)
{
CHECK_RENDERER_MAGIC(renderer, -1);
if (renderer->target) {
return SDL_QueryTexture(renderer->target, NULL, NULL, w, h);
} else if (renderer->window) {
SDL_GetWindowSize(renderer->window, w, h);
return 0;
} else if (renderer->GetOutputSize) {
return renderer->GetOutputSize(renderer, w, h);
} else {
/* This should never happen */
SDL_SetError("Renderer doesn't support querying output size");
return -1;
}
}
static SDL_bool
IsSupportedFormat(SDL_Renderer * renderer, Uint32 format)
{
@ -985,13 +1004,8 @@ UpdateLogicalSize(SDL_Renderer *renderer)
float scale;
SDL_Rect viewport;
if (renderer->target) {
SDL_QueryTexture(renderer->target, NULL, NULL, &w, &h);
} else if (renderer->window) {
SDL_GetWindowSize(renderer->window, &w, &h);
} else {
/* FIXME */
return SDL_SetError("Internal error: No way to get output resolution");
if (SDL_GetRendererOutputSize(renderer, &w, &h) < 0) {
return -1;
}
want_aspect = (float)renderer->logical_w / renderer->logical_h;
@ -1074,16 +1088,8 @@ SDL_RenderSetViewport(SDL_Renderer * renderer, const SDL_Rect * rect)
} else {
renderer->viewport.x = 0;
renderer->viewport.y = 0;
if (renderer->target) {
SDL_QueryTexture(renderer->target, NULL, NULL,
&renderer->viewport.w, &renderer->viewport.h);
} else if (renderer->window) {
SDL_GetWindowSize(renderer->window,
&renderer->viewport.w, &renderer->viewport.h);
} else {
/* This will be filled in by UpdateViewport() */
renderer->viewport.w = 0;
renderer->viewport.h = 0;
if (SDL_GetRendererOutputSize(renderer, &renderer->viewport.w, &renderer->viewport.h) < 0) {
return -1;
}
}
return renderer->UpdateViewport(renderer);