From a8069326310caaddfc6fbae4f4a5025a595ab153 Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Tue, 1 Feb 2011 20:50:04 -0800 Subject: [PATCH] The DrawRect API is implemented using lines --- src/video/SDL_renderer_gl.c | 43 --------------- src/video/SDL_renderer_gles.c | 42 --------------- src/video/SDL_renderer_sw.c | 59 -------------------- src/video/SDL_sysvideo.h | 2 - src/video/SDL_video.c | 43 ++++++++++----- src/video/directfb/SDL_DirectFB_render.c | 21 -------- src/video/dummy/SDL_nullrender.c | 25 --------- src/video/windows/SDL_d3drender.c | 68 ------------------------ 8 files changed, 30 insertions(+), 273 deletions(-) diff --git a/src/video/SDL_renderer_gl.c b/src/video/SDL_renderer_gl.c index 2213ecb57..b180b73bd 100644 --- a/src/video/SDL_renderer_gl.c +++ b/src/video/SDL_renderer_gl.c @@ -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, @@ -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; @@ -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) { diff --git a/src/video/SDL_renderer_gles.c b/src/video/SDL_renderer_gles.c index 112d88d54..6035948c4 100644 --- a/src/video/SDL_renderer_gles.c +++ b/src/video/SDL_renderer_gles.c @@ -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, @@ -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; @@ -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) diff --git a/src/video/SDL_renderer_sw.c b/src/video/SDL_renderer_sw.c index b98a9c837..40189d376 100644 --- a/src/video/SDL_renderer_sw.c +++ b/src/video/SDL_renderer_sw.c @@ -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, @@ -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; @@ -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) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index 7f4cce022..22a5d823c 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -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, diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 372c0b2f5..96436c073 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -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 @@ -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 diff --git a/src/video/directfb/SDL_DirectFB_render.c b/src/video/directfb/SDL_DirectFB_render.c index e5c431193..085115c19 100644 --- a/src/video/directfb/SDL_DirectFB_render.c +++ b/src/video/directfb/SDL_DirectFB_render.c @@ -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, @@ -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; @@ -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; iDrawRectangle(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) { diff --git a/src/video/dummy/SDL_nullrender.c b/src/video/dummy/SDL_nullrender.c index ec55ffeb5..8aad525d9 100644 --- a/src/video/dummy/SDL_nullrender.c +++ b/src/video/dummy/SDL_nullrender.c @@ -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, @@ -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; @@ -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) diff --git a/src/video/windows/SDL_d3drender.c b/src/video/windows/SDL_d3drender.c index 161aa7bba..321b237ed 100644 --- a/src/video/windows/SDL_d3drender.c +++ b/src/video/windows/SDL_d3drender.c @@ -114,8 +114,6 @@ static int D3D_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, int count); static int D3D_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, int count); -static int D3D_RenderDrawRects(SDL_Renderer * renderer, - const SDL_Rect ** rects, int count); static int D3D_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count); static int D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, @@ -446,7 +444,6 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->DirtyTexture = D3D_DirtyTexture; renderer->RenderDrawPoints = D3D_RenderDrawPoints; renderer->RenderDrawLines = D3D_RenderDrawLines; - renderer->RenderDrawRects = D3D_RenderDrawRects; renderer->RenderFillRects = D3D_RenderFillRects; renderer->RenderCopy = D3D_RenderCopy; renderer->RenderReadPixels = D3D_RenderReadPixels; @@ -986,71 +983,6 @@ D3D_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, return 0; } -static int -D3D_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, - int count) -{ - D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; - DWORD color; - int i; - Vertex vertices[5]; - HRESULT result; - - if (data->beginScene) { - IDirect3DDevice9_BeginScene(data->device); - data->beginScene = SDL_FALSE; - } - - D3D_SetBlendMode(data, renderer->blendMode); - - result = - IDirect3DDevice9_SetTexture(data->device, 0, - (IDirect3DBaseTexture9 *) 0); - if (FAILED(result)) { - D3D_SetError("SetTexture()", result); - return -1; - } - - color = D3DCOLOR_ARGB(renderer->a, renderer->r, renderer->g, renderer->b); - - for (i = 0; i < SDL_arraysize(vertices); ++i) { - vertices[i].z = 0.0f; - vertices[i].rhw = 1.0f; - vertices[i].color = color; - vertices[i].u = 0.0f; - vertices[i].v = 0.0f; - } - - for (i = 0; i < count; ++i) { - const SDL_Rect *rect = rects[i]; - - vertices[0].x = (float) rect->x; - vertices[0].y = (float) rect->y; - - vertices[1].x = (float) rect->x+rect->w-1; - vertices[1].y = (float) rect->y; - - vertices[2].x = (float) rect->x+rect->w-1; - vertices[2].y = (float) rect->y+rect->h-1; - - vertices[3].x = (float) rect->x; - vertices[3].y = (float) rect->y+rect->h-1; - - vertices[4].x = (float) rect->x; - vertices[4].y = (float) rect->y; - - result = - IDirect3DDevice9_DrawPrimitiveUP(data->device, D3DPT_LINESTRIP, 4, - vertices, sizeof(*vertices)); - - if (FAILED(result)) { - D3D_SetError("DrawPrimitiveUP()", result); - return -1; - } - } - return 0; -} - static int D3D_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count)