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

@ -39,6 +39,7 @@
static SDL_Renderer *SW_CreateRenderer(SDL_Window * window, Uint32 flags);
static void SW_WindowEvent(SDL_Renderer * renderer,
const SDL_WindowEvent *event);
static int SW_GetOutputSize(SDL_Renderer * renderer, int *w, int *h);
static int SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static int SW_SetTextureColorMod(SDL_Renderer * renderer,
SDL_Texture * texture);
@ -110,9 +111,14 @@ SW_ActivateRenderer(SDL_Renderer * renderer)
data->surface = data->window;
}
if (!data->surface) {
data->surface = data->window = SDL_GetWindowSurface(renderer->window);
SDL_Surface *surface = SDL_GetWindowSurface(renderer->window);
if (surface) {
data->surface = data->window = surface;
renderer->viewport.w = surface->w;
renderer->viewport.h = surface->h;
SW_UpdateViewport(renderer);
SW_UpdateViewport(renderer);
}
}
return data->surface;
}
@ -143,6 +149,7 @@ SW_CreateRendererForSurface(SDL_Surface * surface)
data->surface = surface;
renderer->WindowEvent = SW_WindowEvent;
renderer->GetOutputSize = SW_GetOutputSize;
renderer->CreateTexture = SW_CreateTexture;
renderer->SetTextureColorMod = SW_SetTextureColorMod;
renderer->SetTextureAlphaMod = SW_SetTextureAlphaMod;
@ -194,6 +201,25 @@ SW_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
}
}
static int
SW_GetOutputSize(SDL_Renderer * renderer, int *w, int *h)
{
SDL_Surface *surface = SW_ActivateRenderer(renderer);
if (surface) {
if (w) {
*w = surface->w;
}
if (h) {
*h = surface->h;
}
return 0;
} else {
SDL_SetError("Software renderer doesn't have an output surface");
return -1;
}
}
static int
SW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture)
{
@ -313,11 +339,6 @@ SW_UpdateViewport(SDL_Renderer * renderer)
return 0;
}
if (!renderer->viewport.w && !renderer->viewport.h) {
/* There may be no window, so update the viewport directly */
renderer->viewport.w = surface->w;
renderer->viewport.h = surface->h;
}
SDL_SetClipRect(data->surface, &renderer->viewport);
return 0;
}