Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Commit

Permalink
The DrawRect API is implemented using lines
Browse files Browse the repository at this point in the history
  • Loading branch information
slouken committed Feb 2, 2011
1 parent 1f52b25 commit a806932
Show file tree
Hide file tree
Showing 8 changed files with 30 additions and 273 deletions.
43 changes: 0 additions & 43 deletions src/video/SDL_renderer_gl.c
Expand Up @@ -93,8 +93,6 @@ static int GL_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int GL_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int GL_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int GL_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int GL_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
Expand Down Expand Up @@ -289,7 +287,6 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->RenderClear = GL_RenderClear;
renderer->RenderDrawPoints = GL_RenderDrawPoints;
renderer->RenderDrawLines = GL_RenderDrawLines;
renderer->RenderDrawRects = GL_RenderDrawRects;
renderer->RenderFillRects = GL_RenderFillRects;
renderer->RenderCopy = GL_RenderCopy;
renderer->RenderReadPixels = GL_RenderReadPixels;
Expand Down Expand Up @@ -1138,46 +1135,6 @@ GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
return 0;
}

static int
GL_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
{
GL_RenderData *data = (GL_RenderData *) renderer->driverdata;
int i, x, y;

GL_ActivateRenderer(renderer);

GL_SetBlendMode(data, renderer->blendMode);

data->glColor4f((GLfloat) renderer->r * inv255f,
(GLfloat) renderer->g * inv255f,
(GLfloat) renderer->b * inv255f,
(GLfloat) renderer->a * inv255f);

data->glBegin(GL_LINE_LOOP);
for (i = 0; i < count; ++i) {
const SDL_Rect *rect = rects[i];

x = rect->x;
y = rect->y;
data->glVertex2f(0.5f + x, 0.5f + y);

x = rect->x+rect->w-1;
y = rect->y;
data->glVertex2f(0.5f + x, 0.5f + y);

x = rect->x+rect->w-1;
y = rect->y+rect->h-1;
data->glVertex2f(0.5f + x, 0.5f + y);

x = rect->x;
y = rect->y+rect->h-1;
data->glVertex2f(0.5f + x, 0.5f + y);
}
data->glEnd();

return 0;
}

static int
GL_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
{
Expand Down
42 changes: 0 additions & 42 deletions src/video/SDL_renderer_gles.c
Expand Up @@ -81,8 +81,6 @@ static int GLES_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int GLES_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int GLES_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int GLES_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int GLES_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
Expand Down Expand Up @@ -229,7 +227,6 @@ GLES_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->DirtyTexture = GLES_DirtyTexture;
renderer->RenderDrawPoints = GLES_RenderDrawPoints;
renderer->RenderDrawLines = GLES_RenderDrawLines;
renderer->RenderDrawRects = GLES_RenderDrawRects;
renderer->RenderFillRects = GLES_RenderFillRects;
renderer->RenderCopy = GLES_RenderCopy;
renderer->RenderPresent = GLES_RenderPresent;
Expand Down Expand Up @@ -667,45 +664,6 @@ GLES_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
return 0;
}

static int
GLES_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
{
GLES_RenderData *data = (GLES_RenderData *) renderer->driverdata;
int i;

GLES_ActivateRenderer(renderer);

GLES_SetBlendMode(data, renderer->blendMode);

data->glColor4f((GLfloat) renderer->r * inv255f,
(GLfloat) renderer->g * inv255f,
(GLfloat) renderer->b * inv255f,
(GLfloat) renderer->a * inv255f);

for (i = 0; i < count; ++i) {
const SDL_Rect *rect = rects[i];
GLshort minx = rect->x;
GLshort maxx = rect->x + rect->w;
GLshort miny = rect->y;
GLshort maxy = rect->y + rect->h;
GLshort vertices[8];
vertices[0] = minx;
vertices[1] = miny;
vertices[2] = maxx;
vertices[3] = miny;
vertices[4] = minx;
vertices[5] = maxy;
vertices[6] = maxx;
vertices[7] = maxy;

data->glVertexPointer(2, GL_SHORT, 0, vertices);
data->glDrawArrays(GL_LINE_LOOP, 0, 4);
}

return 0;
}

static int
GLES_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
Expand Down
59 changes: 0 additions & 59 deletions src/video/SDL_renderer_sw.c
Expand Up @@ -62,8 +62,6 @@ static int SW_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SW_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SW_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int SW_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
Expand Down Expand Up @@ -216,7 +214,6 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags)

renderer->RenderDrawPoints = SW_RenderDrawPoints;
renderer->RenderDrawLines = SW_RenderDrawLines;
renderer->RenderDrawRects = SW_RenderDrawRects;
renderer->RenderFillRects = SW_RenderFillRects;
renderer->RenderCopy = SW_RenderCopy;
renderer->RenderReadPixels = SW_RenderReadPixels;
Expand Down Expand Up @@ -608,62 +605,6 @@ SW_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points,
return status;
}

static int
SW_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
{
SW_RenderData *data = (SW_RenderData *) renderer->driverdata;
SDL_Texture *texture = SW_ActivateRenderer(renderer);
SDL_Rect clip, rect;
Uint32 color = 0;
int i;
int status = 0;

if (!texture) {
return -1;
}

clip.x = 0;
clip.y = 0;
clip.w = texture->w;
clip.h = texture->h;

if (renderer->blendMode == SDL_BLENDMODE_NONE) {
color = SDL_MapRGBA(data->surface.format,
renderer->r, renderer->g, renderer->b,
renderer->a);
}

for (i = 0; i < count; ++i) {
/* FIXME: We don't want to draw clipped edges */
if (!SDL_IntersectRect(rects[i], &clip, &rect)) {
/* Nothing to draw */
continue;
}

if (data->renderer->LockTexture(data->renderer, texture, &rect, 1,
&data->surface.pixels,
&data->surface.pitch) < 0) {
return -1;
}

data->surface.clip_rect.w = data->surface.w = rect.w;
data->surface.clip_rect.h = data->surface.h = rect.h;

if (renderer->blendMode == SDL_BLENDMODE_NONE) {
status = SDL_DrawRect(&data->surface, NULL, color);
} else {
status = SDL_BlendRect(&data->surface, NULL,
renderer->blendMode,
renderer->r, renderer->g, renderer->b,
renderer->a);
}

data->renderer->UnlockTexture(data->renderer, texture);
}
return status;
}

static int
SW_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
Expand Down
2 changes: 0 additions & 2 deletions src/video/SDL_sysvideo.h
Expand Up @@ -93,8 +93,6 @@ struct SDL_Renderer
int count);
int (*RenderDrawLines) (SDL_Renderer * renderer, const SDL_Point * points,
int count);
int (*RenderDrawRects) (SDL_Renderer * renderer, const SDL_Rect ** rects,
int count);
int (*RenderFillRects) (SDL_Renderer * renderer, const SDL_Rect ** rects,
int count);
int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture,
Expand Down
43 changes: 30 additions & 13 deletions src/video/SDL_video.c
Expand Up @@ -2319,7 +2319,33 @@ SDL_RenderDrawLines(SDL_Renderer * renderer,
int
SDL_RenderDrawRect(SDL_Renderer * renderer, const SDL_Rect * rect)
{
return SDL_RenderDrawRects(renderer, &rect, 1);
SDL_Rect full_rect;
SDL_Point points[5];

CHECK_RENDERER_MAGIC(renderer, -1);

/* If 'rect' == NULL, then outline the whole surface */
if (!rect) {
SDL_Window *window = renderer->window;

full_rect.x = 0;
full_rect.y = 0;
full_rect.w = window->w;
full_rect.h = window->h;
rect = &full_rect;
}

points[0].x = rect->x;
points[0].y = rect->y;
points[1].x = rect->x+rect->w-1;
points[1].y = rect->y;
points[2].x = rect->x+rect->w-1;
points[2].y = rect->y+rect->h-1;
points[3].x = rect->x;
points[3].y = rect->y+rect->h-1;
points[4].x = rect->x;
points[4].y = rect->y;
return SDL_RenderDrawLines(renderer, points, 5);
}

int
Expand All @@ -2340,20 +2366,11 @@ SDL_RenderDrawRects(SDL_Renderer * renderer,

/* 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;
full_rect.w = window->w;
full_rect.h = window->h;
rect = &full_rect;
return renderer->RenderDrawRects(renderer, &rect, 1);
if (SDL_RenderDrawRect(renderer, rects[i]) < 0) {
return -1;
}
}
return renderer->RenderDrawRects(renderer, rects, count);
return 0;
}

int
Expand Down
21 changes: 0 additions & 21 deletions src/video/directfb/SDL_DirectFB_render.c
Expand Up @@ -68,8 +68,6 @@ static int DirectFB_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int DirectFB_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int DirectFB_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int DirectFB_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int DirectFB_RenderCopy(SDL_Renderer * renderer,
Expand Down Expand Up @@ -271,7 +269,6 @@ DirectFB_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->RenderDrawPoints = DirectFB_RenderDrawPoints;
renderer->RenderDrawLines = DirectFB_RenderDrawLines;
renderer->RenderFillRects = DirectFB_RenderFillRects;
renderer->RenderDrawRects = DirectFB_RenderDrawRects;
/* RenderDrawEllipse - no reference implementation yet */
/* RenderFillEllipse - no reference implementation yet */
renderer->RenderCopy = DirectFB_RenderCopy;
Expand Down Expand Up @@ -816,24 +813,6 @@ static int DirectFB_RenderDrawLines(SDL_Renderer * renderer,
return -1;
}

static int
DirectFB_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
{
DirectFB_RenderData *data = (DirectFB_RenderData *) renderer->driverdata;
SDL_DFB_WINDOWSURFACE(data->window);
int i;

PrepareDraw(renderer);

for (i=0; i<count; i++)
SDL_DFB_CHECKERR(destsurf->DrawRectangle(destsurf, rects[i]->x, rects[i]->y,
rects[i]->w, rects[i]->h));

return 0;
error:
return -1;
}

static int
DirectFB_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)
{
Expand Down
25 changes: 0 additions & 25 deletions src/video/dummy/SDL_nullrender.c
Expand Up @@ -35,8 +35,6 @@ static int SDL_DUMMY_RenderDrawPoints(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SDL_DUMMY_RenderDrawLines(SDL_Renderer * renderer,
const SDL_Point * points, int count);
static int SDL_DUMMY_RenderDrawRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int SDL_DUMMY_RenderFillRects(SDL_Renderer * renderer,
const SDL_Rect ** rects, int count);
static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer,
Expand Down Expand Up @@ -100,7 +98,6 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags)

renderer->RenderDrawPoints = SDL_DUMMY_RenderDrawPoints;
renderer->RenderDrawLines = SDL_DUMMY_RenderDrawLines;
renderer->RenderDrawRects = SDL_DUMMY_RenderDrawRects;
renderer->RenderFillRects = SDL_DUMMY_RenderFillRects;
renderer->RenderCopy = SDL_DUMMY_RenderCopy;
renderer->RenderReadPixels = SDL_DUMMY_RenderReadPixels;
Expand Down Expand Up @@ -167,28 +164,6 @@ SDL_DUMMY_RenderDrawLines(SDL_Renderer * renderer,
}
}

static int
SDL_DUMMY_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
{
SDL_DUMMY_RenderData *data =
(SDL_DUMMY_RenderData *) renderer->driverdata;
SDL_Surface *target = data->screen;

if (renderer->blendMode == SDL_BLENDMODE_NONE) {
Uint32 color = SDL_MapRGBA(target->format,
renderer->r, renderer->g, renderer->b,
renderer->a);

return SDL_DrawRects(target, rects, count, color);
} else {
return SDL_BlendRects(target, rects, count,
renderer->blendMode,
renderer->r, renderer->g, renderer->b,
renderer->a);
}
}

static int
SDL_DUMMY_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects,
int count)
Expand Down

0 comments on commit a806932

Please sign in to comment.