Commit c804b92b authored by Sam Lantinga's avatar Sam Lantinga

Changed the concept of a render clip rect to a render viewport.

The render viewport is automatically re-centered when the window changes size, so applications that don't care will not have to handle recalculating their rendering coordinates.

Fixed API for drawing and filling multiple rectangles - the parameter should be an array of rects, not an array of pointers to rects.

Fixed API for updating window rects for consistency with other APIs - the order is pointer to array followed by count in array.
parent 32d70d6f
...@@ -364,17 +364,24 @@ extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture, ...@@ -364,17 +364,24 @@ extern DECLSPEC int SDLCALL SDL_LockTexture(SDL_Texture * texture,
extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture); extern DECLSPEC void SDLCALL SDL_UnlockTexture(SDL_Texture * texture);
/** /**
* \brief Set the clipping rectangle for rendering on the current target * \brief Set the drawing area for rendering on the current target.
* *
* \param rect The rectangle to clip rendering to, or NULL to disable clipping. * \param rect The rectangle representing the drawing area, or NULL to set the viewport to the entire target.
* *
* The contents of the window are not defined after calling * The x,y of the viewport rect represents the origin for rendering.
* SDL_RenderPresent(), so you should clear the clip rectangle and draw *
* over the entire window each frame. * \note When the window is resized, the current viewport is automatically
* centered within the new window size.
*/ */
extern DECLSPEC void SDLCALL SDL_RenderSetClipRect(SDL_Renderer * renderer, extern DECLSPEC int SDLCALL SDL_RenderSetViewport(SDL_Renderer * renderer,
const SDL_Rect * rect); const SDL_Rect * rect);
/**
* \brief Get the drawing area for the current target.
*/
extern DECLSPEC void SDLCALL SDL_RenderGetViewport(SDL_Renderer * renderer,
SDL_Rect * rect);
/** /**
* \brief Set the color used for drawing operations (Fill and Line). * \brief Set the color used for drawing operations (Fill and Line).
* *
...@@ -434,6 +441,8 @@ extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer, ...@@ -434,6 +441,8 @@ extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(SDL_Renderer * renderer,
/** /**
* \brief Clear the current rendering target with the drawing color * \brief Clear the current rendering target with the drawing color
*
* This function clears the entire rendering target, ignoring the viewport.
*/ */
extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer); extern DECLSPEC int SDLCALL SDL_RenderClear(SDL_Renderer * renderer);
...@@ -504,7 +513,7 @@ extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer, ...@@ -504,7 +513,7 @@ extern DECLSPEC int SDLCALL SDL_RenderDrawRect(SDL_Renderer * renderer,
* \return 0 on success, or -1 on error * \return 0 on success, or -1 on error
*/ */
extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer, extern DECLSPEC int SDLCALL SDL_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, const SDL_Rect * rects,
int count); int count);
/** /**
...@@ -527,7 +536,7 @@ extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer, ...@@ -527,7 +536,7 @@ extern DECLSPEC int SDLCALL SDL_RenderFillRect(SDL_Renderer * renderer,
* \return 0 on success, or -1 on error * \return 0 on success, or -1 on error
*/ */
extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer, extern DECLSPEC int SDLCALL SDL_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rect, const SDL_Rect * rect,
int count); int count);
/** /**
......
...@@ -374,7 +374,7 @@ extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height, ...@@ -374,7 +374,7 @@ extern DECLSPEC int SDLCALL SDL_ConvertPixels(int width, int height,
extern DECLSPEC int SDLCALL SDL_FillRect extern DECLSPEC int SDLCALL SDL_FillRect
(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color); (SDL_Surface * dst, const SDL_Rect * rect, Uint32 color);
extern DECLSPEC int SDLCALL SDL_FillRects extern DECLSPEC int SDLCALL SDL_FillRects
(SDL_Surface * dst, const SDL_Rect ** rects, int count, Uint32 color); (SDL_Surface * dst, const SDL_Rect * rects, int count, Uint32 color);
/** /**
* Performs a fast blit from the source surface to the destination surface. * Performs a fast blit from the source surface to the destination surface.
......
...@@ -581,8 +581,8 @@ extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window); ...@@ -581,8 +581,8 @@ extern DECLSPEC int SDLCALL SDL_UpdateWindowSurface(SDL_Window * window);
* \sa SDL_UpdateWindowSurfaceRect() * \sa SDL_UpdateWindowSurfaceRect()
*/ */
extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window, extern DECLSPEC int SDLCALL SDL_UpdateWindowSurfaceRects(SDL_Window * window,
int numrects, SDL_Rect * rects,
SDL_Rect * rects); int numrects);
/** /**
* \brief Set a window's input grab mode. * \brief Set a window's input grab mode.
......
...@@ -785,10 +785,10 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects) ...@@ -785,10 +785,10 @@ SDL_UpdateRects(SDL_Surface * screen, int numrects, SDL_Rect * rects)
stackrect->w = rect->w; stackrect->w = rect->w;
stackrect->h = rect->h; stackrect->h = rect->h;
} }
SDL_UpdateWindowSurfaceRects(SDL_VideoWindow, numrects, stackrects); SDL_UpdateWindowSurfaceRects(SDL_VideoWindow, stackrects, numrects);
SDL_stack_free(stackrects); SDL_stack_free(stackrects);
} else { } else {
SDL_UpdateWindowSurfaceRects(SDL_VideoWindow, numrects, rects); SDL_UpdateWindowSurfaceRects(SDL_VideoWindow, rects, numrects);
} }
} }
} }
......
...@@ -89,11 +89,26 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event) ...@@ -89,11 +89,26 @@ SDL_RendererEventWatch(void *userdata, SDL_Event *event)
{ {
SDL_Renderer *renderer = (SDL_Renderer *)userdata; SDL_Renderer *renderer = (SDL_Renderer *)userdata;
if (event->type == SDL_WINDOWEVENT && renderer->WindowEvent) { if (event->type == SDL_WINDOWEVENT) {
SDL_Window *window = SDL_GetWindowFromID(event->window.windowID); SDL_Window *window = SDL_GetWindowFromID(event->window.windowID);
if (window == renderer->window) { if (window == renderer->window) {
if (renderer->WindowEvent) {
renderer->WindowEvent(renderer, &event->window); renderer->WindowEvent(renderer, &event->window);
} }
if (event->window.event == SDL_WINDOWEVENT_SIZE_CHANGED) {
/* Try to keep the previous viewport centered */
int w, h;
SDL_Rect viewport;
SDL_GetWindowSize(window, &w, &h);
viewport.x = (w - renderer->viewport.w) / 2;
viewport.y = (h - renderer->viewport.h) / 2;
viewport.w = renderer->viewport.w;
viewport.h = renderer->viewport.h;
SDL_RenderSetViewport(renderer, &viewport);
}
}
} }
return 0; return 0;
} }
...@@ -160,6 +175,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags) ...@@ -160,6 +175,8 @@ SDL_CreateRenderer(SDL_Window * window, int index, Uint32 flags)
renderer->magic = &renderer_magic; renderer->magic = &renderer_magic;
renderer->window = window; renderer->window = window;
SDL_RenderSetViewport(renderer, NULL);
SDL_AddEventWatch(SDL_RendererEventWatch, renderer); SDL_AddEventWatch(SDL_RendererEventWatch, renderer);
SDL_LogInfo(SDL_LOG_CATEGORY_RENDER, SDL_LogInfo(SDL_LOG_CATEGORY_RENDER,
...@@ -172,7 +189,16 @@ SDL_Renderer * ...@@ -172,7 +189,16 @@ SDL_Renderer *
SDL_CreateSoftwareRenderer(SDL_Surface * surface) SDL_CreateSoftwareRenderer(SDL_Surface * surface)
{ {
#if !SDL_RENDER_DISABLED #if !SDL_RENDER_DISABLED
return SW_CreateRendererForSurface(surface); SDL_Renderer *renderer;
renderer = SW_CreateRendererForSurface(surface);
if (renderer) {
renderer->magic = &renderer_magic;
SDL_RenderSetViewport(renderer, NULL);
}
return renderer;
#else #else
SDL_SetError("SDL not built with rendering support"); SDL_SetError("SDL not built with rendering support");
return NULL; return NULL;
...@@ -342,12 +368,13 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface) ...@@ -342,12 +368,13 @@ SDL_CreateTextureFromSurface(SDL_Renderer * renderer, SDL_Surface * surface)
SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch); SDL_UpdateTexture(texture, NULL, surface->pixels, surface->pitch);
} }
} else { } else {
SDL_PixelFormat dst_fmt; SDL_PixelFormat *dst_fmt;
SDL_Surface *temp = NULL; SDL_Surface *temp = NULL;
/* Set up a destination surface for the texture update */ /* Set up a destination surface for the texture update */
SDL_InitFormat(&dst_fmt, format); dst_fmt = SDL_AllocFormat(format);
temp = SDL_ConvertSurface(surface, &dst_fmt, 0); temp = SDL_ConvertSurface(surface, dst_fmt, 0);
SDL_FreeFormat(dst_fmt);
if (temp) { if (temp) {
SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch); SDL_UpdateTexture(texture, NULL, temp->pixels, temp->pitch);
SDL_FreeSurface(temp); SDL_FreeSurface(temp);
...@@ -733,12 +760,34 @@ SDL_UnlockTexture(SDL_Texture * texture) ...@@ -733,12 +760,34 @@ SDL_UnlockTexture(SDL_Texture * texture)
} }
} }
int
SDL_RenderSetViewport(SDL_Renderer * renderer, const SDL_Rect * rect)
{
CHECK_RENDERER_MAGIC(renderer, -1);
if (rect) {
renderer->viewport = *rect;
} else {
renderer->viewport.x = 0;
renderer->viewport.y = 0;
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;
}
}
return renderer->UpdateViewport(renderer);
}
void void
SDL_RenderSetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect) SDL_RenderGetViewport(SDL_Renderer * renderer, SDL_Rect * rect)
{ {
CHECK_RENDERER_MAGIC(renderer, ); CHECK_RENDERER_MAGIC(renderer, );
renderer->SetClipRect(renderer, rect); *rect = renderer->viewport;
} }
int int
...@@ -884,7 +933,8 @@ SDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -884,7 +933,8 @@ SDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect)
full_rect.x = 0; full_rect.x = 0;
full_rect.y = 0; full_rect.y = 0;
SDL_GetWindowSize(window, &full_rect.w, &full_rect.h); full_rect.w = renderer->viewport.w;
full_rect.h = renderer->viewport.h;
rect = &full_rect; rect = &full_rect;
} }
...@@ -903,7 +953,7 @@ SDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect) ...@@ -903,7 +953,7 @@ SDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect)
int int
SDL_RenderDrawRects(SDL_Renderer * renderer, SDL_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count) const SDL_Rect * rects, int count)
{ {
int i; int i;
...@@ -917,9 +967,8 @@ SDL_RenderDrawRects(SDL_Renderer * renderer, ...@@ -917,9 +967,8 @@ SDL_RenderDrawRects(SDL_Renderer * renderer,
return 0; return 0;
} }
/* Check for NULL rect, which means fill entire window */
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
if (SDL_RenderDrawRect(renderer, rects[i]) < 0) { if (SDL_RenderDrawRect(renderer, &rects[i]) < 0) {
return -1; return -1;
} }
} }
...@@ -929,15 +978,13 @@ SDL_RenderDrawRects(SDL_Renderer * renderer, ...@@ -929,15 +978,13 @@ SDL_RenderDrawRects(SDL_Renderer * renderer,
int int
SDL_RenderFillRect(SDL_Renderer * renderer, const SDL_Rect * rect) SDL_RenderFillRect(SDL_Renderer * renderer, const SDL_Rect * rect)
{ {
return SDL_RenderFillRects(renderer, &rect, 1); return SDL_RenderFillRects(renderer, rect, 1);
} }
int int
SDL_RenderFillRects(SDL_Renderer * renderer, SDL_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count) const SDL_Rect * rects, int count)
{ {
int i;
CHECK_RENDERER_MAGIC(renderer, -1); CHECK_RENDERER_MAGIC(renderer, -1);
if (!rects) { if (!rects) {
...@@ -947,21 +994,6 @@ SDL_RenderFillRects(SDL_Renderer * renderer, ...@@ -947,21 +994,6 @@ SDL_RenderFillRects(SDL_Renderer * renderer,
if (count < 1) { if (count < 1) {
return 0; return 0;
} }
/* Check for NULL rect, which means fill entire window */
for (i = 0; i < count; ++i) {
if (rects[i] == NULL) {
SDL_Window *window = renderer->window;
SDL_Rect full_rect;
const SDL_Rect *rect;
full_rect.x = 0;
full_rect.y = 0;
SDL_GetWindowSize(window, &full_rect.w, &full_rect.h);
rect = &full_rect;
return renderer->RenderFillRects(renderer, &rect, 1);
}
}
return renderer->RenderFillRects(renderer, rects, count); return renderer->RenderFillRects(renderer, rects, count);
} }
...@@ -994,7 +1026,8 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -994,7 +1026,8 @@ SDL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
real_dstrect.x = 0; real_dstrect.x = 0;
real_dstrect.y = 0; real_dstrect.y = 0;
SDL_GetWindowSize(window, &real_dstrect.w, &real_dstrect.h); real_dstrect.w = renderer->viewport.w;
real_dstrect.h = renderer->viewport.h;
if (dstrect) { if (dstrect) {
if (!SDL_IntersectRect(dstrect, &real_dstrect, &real_dstrect)) { if (!SDL_IntersectRect(dstrect, &real_dstrect, &real_dstrect)) {
return 0; return 0;
...@@ -1043,7 +1076,8 @@ SDL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, ...@@ -1043,7 +1076,8 @@ SDL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
real_rect.x = 0; real_rect.x = 0;
real_rect.y = 0; real_rect.y = 0;
SDL_GetWindowSize(window, &real_rect.w, &real_rect.h); real_rect.w = renderer->viewport.w;
real_rect.h = renderer->viewport.h;
if (rect) { if (rect) {
if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) { if (!SDL_IntersectRect(rect, &real_rect, &real_rect)) {
return 0; return 0;
......
...@@ -78,13 +78,13 @@ struct SDL_Renderer ...@@ -78,13 +78,13 @@ struct SDL_Renderer
int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture, int (*LockTexture) (SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, void **pixels, int *pitch); const SDL_Rect * rect, void **pixels, int *pitch);
void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture); void (*UnlockTexture) (SDL_Renderer * renderer, SDL_Texture * texture);
void (*SetClipRect) (SDL_Renderer * renderer, const SDL_Rect *rect); int (*UpdateViewport) (SDL_Renderer * renderer);
int (*RenderClear) (SDL_Renderer * renderer); int (*RenderClear) (SDL_Renderer * renderer);
int (*RenderDrawPoints) (SDL_Renderer * renderer, const SDL_Point * points, int (*RenderDrawPoints) (SDL_Renderer * renderer, const SDL_Point * points,
int count); int count);
int (*RenderDrawLines) (SDL_Renderer * renderer, const SDL_Point * points, int (*RenderDrawLines) (SDL_Renderer * renderer, const SDL_Point * points,
int count); int count);
int (*RenderFillRects) (SDL_Renderer * renderer, const SDL_Rect ** rects, int (*RenderFillRects) (SDL_Renderer * renderer, const SDL_Rect * rects,
int count); int count);
int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture, int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect); const SDL_Rect * srcrect, const SDL_Rect * dstrect);
...@@ -101,6 +101,9 @@ struct SDL_Renderer ...@@ -101,6 +101,9 @@ struct SDL_Renderer
/* The window associated with the renderer */ /* The window associated with the renderer */
SDL_Window *window; SDL_Window *window;
/* The drawable area within the window */
SDL_Rect viewport;
/* The list of textures */ /* The list of textures */
SDL_Texture *textures; SDL_Texture *textures;
......
This diff is collapsed.
...@@ -55,14 +55,14 @@ static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -55,14 +55,14 @@ static int GL_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture,
static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, void **pixels, int *pitch); const SDL_Rect * rect, void **pixels, int *pitch);
static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture);
static void GL_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect); static int GL_UpdateViewport(SDL_Renderer * renderer);
static int GL_RenderClear(SDL_Renderer * renderer); static int GL_RenderClear(SDL_Renderer * renderer);
static int GL_RenderDrawPoints(SDL_Renderer * renderer, static int GL_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count); const SDL_Point * points, int count);
static int GL_RenderDrawLines(SDL_Renderer * renderer, static int GL_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count); const SDL_Point * points, int count);
static int GL_RenderFillRects(SDL_Renderer * renderer, static int GL_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count); const SDL_Rect * rects, int count);
static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect); const SDL_Rect * srcrect, const SDL_Rect * dstrect);
static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
...@@ -86,7 +86,6 @@ SDL_RenderDriver GL_RenderDriver = { ...@@ -86,7 +86,6 @@ SDL_RenderDriver GL_RenderDriver = {
typedef struct typedef struct
{ {
SDL_GLContext context; SDL_GLContext context;
SDL_bool updateSize;
SDL_bool GL_ARB_texture_rectangle_supported; SDL_bool GL_ARB_texture_rectangle_supported;
int blendMode; int blendMode;
...@@ -185,6 +184,24 @@ GL_LoadFunctions(GL_RenderData * data) ...@@ -185,6 +184,24 @@ GL_LoadFunctions(GL_RenderData * data)
return 0; return 0;
} }
static SDL_GLContext SDL_CurrentContext = NULL;
static int
GL_ActivateRenderer(SDL_Renderer * renderer)
{
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
if (SDL_CurrentContext != data->context) {
if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {
return -1;
}
SDL_CurrentContext = data->context;
GL_UpdateViewport(renderer);
}
return 0;
}
SDL_Renderer * SDL_Renderer *
GL_CreateRenderer(SDL_Window * window, Uint32 flags) GL_CreateRenderer(SDL_Window * window, Uint32 flags)
{ {
...@@ -219,7 +236,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -219,7 +236,7 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->UpdateTexture = GL_UpdateTexture; renderer->UpdateTexture = GL_UpdateTexture;
renderer->LockTexture = GL_LockTexture; renderer->LockTexture = GL_LockTexture;
renderer->UnlockTexture = GL_UnlockTexture; renderer->UnlockTexture = GL_UnlockTexture;
renderer->SetClipRect = GL_SetClipRect; renderer->UpdateViewport = GL_UpdateViewport;
renderer->RenderClear = GL_RenderClear; renderer->RenderClear = GL_RenderClear;
renderer->RenderDrawPoints = GL_RenderDrawPoints; renderer->RenderDrawPoints = GL_RenderDrawPoints;
renderer->RenderDrawLines = GL_RenderDrawLines; renderer->RenderDrawLines = GL_RenderDrawLines;
...@@ -230,9 +247,8 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -230,9 +247,8 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DestroyTexture = GL_DestroyTexture; renderer->DestroyTexture = GL_DestroyTexture;
renderer->DestroyRenderer = GL_DestroyRenderer; renderer->DestroyRenderer = GL_DestroyRenderer;
renderer->info = GL_RenderDriver.info; renderer->info = GL_RenderDriver.info;
renderer->driverdata = data;
renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->info.flags = SDL_RENDERER_ACCELERATED;
renderer->driverdata = data;
data->context = SDL_GL_CreateContext(window); data->context = SDL_GL_CreateContext(window);
if (!data->context) { if (!data->context) {
...@@ -309,38 +325,10 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -309,38 +325,10 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
data->glDisable(GL_CULL_FACE); data->glDisable(GL_CULL_FACE);
/* This ended up causing video discrepancies between OpenGL and Direct3D */ /* This ended up causing video discrepancies between OpenGL and Direct3D */
/*data->glEnable(GL_LINE_SMOOTH);*/ /*data->glEnable(GL_LINE_SMOOTH);*/
data->updateSize = SDL_TRUE;
return renderer;
}
static SDL_GLContext SDL_CurrentContext = NULL;
static int
GL_ActivateRenderer(SDL_Renderer * renderer)
{
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
SDL_Window *window = renderer->window;
if (SDL_CurrentContext != data->context) {
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
return -1;
}
SDL_CurrentContext = data->context;
}
if (data->updateSize) {
int w, h;
SDL_GetWindowSize(window, &w, &h);
data->glMatrixMode(GL_PROJECTION);
data->glLoadIdentity();
data->glMatrixMode(GL_MODELVIEW); data->glMatrixMode(GL_MODELVIEW);
data->glLoadIdentity(); data->glLoadIdentity();
data->glViewport(0, 0, w, h);
data->glOrtho(0.0, (GLdouble) w, (GLdouble) h, 0.0, 0.0, 1.0); return renderer;
data->updateSize = SDL_FALSE;
}
return 0;
} }
static void static void
...@@ -351,7 +339,6 @@ GL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) ...@@ -351,7 +339,6 @@ GL_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
/* Rebind the context to the window area and update matrices */ /* Rebind the context to the window area and update matrices */
SDL_CurrentContext = NULL; SDL_CurrentContext = NULL;
data->updateSize = SDL_TRUE;
} }
} }
...@@ -622,22 +609,26 @@ GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -622,22 +609,26 @@ GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch); GL_UpdateTexture(renderer, texture, rect, pixels, data->pitch);
} }
static void static int
GL_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect) GL_UpdateViewport(SDL_Renderer * renderer)
{ {
GL_RenderData *data = (GL_RenderData *) renderer->driverdata; GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
GL_ActivateRenderer(renderer); if (SDL_CurrentContext != data->context) {
/* We'll update the viewport after we rebind the context */
return 0;
}
if (rect) { data->glViewport(renderer->viewport.x, renderer->viewport.y,
int w, h; renderer->viewport.w, renderer->viewport.h);
SDL_GetWindowSize(renderer->window, &w, &h); data->glMatrixMode(GL_PROJECTION);
data->glScissor(rect->x, (h-(rect->y+rect->h)), rect->w, rect->h); data->glLoadIdentity();
data->glEnable(GL_SCISSOR_TEST); data->glOrtho((GLdouble) 0,
} else { (GLdouble) renderer->viewport.w,
data->glDisable(GL_SCISSOR_TEST); (GLdouble) renderer->viewport.h,
} (GLdouble) 0, 0.0, 1.0);
return 0;
} }
static void static void
...@@ -785,7 +776,7 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, ...@@ -785,7 +776,7 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
} }
static int static int
GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects, int count)
{ {
GL_RenderData *data = (GL_RenderData *) renderer->driverdata; GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
int i; int i;
...@@ -801,7 +792,7 @@ GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) ...@@ -801,7 +792,7 @@ GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
(GLfloat) renderer->a * inv255f); (GLfloat) renderer->a * inv255f);
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
const SDL_Rect *rect = rects[i]; const SDL_Rect *rect = &rects[i];
data->glRecti(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h); data->glRecti(rect->x, rect->y, rect->x + rect->w, rect->y + rect->h);
} }
......
...@@ -53,13 +53,13 @@ static int GLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, ...@@ -53,13 +53,13 @@ static int GLES_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * rect, void **pixels, int *pitch); const SDL_Rect * rect, void **pixels, int *pitch);
static void GLES_UnlockTexture(SDL_Renderer * renderer, static void GLES_UnlockTexture(SDL_Renderer * renderer,
SDL_Texture * texture); SDL_Texture * texture);
static void GLES_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect); static int GLES_UpdateViewport(SDL_Renderer * renderer);
static int GLES_RenderDrawPoints(SDL_Renderer * renderer, static int GLES_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count); const SDL_Point * points, int count);
static int GLES_RenderDrawLines(SDL_Renderer * renderer, static int GLES_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count); const SDL_Point * points, int count);
static int GLES_RenderFillRects(SDL_Renderer * renderer, static int GLES_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count); const SDL_Rect * rects, int count);
static int GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, static int GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * srcrect,
const SDL_Rect * dstrect); const SDL_Rect * dstrect);
...@@ -83,7 +83,6 @@ SDL_RenderDriver GLES_RenderDriver = { ...@@ -83,7 +83,6 @@ SDL_RenderDriver GLES_RenderDriver = {
typedef struct typedef struct
{ {
SDL_GLContext context; SDL_GLContext context;
SDL_bool updateSize;
int blendMode; int blendMode;
SDL_bool useDrawTexture; SDL_bool useDrawTexture;
...@@ -136,6 +135,24 @@ GLES_SetError(const char *prefix, GLenum result) ...@@ -136,6 +135,24 @@ GLES_SetError(const char *prefix, GLenum result)
SDL_SetError("%s: %s", prefix, error); SDL_SetError("%s: %s", prefix, error);
} }
static SDL_GLContext SDL_CurrentContext = NULL;
static int
GLES_ActivateRenderer(SDL_Renderer * renderer)
{
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
if (SDL_CurrentContext != data->context) {
if (SDL_GL_MakeCurrent(renderer->window, data->context) < 0) {
return -1;
}
SDL_CurrentContext = data->context;
GLES_UpdateViewport(renderer);
}
return 0;
}
SDL_Renderer * SDL_Renderer *
GLES_CreateRenderer(SDL_Window * window, Uint32 flags) GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
{ {
...@@ -162,7 +179,7 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -162,7 +179,7 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->UpdateTexture = GLES_UpdateTexture; renderer->UpdateTexture = GLES_UpdateTexture;
renderer->LockTexture = GLES_LockTexture; renderer->LockTexture = GLES_LockTexture;
renderer->UnlockTexture = GLES_UnlockTexture; renderer->UnlockTexture = GLES_UnlockTexture;
renderer->SetClipRect = GLES_SetClipRect; renderer->UpdateViewport = GLES_UpdateViewport;
renderer->RenderDrawPoints = GLES_RenderDrawPoints; renderer->RenderDrawPoints = GLES_RenderDrawPoints;
renderer->RenderDrawLines = GLES_RenderDrawLines; renderer->RenderDrawLines = GLES_RenderDrawLines;
renderer->RenderFillRects = GLES_RenderFillRects; renderer->RenderFillRects = GLES_RenderFillRects;
...@@ -171,9 +188,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -171,9 +188,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DestroyTexture = GLES_DestroyTexture; renderer->DestroyTexture = GLES_DestroyTexture;
renderer->DestroyRenderer = GLES_DestroyRenderer; renderer->DestroyRenderer = GLES_DestroyRenderer;
renderer->info = GLES_RenderDriver.info; renderer->info = GLES_RenderDriver.info;
renderer->driverdata = data;
renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->info.flags = SDL_RENDERER_ACCELERATED;
renderer->driverdata = data;
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 1);
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 1);
...@@ -219,7 +235,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -219,7 +235,8 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
data->blendMode = -1; data->blendMode = -1;
glDisable(GL_DEPTH_TEST); glDisable(GL_DEPTH_TEST);
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
data->updateSize = SDL_TRUE; glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY); glEnableClientState(GL_TEXTURE_COORD_ARRAY);
...@@ -227,35 +244,6 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags) ...@@ -227,35 +244,6 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
return renderer; return renderer;
} }
static SDL_GLContext SDL_CurrentContext = NULL;
static int
GLES_ActivateRenderer(SDL_Renderer * renderer)
{
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
SDL_Window *window = renderer->window;
if (SDL_CurrentContext != data->context) {
if (SDL_GL_MakeCurrent(window, data->context) < 0) {
return -1;
}
SDL_CurrentContext = data->context;
}
if (data->updateSize) {
int w, h;
SDL_GetWindowSize(window, &w, &h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, w, h);
glOrthof(0.0, (GLfloat) w, (GLfloat) h, 0.0, 0.0, 1.0);
data->updateSize = SDL_FALSE;
}
return 0;
}
static void static void
GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
{ {
...@@ -264,7 +252,6 @@ GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) ...@@ -264,7 +252,6 @@ GLES_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
/* Rebind the context to the window area and update matrices */ /* Rebind the context to the window area and update matrices */
SDL_CurrentContext = NULL; SDL_CurrentContext = NULL;
data->updateSize = SDL_TRUE;
} }
} }
...@@ -444,20 +431,26 @@ GLES_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) ...@@ -444,20 +431,26 @@ GLES_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture)
GLES_UpdateTexture(renderer, texture, &rect, data->pixels, data->pitch); GLES_UpdateTexture(renderer, texture, &rect, data->pixels, data->pitch);
} }
static void static int
GLES_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect) GLES_UpdateViewport(SDL_Renderer * renderer)
{ {
GLES_ActivateRenderer(renderer); GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
if (rect) {
int w, h;
SDL_GetWindowSize(renderer->window, &w, &h); if (SDL_CurrentContext != data->context) {
glScissor(rect->x, (h-(rect->y+rect->h)), rect->w, rect->h); /* We'll update the viewport after we rebind the context */
glEnable(GL_SCISSOR_TEST); return 0;
} else {
glDisable(GL_SCISSOR_TEST);
} }
glViewport(renderer->viewport.x, renderer->viewport.y,
renderer->viewport.w, renderer->viewport.h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof((GLfloat) 0,
(GLfloat) renderer->viewport.w,
(GLfloat) renderer->viewport.h,
(GLfloat) 0, 0.0, 1.0);
return 0;
} }
static void static void
...@@ -555,7 +548,7 @@ GLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, ...@@ -555,7 +548,7 @@ GLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
} }
static int static int
GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect * rects,
int count) int count)
{ {
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata; GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
...@@ -571,7 +564,7 @@ GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, ...@@ -571,7 +564,7 @@ GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
(GLfloat) renderer->a * inv255f); (GLfloat) renderer->a * inv255f);
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
const SDL_Rect *rect = rects[i]; const SDL_Rect *rect = &rects[i];
GLshort minx = rect->x; GLshort minx = rect->x;
GLshort maxx = rect->x + rect->w; GLshort maxx = rect->x + rect->w;
GLshort miny = rect->y; GLshort miny = rect->y;
......
...@@ -123,7 +123,6 @@ typedef struct GLES2_DriverContext ...@@ -123,7 +123,6 @@ typedef struct GLES2_DriverContext
GLES2_ShaderCache shader_cache; GLES2_ShaderCache shader_cache;
GLES2_ProgramCache program_cache; GLES2_ProgramCache program_cache;
GLES2_ProgramCacheEntry *current_program; GLES2_ProgramCacheEntry *current_program;
SDL_bool updateSize;
} GLES2_DriverContext; } GLES2_DriverContext;
#define GLES2_MAX_CACHED_PROGRAMS 8 #define GLES2_MAX_CACHED_PROGRAMS 8
...@@ -135,7 +134,7 @@ typedef struct GLES2_DriverContext ...@@ -135,7 +134,7 @@ typedef struct GLES2_DriverContext
static int GLES2_ActivateRenderer(SDL_Renderer *renderer); static int GLES2_ActivateRenderer(SDL_Renderer *renderer);
static void GLES2_WindowEvent(SDL_Renderer * renderer, static void GLES2_WindowEvent(SDL_Renderer * renderer,
const SDL_WindowEvent *event); const SDL_WindowEvent *event);
static void GLES2_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect); static int GLES2_UpdateViewport(SDL_Renderer * renderer);
static void GLES2_DestroyRenderer(SDL_Renderer *renderer); static void GLES2_DestroyRenderer(SDL_Renderer *renderer);
static SDL_GLContext SDL_CurrentContext = NULL; static SDL_GLContext SDL_CurrentContext = NULL;
...@@ -144,23 +143,17 @@ static int ...@@ -144,23 +143,17 @@ static int
GLES2_ActivateRenderer(SDL_Renderer * renderer) GLES2_ActivateRenderer(SDL_Renderer * renderer)
{ {
GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata;
SDL_Window *window = renderer->window;
if (SDL_CurrentContext != rdata->context) { if (SDL_CurrentContext != rdata->context) {
/* Null out the current program to ensure we set it again */ /* Null out the current program to ensure we set it again */
rdata->current_program = NULL; rdata->current_program = NULL;
if (SDL_GL_MakeCurrent(window, rdata->context) < 0) { if (SDL_GL_MakeCurrent(renderer->window, rdata->context) < 0) {
return -1; return -1;
} }
SDL_CurrentContext = rdata->context; SDL_CurrentContext = rdata->context;
}
if (rdata->updateSize) {
int w, h;
SDL_GetWindowSize(window, &w, &h); GLES2_UpdateViewport(renderer);
glViewport(0, 0, w, h);
rdata->updateSize = SDL_FALSE;
} }
return 0; return 0;
} }
...@@ -173,24 +166,22 @@ GLES2_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event) ...@@ -173,24 +166,22 @@ GLES2_WindowEvent(SDL_Renderer * renderer, const SDL_WindowEvent *event)
if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) { if (event->event == SDL_WINDOWEVENT_SIZE_CHANGED) {
/* Rebind the context to the window area */ /* Rebind the context to the window area */
SDL_CurrentContext = NULL; SDL_CurrentContext = NULL;
rdata->updateSize = SDL_TRUE;
} }
} }
static void static int
GLES2_SetClipRect(SDL_Renderer * renderer, const SDL_Rect * rect) GLES2_UpdateViewport(SDL_Renderer * renderer)
{ {
GLES2_ActivateRenderer(renderer); GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata;
if (rect) {
int w, h;
SDL_GetWindowSize(renderer->window, &w, &h); if (SDL_CurrentContext != rdata->context) {
glScissor(rect->x, (h-(rect->y+rect->h)), rect->w, rect->h); /* We'll update the viewport after we rebind the context */
glEnable(GL_SCISSOR_TEST); return 0;
} else {
glDisable(GL_SCISSOR_TEST);
} }
glViewport(renderer->viewport.x, renderer->viewport.y,
renderer->viewport.w, renderer->viewport.h);
return 0;
} }
static void static void
...@@ -735,21 +726,16 @@ static int ...@@ -735,21 +726,16 @@ static int
GLES2_SetOrthographicProjection(SDL_Renderer *renderer) GLES2_SetOrthographicProjection(SDL_Renderer *renderer)
{ {
GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata;
SDL_Window *window = renderer->window;
int w, h;
GLfloat projection[4][4]; GLfloat projection[4][4];
GLuint locProjection; GLuint locProjection;
/* Get the window width and height */
SDL_GetWindowSize(window, &w, &h);
/* Prepare an orthographic projection */ /* Prepare an orthographic projection */
projection[0][0] = 2.0f / w; projection[0][0] = 2.0f / renderer->viewport.w;
projection[0][1] = 0.0f; projection[0][1] = 0.0f;
projection[0][2] = 0.0f; projection[0][2] = 0.0f;
projection[0][3] = 0.0f; projection[0][3] = 0.0f;
projection[1][0] = 0.0f; projection[1][0] = 0.0f;
projection[1][1] = -2.0f / h; projection[1][1] = -2.0f / renderer->viewport.h;
projection[1][2] = 0.0f; projection[1][2] = 0.0f;
projection[1][3] = 0.0f; projection[1][3] = 0.0f;
projection[2][0] = 0.0f; projection[2][0] = 0.0f;
...@@ -782,7 +768,7 @@ static const float inv255f = 1.0f / 255.0f; ...@@ -782,7 +768,7 @@ static const float inv255f = 1.0f / 255.0f;
static int GLES2_RenderClear(SDL_Renderer *renderer); static int GLES2_RenderClear(SDL_Renderer *renderer);
static int GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int count); static int GLES2_RenderDrawPoints(SDL_Renderer *renderer, const SDL_Point *points, int count);
static int GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count); static int GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count);
static int GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect **rects, int count); static int GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count);
static int GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect, static int GLES2_RenderCopy(SDL_Renderer *renderer, SDL_Texture *texture, const SDL_Rect *srcrect,
const SDL_Rect *dstrect); const SDL_Rect *dstrect);
static void GLES2_RenderPresent(SDL_Renderer *renderer); static void GLES2_RenderPresent(SDL_Renderer *renderer);
...@@ -936,7 +922,7 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count ...@@ -936,7 +922,7 @@ GLES2_RenderDrawLines(SDL_Renderer *renderer, const SDL_Point *points, int count
} }
static int static int
GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect **rects, int count) GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect *rects, int count)
{ {
GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata; GLES2_DriverContext *rdata = (GLES2_DriverContext *)renderer->driverdata;
GLfloat vertices[8]; GLfloat vertices[8];
...@@ -968,12 +954,13 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect **rects, int count) ...@@ -968,12 +954,13 @@ GLES2_RenderFillRects(SDL_Renderer *renderer, const SDL_Rect **rects, int count)
/* Emit a line loop for each rectangle */ /* Emit a line loop for each rectangle */
glEnableVertexAttribArray(GLES2_ATTRIBUTE_POSITION); glEnableVertexAttribArray(GLES2_ATTRIBUTE_POSITION);
for (idx = 0; idx < count; ++idx) for (idx = 0; idx < count; ++idx) {
{ const SDL_Rect *rect = &rects[idx];
GLfloat xMin = (GLfloat)rects[idx]->x;
GLfloat xMax = (GLfloat)(rects[idx]->x + rects[idx]->w); GLfloat xMin = (GLfloat)rect->x;
GLfloat yMin = (GLfloat)rects[idx]->y; GLfloat xMax = (GLfloat)(rect->x + rect->w);
GLfloat yMax = (GLfloat)(rects[idx]->y + rects[idx]->h); GLfloat yMin = (GLfloat)rect->y;
GLfloat yMax = (GLfloat)(rect->y + rect->h);
vertices[0] = xMin; vertices[0] = xMin;
vertices[1] = yMin; vertices[1] = yMin;
...@@ -1108,10 +1095,8 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags) ...@@ -1108,10 +1095,8 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
return NULL; return NULL;
} }
renderer->info = GLES2_RenderDriver.info; renderer->info = GLES2_RenderDriver.info;
renderer->window = window;
renderer->driverdata = rdata;
renderer->info.flags = SDL_RENDERER_ACCELERATED; renderer->info.flags = SDL_RENDERER_ACCELERATED;
renderer->driverdata = rdata;
/* Create an OpenGL ES 2.0 context */ /* Create an OpenGL ES 2.0 context */
SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 2);
...@@ -1170,15 +1155,13 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags) ...@@ -1170,15 +1155,13 @@ GLES2_CreateRenderer(SDL_Window *window, Uint32 flags)
rdata->shader_formats[nFormats - 1] = (GLenum)-1; rdata->shader_formats[nFormats - 1] = (GLenum)-1;
#endif /* ZUNE_HD */ #endif /* ZUNE_HD */
rdata->updateSize = SDL_TRUE;
/* Populate the function pointers for the module */ /* Populate the function pointers for the module */
renderer->WindowEvent = &GLES2_WindowEvent; renderer->WindowEvent = &GLES2_WindowEvent;
renderer->CreateTexture = &GLES2_CreateTexture; renderer->CreateTexture = &GLES2_CreateTexture;
renderer->UpdateTexture = &GLES2_UpdateTexture; renderer->UpdateTexture = &GLES2_UpdateTexture;
renderer->LockTexture = &GLES2_LockTexture; renderer->LockTexture = &GLES2_LockTexture;
renderer->UnlockTexture = &GLES2_UnlockTexture; renderer->UnlockTexture = &GLES2_UnlockTexture;
renderer->SetClipRect = &GLES2_SetClipRect; renderer->UpdateViewport = &GLES2_UpdateViewport;
renderer->RenderClear = &GLES2_RenderClear; renderer->RenderClear = &GLES2_RenderClear;
renderer->RenderDrawPoints = &GLES2_RenderDrawPoints; renderer->RenderDrawPoints = &GLES2_RenderDrawPoints;
renderer->RenderDrawLines = &GLES2_RenderDrawLines; renderer->RenderDrawLines = &GLES2_RenderDrawLines;
......
...@@ -265,10 +265,10 @@ SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect, ...@@ -265,10 +265,10 @@ SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect,
} }
int int
SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect * rects, int count,
SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_Rect clipped; SDL_Rect rect;
int i; int i;
int (*func)(SDL_Surface * dst, const SDL_Rect * rect, int (*func)(SDL_Surface * dst, const SDL_Rect * rect,
SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL; SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) = NULL;
...@@ -329,20 +329,11 @@ SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, ...@@ -329,20 +329,11 @@ SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count,
} }
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
const SDL_Rect * rect = rects[i];
/* If 'rect' == NULL, then fill the whole surface */
if (rect) {
/* Perform clipping */ /* Perform clipping */
if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) { if (!SDL_IntersectRect(&rects[i], &dst->clip_rect, &rect)) {
continue; continue;
} }
rect = &clipped; status = func(dst, &rect, blendMode, r, g, b, a);
} else {
rect = &dst->clip_rect;
}
status = func(dst, rect, blendMode, r, g, b, a);
} }
return status; return status;
} }
......
...@@ -23,6 +23,6 @@ ...@@ -23,6 +23,6 @@
extern int SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); extern int SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
extern int SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); extern int SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect * rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
This diff is collapsed.
...@@ -417,14 +417,19 @@ SDL_FillRect(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color) ...@@ -417,14 +417,19 @@ SDL_FillRect(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color)
} }
int int
SDL_FillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, SDL_FillRects(SDL_Surface * dst, const SDL_Rect * rects, int count,
Uint32 color) Uint32 color)
{ {
int i; int i;
int status = 0; int status = 0;
if (!rects) {
SDL_SetError("SDL_FillRects() passed NULL rects");
return -1;
}
for (i = 0; i < count; ++i) { for (i = 0; i < count; ++i) {
status = SDL_FillRect(dst, rects[i], color); status += SDL_FillRect(dst, &rects[i], color);
} }
return status; return status;
} }
......
...@@ -185,7 +185,7 @@ struct SDL_VideoDevice ...@@ -185,7 +185,7 @@ struct SDL_VideoDevice
void (*SetWindowGrab) (_THIS, SDL_Window * window); void (*SetWindowGrab) (_THIS, SDL_Window * window);
void (*DestroyWindow) (_THIS, SDL_Window * window); void (*DestroyWindow) (_THIS, SDL_Window * window);
int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); int (*CreateWindowFramebuffer) (_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, int numrects, SDL_Rect * rects); int (*UpdateWindowFramebuffer) (_THIS, SDL_Window * window, SDL_Rect * rects, int numrects);
void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window); void (*DestroyWindowFramebuffer) (_THIS, SDL_Window * window);
/* * * */ /* * * */
......
...@@ -300,11 +300,15 @@ SDL_CreateWindowTexture(_THIS, SDL_Window * window, Uint32 * format, void ** pix ...@@ -300,11 +300,15 @@ SDL_CreateWindowTexture(_THIS, SDL_Window * window, Uint32 * format, void ** pix
*pixels = data->pixels; *pixels = data->pixels;
*pitch = data->pitch; *pitch = data->pitch;
/* Make sure we're not double-scaling the viewport */
SDL_RenderSetViewport(data->renderer, NULL);
return 0; return 0;
} }
static int static int
SDL_UpdateWindowTexture(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects) SDL_UpdateWindowTexture(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
{ {
SDL_WindowTextureData *data; SDL_WindowTextureData *data;
SDL_Rect rect; SDL_Rect rect;
...@@ -1629,12 +1633,12 @@ SDL_UpdateWindowSurface(SDL_Window * window) ...@@ -1629,12 +1633,12 @@ SDL_UpdateWindowSurface(SDL_Window * window)
full_rect.y = 0; full_rect.y = 0;
full_rect.w = window->w; full_rect.w = window->w;
full_rect.h = window->h; full_rect.h = window->h;
return SDL_UpdateWindowSurfaceRects(window, 1, &full_rect); return SDL_UpdateWindowSurfaceRects(window, &full_rect, 1);
} }
int int
SDL_UpdateWindowSurfaceRects(SDL_Window * window, SDL_UpdateWindowSurfaceRects(SDL_Window * window, SDL_Rect * rects,
int numrects, SDL_Rect * rects) int numrects)
{ {
CHECK_WINDOW_MAGIC(window, -1); CHECK_WINDOW_MAGIC(window, -1);
...@@ -1643,7 +1647,7 @@ SDL_UpdateWindowSurfaceRects(SDL_Window * window, ...@@ -1643,7 +1647,7 @@ SDL_UpdateWindowSurfaceRects(SDL_Window * window,
return -1; return -1;
} }
return _this->UpdateWindowFramebuffer(_this, window, numrects, rects); return _this->UpdateWindowFramebuffer(_this, window, rects, numrects);
} }
void void
......
...@@ -56,7 +56,7 @@ int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * forma ...@@ -56,7 +56,7 @@ int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * forma
return 0; return 0;
} }
int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects) int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
{ {
static int frame_number; static int frame_number;
SDL_Surface *surface; SDL_Surface *surface;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "SDL_config.h" #include "SDL_config.h"
extern int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); extern int SDL_DUMMY_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
extern int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects); extern int SDL_DUMMY_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects);
extern void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window); extern void SDL_DUMMY_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -163,8 +163,8 @@ static int NDS_CreateWindowFramebuffer(_THIS, SDL_Window * window, ...@@ -163,8 +163,8 @@ static int NDS_CreateWindowFramebuffer(_THIS, SDL_Window * window,
return 0; return 0;
} }
static int NDS_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, static int NDS_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
SDL_Rect * rects) SDL_Rect * rects, int numrects)
{ {
/* Nothing to do because writes are done directly into the /* Nothing to do because writes are done directly into the
* framebuffer. */ * framebuffer. */
......
...@@ -100,7 +100,7 @@ int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, voi ...@@ -100,7 +100,7 @@ int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, voi
return 0; return 0;
} }
int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects) int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects)
{ {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
......
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
#include "SDL_config.h" #include "SDL_config.h"
extern int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch); extern int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
extern int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects); extern int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects, int numrects);
extern void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window); extern void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -147,8 +147,8 @@ X11_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, ...@@ -147,8 +147,8 @@ X11_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format,
} }
int int
X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window, X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window, SDL_Rect * rects,
int numrects, SDL_Rect * rects) int numrects)
{ {
SDL_WindowData *data = (SDL_WindowData *) window->driverdata; SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
Display *display = data->videodata->display; Display *display = data->videodata->display;
......
...@@ -26,7 +26,7 @@ extern int X11_CreateWindowFramebuffer(_THIS, SDL_Window * window, ...@@ -26,7 +26,7 @@ extern int X11_CreateWindowFramebuffer(_THIS, SDL_Window * window,
Uint32 * format, Uint32 * format,
void ** pixels, int *pitch); void ** pixels, int *pitch);
extern int X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window, extern int X11_UpdateWindowFramebuffer(_THIS, SDL_Window * window,
int numrects, SDL_Rect * rects); SDL_Rect * rects, int numrects);
extern void X11_DestroyWindowFramebuffer(_THIS, SDL_Window * window); extern void X11_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
...@@ -19,14 +19,14 @@ static int current_color = 255; ...@@ -19,14 +19,14 @@ static int current_color = 255;
static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE; static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
void void
DrawPoints(SDL_Window * window, SDL_Renderer * renderer) DrawPoints(SDL_Renderer * renderer)
{ {
int i; int i;
int x, y; int x, y;
int window_w, window_h; SDL_Rect viewport;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
for (i = 0; i < num_objects * 4; ++i) { for (i = 0; i < num_objects * 4; ++i) {
/* Cycle the color and alpha, if desired */ /* Cycle the color and alpha, if desired */
...@@ -55,21 +55,21 @@ DrawPoints(SDL_Window * window, SDL_Renderer * renderer) ...@@ -55,21 +55,21 @@ DrawPoints(SDL_Window * window, SDL_Renderer * renderer)
SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color, SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color,
(Uint8) current_color, (Uint8) current_alpha); (Uint8) current_color, (Uint8) current_alpha);
x = rand() % window_w; x = rand() % viewport.w;
y = rand() % window_h; y = rand() % viewport.h;
SDL_RenderDrawPoint(renderer, x, y); SDL_RenderDrawPoint(renderer, x, y);
} }
} }
void void
DrawLines(SDL_Window * window, SDL_Renderer * renderer) DrawLines(SDL_Renderer * renderer)
{ {
int i; int i;
int x1, y1, x2, y2; int x1, y1, x2, y2;
int window_w, window_h; SDL_Rect viewport;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
for (i = 0; i < num_objects; ++i) { for (i = 0; i < num_objects; ++i) {
/* Cycle the color and alpha, if desired */ /* Cycle the color and alpha, if desired */
...@@ -99,29 +99,29 @@ DrawLines(SDL_Window * window, SDL_Renderer * renderer) ...@@ -99,29 +99,29 @@ DrawLines(SDL_Window * window, SDL_Renderer * renderer)
(Uint8) current_color, (Uint8) current_alpha); (Uint8) current_color, (Uint8) current_alpha);
if (i == 0) { if (i == 0) {
SDL_RenderDrawLine(renderer, 0, 0, window_w - 1, window_h - 1); SDL_RenderDrawLine(renderer, 0, 0, viewport.w - 1, viewport.h - 1);
SDL_RenderDrawLine(renderer, 0, window_h - 1, window_w - 1, 0); SDL_RenderDrawLine(renderer, 0, viewport.h - 1, viewport.w - 1, 0);
SDL_RenderDrawLine(renderer, 0, window_h / 2, window_w - 1, window_h / 2); SDL_RenderDrawLine(renderer, 0, viewport.h / 2, viewport.w - 1, viewport.h / 2);
SDL_RenderDrawLine(renderer, window_w / 2, 0, window_w / 2, window_h - 1); SDL_RenderDrawLine(renderer, viewport.w / 2, 0, viewport.w / 2, viewport.h - 1);
} else { } else {
x1 = (rand() % (window_w*2)) - window_w; x1 = (rand() % (viewport.w*2)) - viewport.w;
x2 = (rand() % (window_w*2)) - window_w; x2 = (rand() % (viewport.w*2)) - viewport.w;
y1 = (rand() % (window_h*2)) - window_h; y1 = (rand() % (viewport.h*2)) - viewport.h;
y2 = (rand() % (window_h*2)) - window_h; y2 = (rand() % (viewport.h*2)) - viewport.h;
SDL_RenderDrawLine(renderer, x1, y1, x2, y2); SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
} }
} }
} }
void void
DrawRects(SDL_Window * window, SDL_Renderer * renderer) DrawRects(SDL_Renderer * renderer)
{ {
int i; int i;
SDL_Rect rect; SDL_Rect rect;
int window_w, window_h; SDL_Rect viewport;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
for (i = 0; i < num_objects / 4; ++i) { for (i = 0; i < num_objects / 4; ++i) {
/* Cycle the color and alpha, if desired */ /* Cycle the color and alpha, if desired */
...@@ -150,10 +150,10 @@ DrawRects(SDL_Window * window, SDL_Renderer * renderer) ...@@ -150,10 +150,10 @@ DrawRects(SDL_Window * window, SDL_Renderer * renderer)
SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color, SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color,
(Uint8) current_color, (Uint8) current_alpha); (Uint8) current_color, (Uint8) current_alpha);
rect.w = rand() % (window_h / 2); rect.w = rand() % (viewport.h / 2);
rect.h = rand() % (window_h / 2); rect.h = rand() % (viewport.h / 2);
rect.x = (rand() % (window_w*2) - window_w) - (rect.w / 2); rect.x = (rand() % (viewport.w*2) - viewport.w) - (rect.w / 2);
rect.y = (rand() % (window_h*2) - window_h) - (rect.h / 2); rect.y = (rand() % (viewport.h*2) - viewport.h) - (rect.h / 2);
SDL_RenderFillRect(renderer, &rect); SDL_RenderFillRect(renderer, &rect);
} }
} }
...@@ -243,9 +243,9 @@ main(int argc, char *argv[]) ...@@ -243,9 +243,9 @@ main(int argc, char *argv[])
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
DrawRects(state->windows[i], renderer); DrawRects(renderer);
DrawLines(state->windows[i], renderer); DrawLines(renderer);
DrawPoints(state->windows[i], renderer); DrawPoints(renderer);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
......
...@@ -20,14 +20,14 @@ static int current_color = 255; ...@@ -20,14 +20,14 @@ static int current_color = 255;
static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE; static SDL_BlendMode blendMode = SDL_BLENDMODE_NONE;
void void
DrawPoints(SDL_Window * window, SDL_Renderer * renderer) DrawPoints(SDL_Renderer * renderer)
{ {
int i; int i;
int x, y; int x, y;
int window_w, window_h; SDL_Rect viewport;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
for (i = 0; i < num_objects * 4; ++i) { for (i = 0; i < num_objects * 4; ++i) {
/* Cycle the color and alpha, if desired */ /* Cycle the color and alpha, if desired */
...@@ -56,8 +56,8 @@ DrawPoints(SDL_Window * window, SDL_Renderer * renderer) ...@@ -56,8 +56,8 @@ DrawPoints(SDL_Window * window, SDL_Renderer * renderer)
SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color, SDL_SetRenderDrawColor(renderer, 255, (Uint8) current_color,
(Uint8) current_color, (Uint8) current_alpha); (Uint8) current_color, (Uint8) current_alpha);
x = rand() % window_w; x = rand() % viewport.w;
y = rand() % window_h; y = rand() % viewport.h;
SDL_RenderDrawPoint(renderer, x, y); SDL_RenderDrawPoint(renderer, x, y);
} }
} }
...@@ -84,23 +84,23 @@ add_line(int x1, int y1, int x2, int y2) ...@@ -84,23 +84,23 @@ add_line(int x1, int y1, int x2, int y2)
void void
DrawLines(SDL_Window * window, SDL_Renderer * renderer) DrawLines(SDL_Renderer * renderer)
{ {
int i; int i;
int x1, y1, x2, y2; int x1, y1, x2, y2;
int window_w, window_h; SDL_Rect viewport;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
for (i = 0; i < num_lines; ++i) {
SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255); SDL_SetRenderDrawColor(renderer, 255, 255, 255, 255);
for (i = 0; i < num_lines; ++i) {
if (i == -1) { if (i == -1) {
SDL_RenderDrawLine(renderer, 0, 0, window_w - 1, window_h - 1); SDL_RenderDrawLine(renderer, 0, 0, viewport.w - 1, viewport.h - 1);
SDL_RenderDrawLine(renderer, 0, window_h - 1, window_w - 1, 0); SDL_RenderDrawLine(renderer, 0, viewport.h - 1, viewport.w - 1, 0);
SDL_RenderDrawLine(renderer, 0, window_h / 2, window_w - 1, window_h / 2); SDL_RenderDrawLine(renderer, 0, viewport.h / 2, viewport.w - 1, viewport.h / 2);
SDL_RenderDrawLine(renderer, window_w / 2, 0, window_w / 2, window_h - 1); SDL_RenderDrawLine(renderer, viewport.w / 2, 0, viewport.w / 2, viewport.h - 1);
} else { } else {
SDL_RenderDrawLine(renderer, lines[i].x, lines[i].y, lines[i].w, lines[i].h); SDL_RenderDrawLine(renderer, lines[i].x, lines[i].y, lines[i].w, lines[i].h);
} }
...@@ -135,27 +135,18 @@ add_rect(int x1, int y1, int x2, int y2) ...@@ -135,27 +135,18 @@ add_rect(int x1, int y1, int x2, int y2)
} }
static void static void
DrawRects(SDL_Window * window, SDL_Renderer * renderer) DrawRects(SDL_Renderer * renderer)
{ {
int i;
int window_w, window_h;
/* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h);
for (i = 0; i < num_rects; ++i) {
SDL_SetRenderDrawColor(renderer, 255, 127, 0, 255); SDL_SetRenderDrawColor(renderer, 255, 127, 0, 255);
SDL_RenderFillRect(renderer, &rects[i]); SDL_RenderFillRects(renderer, rects, num_rects);
}
} }
static void static void
DrawRectLineIntersections(SDL_Window * window, SDL_Renderer * renderer) DrawRectLineIntersections(SDL_Renderer * renderer)
{ {
int i, j, window_w, window_h; int i, j;
/* Query the sizes */ SDL_SetRenderDrawColor(renderer, 0, 255, 55, 255);
SDL_GetWindowSize(window, &window_w, &window_h);
for (i = 0; i < num_rects; i++) for (i = 0; i < num_rects; i++)
for (j = 0; j < num_lines; j++) { for (j = 0; j < num_lines; j++) {
...@@ -169,22 +160,22 @@ DrawRectLineIntersections(SDL_Window * window, SDL_Renderer * renderer) ...@@ -169,22 +160,22 @@ DrawRectLineIntersections(SDL_Window * window, SDL_Renderer * renderer)
y2 = lines[j].h; y2 = lines[j].h;
if (SDL_IntersectRectAndLine(&r, &x1, &y1, &x2, &y2)) { if (SDL_IntersectRectAndLine(&r, &x1, &y1, &x2, &y2)) {
SDL_SetRenderDrawColor(renderer, 0, 255, 55, 255);
SDL_RenderDrawLine(renderer, x1, y1, x2, y2); SDL_RenderDrawLine(renderer, x1, y1, x2, y2);
} }
} }
} }
static void static void
DrawRectRectIntersections(SDL_Window * window, SDL_Renderer * renderer) DrawRectRectIntersections(SDL_Renderer * renderer)
{ {
int i, j; int i, j;
SDL_SetRenderDrawColor(renderer, 255, 200, 0, 255);
for (i = 0; i < num_rects; i++) for (i = 0; i < num_rects; i++)
for (j = i + 1; j < num_rects; j++) { for (j = i + 1; j < num_rects; j++) {
SDL_Rect r; SDL_Rect r;
if (SDL_IntersectRect(&rects[i], &rects[j], &r)) { if (SDL_IntersectRect(&rects[i], &rects[j], &r)) {
SDL_SetRenderDrawColor(renderer, 255, 200, 0, 255);
SDL_RenderFillRect(renderer, &r); SDL_RenderFillRect(renderer, &r);
} }
} }
...@@ -310,11 +301,11 @@ main(int argc, char *argv[]) ...@@ -310,11 +301,11 @@ main(int argc, char *argv[])
SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF); SDL_SetRenderDrawColor(renderer, 0xA0, 0xA0, 0xA0, 0xFF);
SDL_RenderClear(renderer); SDL_RenderClear(renderer);
DrawRects(state->windows[i], renderer); DrawRects(renderer);
DrawPoints(state->windows[i], renderer); DrawPoints(renderer);
DrawRectRectIntersections(state->windows[i], renderer); DrawRectRectIntersections(renderer);
DrawLines(state->windows[i], renderer); DrawLines(renderer);
DrawRectLineIntersections(state->windows[i], renderer); DrawRectLineIntersections(renderer);
SDL_RenderPresent(renderer); SDL_RenderPresent(renderer);
} }
......
...@@ -82,9 +82,9 @@ LoadTexture(SDL_Renderer *renderer, char *file, SDL_bool transparent) ...@@ -82,9 +82,9 @@ LoadTexture(SDL_Renderer *renderer, char *file, SDL_bool transparent)
void void
Draw(DrawState *s) Draw(DrawState *s)
{ {
int w, h; SDL_Rect viewport;
SDL_GetWindowSize(s->window, &w, &h); SDL_RenderGetViewport(s->renderer, &viewport);
/* Draw the background */ /* Draw the background */
SDL_RenderCopy(s->renderer, s->background, NULL, NULL); SDL_RenderCopy(s->renderer, s->background, NULL, NULL);
...@@ -93,7 +93,7 @@ Draw(DrawState *s) ...@@ -93,7 +93,7 @@ Draw(DrawState *s)
s->sprite_rect.w += s->scale_direction; s->sprite_rect.w += s->scale_direction;
s->sprite_rect.h += s->scale_direction; s->sprite_rect.h += s->scale_direction;
if (s->scale_direction > 0) { if (s->scale_direction > 0) {
if (s->sprite_rect.w >= w || s->sprite_rect.h >= h) { if (s->sprite_rect.w >= viewport.w || s->sprite_rect.h >= viewport.h) {
s->scale_direction = -1; s->scale_direction = -1;
} }
} else { } else {
...@@ -101,8 +101,8 @@ Draw(DrawState *s) ...@@ -101,8 +101,8 @@ Draw(DrawState *s)
s->scale_direction = 1; s->scale_direction = 1;
} }
} }
s->sprite_rect.x = (w - s->sprite_rect.w) / 2; s->sprite_rect.x = (viewport.w - s->sprite_rect.w) / 2;
s->sprite_rect.y = (h - s->sprite_rect.h) / 2; s->sprite_rect.y = (viewport.h - s->sprite_rect.h) / 2;
SDL_RenderCopy(s->renderer, s->sprite, NULL, &s->sprite_rect); SDL_RenderCopy(s->renderer, s->sprite, NULL, &s->sprite_rect);
......
...@@ -92,15 +92,14 @@ LoadSprite(char *file) ...@@ -92,15 +92,14 @@ LoadSprite(char *file)
} }
void void
MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite) MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
{ {
int i, n; int i, n;
int window_w, window_h; SDL_Rect viewport, temp;
SDL_Rect temp;
SDL_Rect *position, *velocity; SDL_Rect *position, *velocity;
/* Query the sizes */ /* Query the sizes */
SDL_GetWindowSize(window, &window_w, &window_h); SDL_RenderGetViewport(renderer, &viewport);
/* Cycle the color and alpha, if desired */ /* Cycle the color and alpha, if desired */
if (cycle_color) { if (cycle_color) {
...@@ -136,16 +135,16 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite) ...@@ -136,16 +135,16 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
/* Test points */ /* Test points */
SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF); SDL_SetRenderDrawColor(renderer, 0xFF, 0x00, 0x00, 0xFF);
SDL_RenderDrawPoint(renderer, 0, 0); SDL_RenderDrawPoint(renderer, 0, 0);
SDL_RenderDrawPoint(renderer, window_w-1, 0); SDL_RenderDrawPoint(renderer, viewport.w-1, 0);
SDL_RenderDrawPoint(renderer, 0, window_h-1); SDL_RenderDrawPoint(renderer, 0, viewport.h-1);
SDL_RenderDrawPoint(renderer, window_w-1, window_h-1); SDL_RenderDrawPoint(renderer, viewport.w-1, viewport.h-1);
/* Test horizontal and vertical lines */ /* Test horizontal and vertical lines */
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF); SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, 1, 0, window_w-2, 0); SDL_RenderDrawLine(renderer, 1, 0, viewport.w-2, 0);
SDL_RenderDrawLine(renderer, 1, window_h-1, window_w-2, window_h-1); SDL_RenderDrawLine(renderer, 1, viewport.h-1, viewport.w-2, viewport.h-1);
SDL_RenderDrawLine(renderer, 0, 1, 0, window_h-2); SDL_RenderDrawLine(renderer, 0, 1, 0, viewport.h-2);
SDL_RenderDrawLine(renderer, window_w-1, 1, window_w-1, window_h-2); SDL_RenderDrawLine(renderer, viewport.w-1, 1, viewport.w-1, viewport.h-2);
/* Test fill and copy */ /* Test fill and copy */
SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF); SDL_SetRenderDrawColor(renderer, 0xFF, 0xFF, 0xFF, 0xFF);
...@@ -155,20 +154,20 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite) ...@@ -155,20 +154,20 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
temp.h = sprite_h; temp.h = sprite_h;
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp); SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = window_w-sprite_w-1; temp.x = viewport.w-sprite_w-1;
temp.y = 1; temp.y = 1;
temp.w = sprite_w; temp.w = sprite_w;
temp.h = sprite_h; temp.h = sprite_h;
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp); SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = 1; temp.x = 1;
temp.y = window_h-sprite_h-1; temp.y = viewport.h-sprite_h-1;
temp.w = sprite_w; temp.w = sprite_w;
temp.h = sprite_h; temp.h = sprite_h;
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
SDL_RenderCopy(renderer, sprite, NULL, &temp); SDL_RenderCopy(renderer, sprite, NULL, &temp);
temp.x = window_w-sprite_w-1; temp.x = viewport.w-sprite_w-1;
temp.y = window_h-sprite_h-1; temp.y = viewport.h-sprite_h-1;
temp.w = sprite_w; temp.w = sprite_w;
temp.h = sprite_h; temp.h = sprite_h;
SDL_RenderFillRect(renderer, &temp); SDL_RenderFillRect(renderer, &temp);
...@@ -177,9 +176,9 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite) ...@@ -177,9 +176,9 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
/* Test diagonal lines */ /* Test diagonal lines */
SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF); SDL_SetRenderDrawColor(renderer, 0x00, 0xFF, 0x00, 0xFF);
SDL_RenderDrawLine(renderer, sprite_w, sprite_h, SDL_RenderDrawLine(renderer, sprite_w, sprite_h,
window_w-sprite_w-2, window_h-sprite_h-2); viewport.w-sprite_w-2, viewport.h-sprite_h-2);
SDL_RenderDrawLine(renderer, window_w-sprite_w-2, sprite_h, SDL_RenderDrawLine(renderer, viewport.w-sprite_w-2, sprite_h,
sprite_w, window_h-sprite_h-2); sprite_w, viewport.h-sprite_h-2);
/* Move the sprite, bounce at the wall, and draw */ /* Move the sprite, bounce at the wall, and draw */
n = 0; n = 0;
...@@ -187,12 +186,12 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite) ...@@ -187,12 +186,12 @@ MoveSprites(SDL_Window * window, SDL_Renderer * renderer, SDL_Texture * sprite)
position = &positions[i]; position = &positions[i];
velocity = &velocities[i]; velocity = &velocities[i];
position->x += velocity->x; position->x += velocity->x;
if ((position->x < 0) || (position->x >= (window_w - sprite_w))) { if ((position->x < 0) || (position->x >= (viewport.w - sprite_w))) {
velocity->x = -velocity->x; velocity->x = -velocity->x;
position->x += velocity->x; position->x += velocity->x;
} }
position->y += velocity->y; position->y += velocity->y;
if ((position->y < 0) || (position->y >= (window_h - sprite_h))) { if ((position->y < 0) || (position->y >= (viewport.h - sprite_h))) {
velocity->y = -velocity->y; velocity->y = -velocity->y;
position->y += velocity->y; position->y += velocity->y;
} }
...@@ -313,7 +312,7 @@ main(int argc, char *argv[]) ...@@ -313,7 +312,7 @@ main(int argc, char *argv[])
CommonEvent(state, &event, &done); CommonEvent(state, &event, &done);
} }
for (i = 0; i < state->num_windows; ++i) { for (i = 0; i < state->num_windows; ++i) {
MoveSprites(state->windows[i], state->renderers[i], sprites[i]); MoveSprites(state->renderers[i], sprites[i]);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment