diff src/video/SDL_video.c @ 3596:f638ded38b8a

Added SDL_RenderClear() as a fast method of clearing the screen to the drawing color. Renamed SDL_RenderPoint() and SDL_RenderLine() to SDL_RenderDrawPoint() and SDL_RenderDrawLine(). Added API for rectangle drawing (as opposed to filling) Added placeholder API functions for circles and ellipses ... I'm not sure whether these will stay. Optimized software line drawing quite a bit. Added support for Wu's anti-aliased line drawing, currently disabled by default.
author Sam Lantinga <slouken@libsdl.org>
date Wed, 23 Dec 2009 01:55:00 +0000
parents 19691cebb866
children 0f958e527e5e
line wrap: on
line diff
--- a/src/video/SDL_video.c	Fri Dec 18 08:19:18 2009 +0000
+++ b/src/video/SDL_video.c	Wed Dec 23 01:55:00 2009 +0000
@@ -2483,22 +2483,49 @@
 }
 
 int
-SDL_RenderPoint(int x, int y)
+SDL_RenderClear()
+{
+    SDL_Renderer *renderer;
+
+    renderer = SDL_GetCurrentRenderer(SDL_TRUE);
+    if (!renderer) {
+        return -1;
+    }
+    if (!renderer->RenderClear) {
+        int blendMode = renderer->blendMode;
+        int status;
+
+        if (blendMode >= SDL_BLENDMODE_BLEND) {
+            SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE);
+        }
+
+        status = SDL_RenderFillRect(NULL);
+
+        if (blendMode >= SDL_BLENDMODE_BLEND) {
+            SDL_SetRenderDrawBlendMode(blendMode);
+        }
+        return status;
+    }
+    return renderer->RenderClear(renderer);
+}
+
+int
+SDL_RenderDrawPoint(int x, int y)
 {
     SDL_Point point;
 
     point.x = x;
     point.y = y;
-    return SDL_RenderPoints(&point, 1);
+    return SDL_RenderDrawPoints(&point, 1);
 }
 
 int
-SDL_RenderPoints(const SDL_Point * points, int count)
+SDL_RenderDrawPoints(const SDL_Point * points, int count)
 {
     SDL_Renderer *renderer;
 
     if (!points) {
-        SDL_SetError("SDL_RenderPoints(): Passed NULL points");
+        SDL_SetError("SDL_RenderDrawPoints(): Passed NULL points");
         return -1;
     }
 
@@ -2506,18 +2533,18 @@
     if (!renderer) {
         return -1;
     }
-    if (!renderer->RenderPoints) {
+    if (!renderer->RenderDrawPoints) {
         SDL_Unsupported();
         return -1;
     }
     if (count < 1) {
         return 0;
     }
-    return renderer->RenderPoints(renderer, points, count);
+    return renderer->RenderDrawPoints(renderer, points, count);
 }
 
 int
-SDL_RenderLine(int x1, int y1, int x2, int y2)
+SDL_RenderDrawLine(int x1, int y1, int x2, int y2)
 {
     SDL_Point points[2];
 
@@ -2525,16 +2552,16 @@
     points[0].y = y1;
     points[1].x = x2;
     points[1].y = y2;
-    return SDL_RenderLines(points, 2);
+    return SDL_RenderDrawLines(points, 2);
 }
 
 int
-SDL_RenderLines(const SDL_Point * points, int count)
+SDL_RenderDrawLines(const SDL_Point * points, int count)
 {
     SDL_Renderer *renderer;
 
     if (!points) {
-        SDL_SetError("SDL_RenderLines(): Passed NULL points");
+        SDL_SetError("SDL_RenderDrawLines(): Passed NULL points");
         return -1;
     }
 
@@ -2542,30 +2569,30 @@
     if (!renderer) {
         return -1;
     }
-    if (!renderer->RenderLines) {
+    if (!renderer->RenderDrawLines) {
         SDL_Unsupported();
         return -1;
     }
     if (count < 2) {
         return 0;
     }
-    return renderer->RenderLines(renderer, points, count);
+    return renderer->RenderDrawLines(renderer, points, count);
 }
 
 int
-SDL_RenderRect(const SDL_Rect * rect)
+SDL_RenderDrawRect(const SDL_Rect * rect)
 {
-    return SDL_RenderRects(&rect, 1);
+    return SDL_RenderDrawRects(&rect, 1);
 }
 
 int
-SDL_RenderRects(const SDL_Rect ** rects, int count)
+SDL_RenderDrawRects(const SDL_Rect ** rects, int count)
 {
     SDL_Renderer *renderer;
     int i;
 
     if (!rects) {
-        SDL_SetError("SDL_RenderRects(): Passed NULL rects");
+        SDL_SetError("SDL_RenderDrawRects(): Passed NULL rects");
         return -1;
     }
 
@@ -2573,7 +2600,7 @@
     if (!renderer) {
         return -1;
     }
-    if (!renderer->RenderRects) {
+    if (!renderer->RenderDrawRects) {
         SDL_Unsupported();
         return -1;
     }
@@ -2593,10 +2620,99 @@
             full_rect.w = window->w;
             full_rect.h = window->h;
             rect = &full_rect;
-            return renderer->RenderRects(renderer, &rect, 1);
+            return renderer->RenderDrawRects(renderer, &rect, 1);
         }
     }
-    return renderer->RenderRects(renderer, rects, count);
+    return renderer->RenderDrawRects(renderer, rects, count);
+}
+
+int
+SDL_RenderFillRect(const SDL_Rect * rect)
+{
+    return SDL_RenderFillRects(&rect, 1);
+}
+
+int
+SDL_RenderFillRects(const SDL_Rect ** rects, int count)
+{
+    SDL_Renderer *renderer;
+    int i;
+
+    if (!rects) {
+        SDL_SetError("SDL_RenderFillRects(): Passed NULL rects");
+        return -1;
+    }
+
+    renderer = SDL_GetCurrentRenderer(SDL_TRUE);
+    if (!renderer) {
+        return -1;
+    }
+    if (!renderer->RenderFillRects) {
+        SDL_Unsupported();
+        return -1;
+    }
+    if (count < 1) {
+        return 0;
+    }
+    /* Check for NULL rect, which means fill entire window */
+    for (i = 0; i < count; ++i) {
+        if (rects[i] == NULL) {
+            SDL_Window *window;
+            SDL_Rect full_rect;
+            const SDL_Rect *rect;
+
+            window = SDL_GetWindowFromID(renderer->window);
+            full_rect.x = 0;
+            full_rect.y = 0;
+            full_rect.w = window->w;
+            full_rect.h = window->h;
+            rect = &full_rect;
+            return renderer->RenderFillRects(renderer, &rect, 1);
+        }
+    }
+    return renderer->RenderFillRects(renderer, rects, count);
+}
+
+int
+SDL_RenderDrawCircle(int x, int y, int radius)
+{
+    return SDL_RenderDrawEllipse(x, y, 2*radius, 2*radius);
+}
+
+int
+SDL_RenderFillCircle(int x, int y, int radius)
+{
+    return SDL_RenderFillEllipse(x, y, 2*radius, 2*radius);
+}
+
+int SDL_RenderDrawEllipse(int x, int y, int w, int h)
+{
+    SDL_Renderer *renderer;
+
+    renderer = SDL_GetCurrentRenderer(SDL_TRUE);
+    if (!renderer) {
+        return -1;
+    }
+    if (!renderer->RenderDrawEllipse) {
+        SDL_Unsupported();
+        return -1;
+    }
+    return renderer->RenderDrawEllipse(renderer, x, y, w, h);
+}
+
+int SDL_RenderFillEllipse(int x, int y, int w, int h)
+{
+    SDL_Renderer *renderer;
+
+    renderer = SDL_GetCurrentRenderer(SDL_TRUE);
+    if (!renderer) {
+        return -1;
+    }
+    if (!renderer->RenderFillEllipse) {
+        SDL_Unsupported();
+        return -1;
+    }
+    return renderer->RenderFillEllipse(renderer, x, y, w, h);
 }
 
 int