From 404e0cd6ecec721e5dcbc0c96b88bab5bd2755da Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Wed, 23 Dec 2009 01:55:00 +0000 Subject: [PATCH] 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. --- include/SDL_compat.h | 4 +- include/SDL_surface.h | 93 +++- include/SDL_video.h | 72 ++- src/video/SDL_blendline.c | 852 +++++++++++++++++++++++-------- src/video/SDL_draw.h | 249 +++++++-- src/video/SDL_drawline.c | 167 ++++-- src/video/SDL_drawpoint.c | 12 +- src/video/SDL_renderer_gl.c | 85 ++- src/video/SDL_renderer_sw.c | 89 +++- src/video/SDL_sysvideo.h | 19 +- src/video/SDL_video.c | 154 +++++- src/video/dummy/SDL_nullrender.c | 58 ++- src/video/ps3/SDL_ps3render.c | 5 +- src/video/x11/SDL_x11render.c | 74 ++- src/video/x11/SDL_x11sym.h | 7 +- test/automated/Makefile | 2 +- test/automated/render/render.c | 68 +-- test/automated/surface/surface.c | 19 +- test/automated/testsdl.c | 1 - test/testdraw2.c | 20 +- test/testintersections.c | 24 +- test/testnative.c | 6 +- test/testsprite2.c | 38 +- test/testspriteminimal.c | 2 +- 24 files changed, 1628 insertions(+), 492 deletions(-) diff --git a/include/SDL_compat.h b/include/SDL_compat.h index 49bd9f8ca..e77808d64 100644 --- a/include/SDL_compat.h +++ b/include/SDL_compat.h @@ -295,7 +295,9 @@ extern DECLSPEC int SDLCALL SDL_EnableKeyRepeat(int delay, int interval); extern DECLSPEC void SDLCALL SDL_GetKeyRepeat(int *delay, int *interval); extern DECLSPEC int SDLCALL SDL_EnableUNICODE(int enable); -#define SDL_RenderFill SDL_RenderRect +#define SDL_RenderPoint SDL_RenderDrawPoint +#define SDL_RenderLine SDL_RenderDrawLine +#define SDL_RenderFill(X) (X) ? SDL_RenderFillRect(X) : SDL_RenderClear() extern DECLSPEC int SDLCALL SDL_putenv(const char *variable); diff --git a/include/SDL_surface.h b/include/SDL_surface.h index b4cdf0ce1..653d0e16d 100644 --- a/include/SDL_surface.h +++ b/include/SDL_surface.h @@ -411,12 +411,9 @@ extern DECLSPEC int SDLCALL SDL_DrawPoints /** * Blends a point with an RGBA value. * - * The color should be a pixel of the format used by the surface, and - * can be generated by the SDL_MapRGB() function. - * * \return 0 on success, or -1 on error. */ -extern DECLSPEC int SDLCALL SDL_BlendDrawPoint +extern DECLSPEC int SDLCALL SDL_BlendPoint (SDL_Surface * dst, int x, int y, int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); extern DECLSPEC int SDLCALL SDL_BlendPoints @@ -464,9 +461,9 @@ extern DECLSPEC int SDLCALL SDL_DrawRects (SDL_Surface * dst, const SDL_Rect ** rects, int count, Uint32 color); /** - * Blends the given rectangle with \c color. + * Blends an RGBA value into the outline of the given rectangle. * - * If \c rect is NULL, the whole surface will have a blended outline of \c color. + * If \c rect is NULL, the whole surface will have a blended outline. * * \return 0 on success, or -1 on error. */ @@ -495,7 +492,7 @@ extern DECLSPEC int SDLCALL SDL_FillRects /** * Blends an RGBA value into the given rectangle. * - * If \c rect is NULL, the whole surface will be blended with \c color. + * If \c rect is NULL, the whole surface will be blended with the color. * * \return This function returns 0 on success, or -1 on error. */ @@ -506,6 +503,88 @@ extern DECLSPEC int SDLCALL SDL_BlendFillRects (SDL_Surface * dst, const SDL_Rect ** rects, int count, int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +#if 0 +/** + * Draws the given circle with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_DrawCircle + (SDL_Surface * dst, int x, int y, int radius, Uint32 color); + +/** + * Blends an RGBA value into the outline of the given circle. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_BlendCircle + (SDL_Surface * dst, int x, int y, int radius, + int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/** + * Fills the given circle with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillCircle + (SDL_Surface * dst, int x, int y, int radius, Uint32 color); + +/** + * Blends an RGBA value into the given circle. + * + * \return This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_BlendFillCircle + (SDL_Surface * dst, int x, int y, int radius, + int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/** + * Draws the given ellipse with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_DrawEllipse + (SDL_Surface * dst, int x, int y, int w, int h, Uint32 color); + +/** + * Blends an RGBA value into the outline of the given ellipse. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_BlendEllipse + (SDL_Surface * dst, int x, int y, int w, int h, + int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); + +/** + * Fills the given ellipse with \c color. + * + * The color should be a pixel of the format used by the surface, and + * can be generated by the SDL_MapRGB() function. + * + * \return 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_FillEllipse + (SDL_Surface * dst, int x, int y, int w, int h, Uint32 color); + +/** + * Blends an RGBA value into the given ellipse. + * + * \return This function returns 0 on success, or -1 on error. + */ +extern DECLSPEC int SDLCALL SDL_BlendFillEllipse + (SDL_Surface * dst, int x, int y, int w, int h, + int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); +#endif // 0 + /** * Performs a fast blit from the source surface to the destination surface. * diff --git a/include/SDL_video.h b/include/SDL_video.h index 63b18ca0f..e8196c29a 100644 --- a/include/SDL_video.h +++ b/include/SDL_video.h @@ -1137,6 +1137,11 @@ extern DECLSPEC int SDLCALL SDL_SetRenderDrawBlendMode(int blendMode); */ extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(int *blendMode); +/** + * \brief Clear the current rendering target with the drawing color + */ +extern DECLSPEC int SDLCALL SDL_RenderClear(); + /** * \brief Draw a point on the current rendering target. * @@ -1145,7 +1150,7 @@ extern DECLSPEC int SDLCALL SDL_GetRenderDrawBlendMode(int *blendMode); * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderPoint(int x, int y); +extern DECLSPEC int SDLCALL SDL_RenderDrawPoint(int x, int y); /** * \brief Draw some number of points on the current rendering target. @@ -1155,8 +1160,8 @@ extern DECLSPEC int SDLCALL SDL_RenderPoint(int x, int y); * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderPoints(const SDL_Point * points, - int count); +extern DECLSPEC int SDLCALL SDL_RenderDrawPoints(const SDL_Point * points, + int count); /** * \brief Draw a line on the current rendering target. @@ -1168,7 +1173,7 @@ extern DECLSPEC int SDLCALL SDL_RenderPoints(const SDL_Point * points, * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderLine(int x1, int y1, int x2, int y2); +extern DECLSPEC int SDLCALL SDL_RenderDrawLine(int x1, int y1, int x2, int y2); /** * \brief Draw a series of connected lines on the current rendering target. @@ -1178,18 +1183,37 @@ extern DECLSPEC int SDLCALL SDL_RenderLine(int x1, int y1, int x2, int y2); * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderLines(const SDL_Point * points, - int count); +extern DECLSPEC int SDLCALL SDL_RenderDrawLines(const SDL_Point * points, + int count); + +/** + * \brief Draw a rectangle on the current rendering target with the drawing color. + * + * \param rect A pointer to the destination rectangle, or NULL to outline the entire rendering target. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRect(const SDL_Rect * rect); /** - * \brief Fill the current rendering target with the drawing color. + * \brief Draw some number of rectangles in the current rendering target with the drawing color. + * + * \param rects A pointer to an array of destination rectangles. + * \param count The number of rectangles. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawRects(const SDL_Rect ** rect, int count); + +/** + * \brief Fill a rectangle on the current rendering target with the drawing color. * * \param rect A pointer to the destination rectangle, or NULL for the entire * rendering target. * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderRect(const SDL_Rect * rect); +extern DECLSPEC int SDLCALL SDL_RenderFillRect(const SDL_Rect * rect); /** * \brief Fill some number of rectangles in the current rendering target with the drawing color. @@ -1199,7 +1223,37 @@ extern DECLSPEC int SDLCALL SDL_RenderRect(const SDL_Rect * rect); * * \return 0 on success, or -1 if there is no rendering context current. */ -extern DECLSPEC int SDLCALL SDL_RenderRects(const SDL_Rect ** rect, int count); +extern DECLSPEC int SDLCALL SDL_RenderFillRects(const SDL_Rect ** rect, int count); + +#if 0 +/** + * \brief Draw a circle on the current rendering target with the drawing color. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawCircle(int x, int y, int radius); + +/** + * \brief Fill a circle on the current rendering target with the drawing color. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillCircle(int x, int y, int radius); + +/** + * \brief Draw an ellipse on the current rendering target with the drawing color. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderDrawEllipse(int x, int y, int w, int h); + +/** + * \brief Fill an ellipse on the current rendering target with the drawing color. + * + * \return 0 on success, or -1 if there is no rendering context current. + */ +extern DECLSPEC int SDLCALL SDL_RenderFillEllipse(int x, int y, int w, int h); +#endif // 0 /** * \brief Copy a portion of the texture to the current rendering target. diff --git a/src/video/SDL_blendline.c b/src/video/SDL_blendline.c index 8aeda6be0..b9fdcb223 100644 --- a/src/video/SDL_blendline.c +++ b/src/video/SDL_blendline.c @@ -23,241 +23,713 @@ #include "SDL_draw.h" -static int -SDL_BlendLine_RGB555(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - SDL_bool draw_end) + +static void +SDL_BlendLine_RGB2(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, + SDL_bool draw_end) { - unsigned inva = 0xff - a; + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; - switch (blendMode) { - case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_BLEND_RGB555, draw_end); - break; - case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_RGB555, draw_end); - break; - case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_MOD_RGB555, draw_end); - break; - default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_RGB555, draw_end); - break; + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; + } + inva = (a ^ 0xff); + + if (y1 == y2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); + break; + case SDL_BLENDMODE_ADD: + HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); + break; + case SDL_BLENDMODE_MOD: + HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end); + break; + default: + HLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end); + break; + } + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end); + break; + default: + VLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB, draw_end); + break; + default: + DLINE(Uint16, DRAW_SETPIXEL_RGB, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY2_BLEND_RGB, DRAW_SETPIXELXY2_BLEND_RGB, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY2_ADD_RGB, DRAW_SETPIXELXY2_ADD_RGB, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY2_MOD_RGB, DRAW_SETPIXELXY2_MOD_RGB, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY2_RGB, DRAW_SETPIXELXY2_BLEND_RGB, + draw_end); + break; + } } - return 0; } -static int -SDL_BlendLine_RGB565(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, +static void +SDL_BlendLine_RGB555(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, SDL_bool draw_end) { - unsigned inva = 0xff - a; + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; - switch (blendMode) { - case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_BLEND_RGB565, draw_end); - break; - case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_RGB565, draw_end); - break; - case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_MOD_RGB565, draw_end); - break; - default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_RGB565, draw_end); - break; + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; + } + inva = (a ^ 0xff); + + if (y1 == y2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); + break; + case SDL_BLENDMODE_ADD: + HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); + break; + case SDL_BLENDMODE_MOD: + HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end); + break; + default: + HLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end); + break; + } + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end); + break; + default: + VLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB555, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB555, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB555, draw_end); + break; + default: + DLINE(Uint16, DRAW_SETPIXEL_RGB555, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_RGB555, DRAW_SETPIXELXY_BLEND_RGB555, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_ADD_RGB555, DRAW_SETPIXELXY_ADD_RGB555, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_MOD_RGB555, DRAW_SETPIXELXY_MOD_RGB555, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_RGB555, DRAW_SETPIXELXY_BLEND_RGB555, + draw_end); + break; + } } - return 0; } -static int -SDL_BlendLine_RGB888(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, +static void +SDL_BlendLine_RGB565(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, SDL_bool draw_end) { - unsigned inva = 0xff - a; + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; - switch (blendMode) { - case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_BLEND_RGB888, draw_end); - break; - case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_RGB888, draw_end); - break; - case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_MOD_RGB888, draw_end); - break; - default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_RGB888, draw_end); - break; + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; } - return 0; -} - -static int -SDL_BlendLine_ARGB8888(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - SDL_bool draw_end) -{ - unsigned inva = 0xff - a; + inva = (a ^ 0xff); - switch (blendMode) { - case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_BLEND_ARGB8888, draw_end); - break; - case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ADD_ARGB8888, draw_end); - break; - case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_MOD_ARGB8888, draw_end); - break; - default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY_ARGB8888, draw_end); - break; + if (y1 == y2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + HLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); + break; + case SDL_BLENDMODE_ADD: + HLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); + break; + case SDL_BLENDMODE_MOD: + HLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end); + break; + default: + HLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end); + break; + } + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end); + break; + default: + VLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint16, DRAW_SETPIXEL_BLEND_RGB565, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint16, DRAW_SETPIXEL_ADD_RGB565, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint16, DRAW_SETPIXEL_MOD_RGB565, draw_end); + break; + default: + DLINE(Uint16, DRAW_SETPIXEL_RGB565, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_RGB565, DRAW_SETPIXELXY_BLEND_RGB565, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_ADD_RGB565, DRAW_SETPIXELXY_ADD_RGB565, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_MOD_RGB565, DRAW_SETPIXELXY_MOD_RGB565, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_RGB565, DRAW_SETPIXELXY_BLEND_RGB565, + draw_end); + break; + } } - return 0; } -static int -SDL_BlendLine_RGB(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - SDL_bool draw_end) +static void +SDL_BlendLine_RGB4(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, + SDL_bool draw_end) { - SDL_PixelFormat *fmt = dst->format; - unsigned inva = 0xff - a; + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; - switch (fmt->BytesPerPixel) { - case 2: + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; + } + inva = (a ^ 0xff); + + if (y1 == y2) { switch (blendMode) { case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY2_BLEND_RGB, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY2_ADD_RGB, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY2_MOD_RGB, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end); break; default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY2_RGB, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end); break; } - return 0; - case 4: + } else if (x1 == x2) { switch (blendMode) { case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_BLEND_RGB, draw_end); + VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); break; case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_ADD_RGB, draw_end); + VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); break; case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_MOD_RGB, draw_end); + VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end); break; default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_RGB, draw_end); + VLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB, draw_end); + break; + default: + DLINE(Uint32, DRAW_SETPIXEL_RGB, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_BLEND_RGB, DRAW_SETPIXELXY4_BLEND_RGB, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_ADD_RGB, DRAW_SETPIXELXY4_ADD_RGB, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_MOD_RGB, DRAW_SETPIXELXY4_MOD_RGB, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_RGB, DRAW_SETPIXELXY4_BLEND_RGB, + draw_end); break; } - return 0; - default: - SDL_Unsupported(); - return -1; } } -static int -SDL_BlendLine_RGBA(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - SDL_bool draw_end) +static void +SDL_BlendLine_RGBA4(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, + SDL_bool draw_end) { - SDL_PixelFormat *fmt = dst->format; - unsigned inva = 0xff - a; + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; - switch (fmt->BytesPerPixel) { - case 4: + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; + } + inva = (a ^ 0xff); + + if (y1 == y2) { switch (blendMode) { case SDL_BLENDMODE_BLEND: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_BLEND_RGBA, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); break; case SDL_BLENDMODE_ADD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_ADD_RGBA, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); break; case SDL_BLENDMODE_MOD: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_MOD_RGBA, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end); break; default: - DRAWLINE(x1, y1, x2, y2, DRAW_SETPIXELXY4_RGBA, draw_end); + HLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end); + break; + } + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end); + break; + default: + VLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGBA, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint32, DRAW_SETPIXEL_ADD_RGBA, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint32, DRAW_SETPIXEL_MOD_RGBA, draw_end); + break; + default: + DLINE(Uint32, DRAW_SETPIXEL_RGBA, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_BLEND_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_ADD_RGBA, DRAW_SETPIXELXY4_ADD_RGBA, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_MOD_RGBA, DRAW_SETPIXELXY4_MOD_RGBA, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY4_RGBA, DRAW_SETPIXELXY4_BLEND_RGBA, + draw_end); break; } - return 0; - default: - SDL_Unsupported(); - return -1; } } -int -SDL_BlendLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +static void +SDL_BlendLine_RGB888(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, + SDL_bool draw_end) { - /* This function doesn't work on surfaces < 8 bpp */ - if (dst->format->BitsPerPixel < 8) { - SDL_SetError("SDL_BlendLine(): Unsupported surface format"); - return (-1); + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; + + if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; } + inva = (a ^ 0xff); - /* Perform clipping */ - if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) { - return (0); + if (y1 == y2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end); + break; + case SDL_BLENDMODE_ADD: + HLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end); + break; + case SDL_BLENDMODE_MOD: + HLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end); + break; + default: + HLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end); + break; + } + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end); + break; + default: + VLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_RGB888, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint32, DRAW_SETPIXEL_ADD_RGB888, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint32, DRAW_SETPIXEL_MOD_RGB888, draw_end); + break; + default: + DLINE(Uint32, DRAW_SETPIXEL_RGB888, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_RGB888, DRAW_SETPIXELXY_BLEND_RGB888, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_ADD_RGB888, DRAW_SETPIXELXY_ADD_RGB888, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_MOD_RGB888, DRAW_SETPIXELXY_MOD_RGB888, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_RGB888, DRAW_SETPIXELXY_BLEND_RGB888, + draw_end); + break; + } } +} +static void +SDL_BlendLine_ARGB8888(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 _r, Uint8 _g, Uint8 _b, Uint8 _a, + SDL_bool draw_end) +{ + const SDL_PixelFormat *fmt = dst->format; + unsigned r, g, b, a, inva; if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { - r = DRAW_MUL(r, a); - g = DRAW_MUL(g, a); - b = DRAW_MUL(b, a); + r = DRAW_MUL(_r, _a); + g = DRAW_MUL(_g, _a); + b = DRAW_MUL(_b, _a); + a = _a; + } else { + r = _r; + g = _g; + b = _b; + a = _a; } + inva = (a ^ 0xff); - switch (dst->format->BitsPerPixel) { - case 15: - switch (dst->format->Rmask) { - case 0x7C00: - return SDL_BlendLine_RGB555(dst, x1, y1, x2, y2, blendMode, r, g, - b, a, SDL_TRUE); + if (y1 == y2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + HLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_ADD: + HLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_MOD: + HLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); + break; + default: + HLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); + break; } - break; - case 16: - switch (dst->format->Rmask) { - case 0xF800: - return SDL_BlendLine_RGB565(dst, x1, y1, x2, y2, blendMode, r, g, - b, a, SDL_TRUE); + } else if (x1 == x2) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + VLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_ADD: + VLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_MOD: + VLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); + break; + default: + VLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); + break; + } + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + DLINE(Uint32, DRAW_SETPIXEL_BLEND_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_ADD: + DLINE(Uint32, DRAW_SETPIXEL_ADD_ARGB8888, draw_end); + break; + case SDL_BLENDMODE_MOD: + DLINE(Uint32, DRAW_SETPIXEL_MOD_ARGB8888, draw_end); + break; + default: + DLINE(Uint32, DRAW_SETPIXEL_ARGB8888, draw_end); + break; + } + } else { + switch (blendMode) { + case SDL_BLENDMODE_BLEND: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_BLEND_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888, + draw_end); + break; + case SDL_BLENDMODE_ADD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_ADD_ARGB8888, DRAW_SETPIXELXY_ADD_ARGB8888, + draw_end); + break; + case SDL_BLENDMODE_MOD: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_MOD_ARGB8888, DRAW_SETPIXELXY_MOD_ARGB8888, + draw_end); + break; + default: + AALINE(x1, y1, x2, y2, + DRAW_SETPIXELXY_ARGB8888, DRAW_SETPIXELXY_BLEND_ARGB8888, + draw_end); + break; + } + } +} + +typedef void (*BlendLineFunc) (SDL_Surface * dst, + int x1, int y1, int x2, int y2, + int blendMode, + Uint8 r, Uint8 g, Uint8 b, Uint8 a, + SDL_bool draw_end); + +static BlendLineFunc +SDL_CalculateBlendLineFunc(const SDL_PixelFormat * fmt) +{ + switch (fmt->BytesPerPixel) { + case 2: + if (fmt->Rmask == 0x7C00) { + return SDL_BlendLine_RGB555; + } else if (fmt->Rmask == 0xF800) { + return SDL_BlendLine_RGB565; + } else { + return SDL_BlendLine_RGB2; } break; - case 32: - switch (dst->format->Rmask) { - case 0x00FF0000: - if (!dst->format->Amask) { - return SDL_BlendLine_RGB888(dst, x1, y1, x2, y2, blendMode, r, - g, b, a, SDL_TRUE); + case 4: + if (fmt->Rmask == 0x00FF0000) { + if (fmt->Amask) { + return SDL_BlendLine_ARGB8888; } else { - return SDL_BlendLine_ARGB8888(dst, x1, y1, x2, y2, blendMode, - r, g, b, a, SDL_TRUE); + return SDL_BlendLine_RGB888; + } + } else { + if (fmt->Amask) { + return SDL_BlendLine_RGBA4; + } else { + return SDL_BlendLine_RGB4; } - break; } - break; - default: - break; } + return NULL; +} - if (!dst->format->Amask) { - return SDL_BlendLine_RGB(dst, x1, y1, x2, y2, blendMode, - r, g, b, a, SDL_TRUE); - } else { - return SDL_BlendLine_RGBA(dst, x1, y1, x2, y2, blendMode, - r, g, b, a, SDL_TRUE); +int +SDL_BlendLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, + int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) +{ + BlendLineFunc func; + + if (!dst) { + SDL_SetError("SDL_BlendLine(): Passed NULL destination surface"); + return -1; + } + + func = SDL_CalculateBlendLineFunc(dst->format); + if (!func) { + SDL_SetError("SDL_BlendLine(): Unsupported surface format"); + return -1; + } + + /* Perform clipping */ + /* FIXME: We don't actually want to clip, as it may change line slope */ + if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) { + return 0; } + + func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, SDL_TRUE); + return 0; } int @@ -267,64 +739,20 @@ SDL_BlendLines(SDL_Surface * dst, const SDL_Point * points, int count, int i; int x1, y1; int x2, y2; - int (*func)(SDL_Surface * dst, int x1, int y1, int x2, int y2, - int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a, - SDL_bool draw_end) = NULL; - int status = 0; + SDL_bool draw_end; + BlendLineFunc func; if (!dst) { - SDL_SetError("Passed NULL destination surface"); + SDL_SetError("SDL_BlendLines(): Passed NULL destination surface"); return -1; } - /* This function doesn't work on surfaces < 8 bpp */ - if (dst->format->BitsPerPixel < 8) { + func = SDL_CalculateBlendLineFunc(dst->format); + if (!func) { SDL_SetError("SDL_BlendLines(): Unsupported surface format"); return -1; } - if (blendMode == SDL_BLENDMODE_BLEND || blendMode == SDL_BLENDMODE_ADD) { - r = DRAW_MUL(r, a); - g = DRAW_MUL(g, a); - b = DRAW_MUL(b, a); - } - - /* FIXME: Does this function pointer slow things down significantly? */ - switch (dst->format->BitsPerPixel) { - case 15: - switch (dst->format->Rmask) { - case 0x7C00: - func = SDL_BlendLine_RGB555; - } - break; - case 16: - switch (dst->format->Rmask) { - case 0xF800: - func = SDL_BlendLine_RGB565; - } - break; - case 32: - switch (dst->format->Rmask) { - case 0x00FF0000: - if (!dst->format->Amask) { - func = SDL_BlendLine_RGB888; - } else { - func = SDL_BlendLine_ARGB8888; - } - break; - } - default: - break; - } - - if (!func) { - if (!dst->format->Amask) { - func = SDL_BlendLine_RGB; - } else { - func = SDL_BlendLine_RGBA; - } - } - for (i = 1; i < count; ++i) { x1 = points[i-1].x; y1 = points[i-1].y; @@ -337,12 +765,16 @@ SDL_BlendLines(SDL_Surface * dst, const SDL_Point * points, int count, continue; } - status = func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, SDL_FALSE); + /* Draw the end if it was clipped */ + draw_end = (x2 != points[i].x || y2 != points[i].y); + + func(dst, x1, y1, x2, y2, blendMode, r, g, b, a, draw_end); } if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) { - SDL_BlendPoint(dst, points[count-1].x, points[count-1].y, r, g, b, a); + SDL_BlendPoint(dst, points[count-1].x, points[count-1].y, + blendMode, r, g, b, a); } - return status; + return 0; } /* vi: set ts=4 sw=4 expandtab: */ diff --git a/src/video/SDL_draw.h b/src/video/SDL_draw.h index 779f3809e..c19313e2e 100644 --- a/src/video/SDL_draw.h +++ b/src/video/SDL_draw.h @@ -29,12 +29,20 @@ #define DRAW_MUL(_a, _b) (((unsigned)(_a)*(_b))/255) -#define DRAW_FASTSETPIXEL(x, y, type, bpp, color) \ - *(type *)((Uint8 *)dst->pixels + y * dst->pitch + x * bpp) = (type) color +#define DRAW_FASTSETPIXEL(type) \ + *pixel = (type) color -#define DRAW_FASTSETPIXEL1(x, y) DRAW_FASTSETPIXEL(x, y, Uint8, 1, color); -#define DRAW_FASTSETPIXEL2(x, y) DRAW_FASTSETPIXEL(x, y, Uint16, 2, color); -#define DRAW_FASTSETPIXEL4(x, y) DRAW_FASTSETPIXEL(x, y, Uint32, 4, color); +#define DRAW_FASTSETPIXEL1 DRAW_FASTSETPIXEL(Uint8) +#define DRAW_FASTSETPIXEL2 DRAW_FASTSETPIXEL(Uint16) +#define DRAW_FASTSETPIXEL4 DRAW_FASTSETPIXEL(Uint32) + +#define DRAW_FASTSETPIXELXY(x, y, type, bpp, color) \ + *(type *)((Uint8 *)dst->pixels + (y) * dst->pitch \ + + (x) * bpp) = (type) color + +#define DRAW_FASTSETPIXELXY1(x, y) DRAW_FASTSETPIXELXY(x, y, Uint8, 1, color) +#define DRAW_FASTSETPIXELXY2(x, y) DRAW_FASTSETPIXELXY(x, y, Uint16, 2, color) +#define DRAW_FASTSETPIXELXY4(x, y) DRAW_FASTSETPIXELXY(x, y, Uint32, 4, color) #define DRAW_SETPIXEL(setpixel) \ do { \ @@ -74,7 +82,8 @@ do { \ #define DRAW_SETPIXELXY(x, y, type, bpp, op) \ do { \ - type *pixel = (type *)((Uint8 *)dst->pixels + y * dst->pitch + x * bpp); \ + type *pixel = (type *)((Uint8 *)dst->pixels + (y) * dst->pitch \ + + (x) * bpp); \ op; \ } while (0) @@ -283,7 +292,87 @@ do { \ #define ABS(_x) ((_x) < 0 ? -(_x) : (_x)) -#define BRESENHAM(x1, y1, x2, y2, op, draw_end) \ +/* Horizontal line */ +#define HLINE(type, op, draw_end) \ +{ \ + int length; \ + int pitch = (dst->pitch / dst->format->BytesPerPixel); \ + type *pixel; \ + if (x1 <= x2) { \ + pixel = (type *)dst->pixels + y1 * pitch + x1; \ + length = draw_end ? (x2-x1+1) : (x2-x1); \ + } else { \ + pixel = (type *)dst->pixels + y1 * pitch + x2; \ + if (!draw_end) { \ + ++pixel; \ + } \ + length = draw_end ? (x1-x2+1) : (x1-x2); \ + } \ + while (length--) { \ + op; \ + ++pixel; \ + } \ +} + +/* Vertical line */ +#define VLINE(type, op, draw_end) \ +{ \ + int length; \ + int pitch = (dst->pitch / dst->format->BytesPerPixel); \ + type *pixel; \ + if (y1 <= y2) { \ + pixel = (type *)dst->pixels + y1 * pitch + x1; \ + length = draw_end ? (y2-y1+1) : (y2-y1); \ + } else { \ + pixel = (type *)dst->pixels + y2 * pitch + x1; \ + if (!draw_end) { \ + pixel += pitch; \ + } \ + length = draw_end ? (y1-y2+1) : (y1-y2); \ + } \ + while (length--) { \ + op; \ + pixel += pitch; \ + } \ +} + +/* Diagonal line */ +#define DLINE(type, op, draw_end) \ +{ \ + int length; \ + int pitch = (dst->pitch / dst->format->BytesPerPixel); \ + type *pixel; \ + if (y1 <= y2) { \ + pixel = (type *)dst->pixels + y1 * pitch + x1; \ + if (x1 <= x2) { \ + ++pitch; \ + } else { \ + --pitch; \ + } \ + length = (y2-y1); \ + } else { \ + pixel = (type *)dst->pixels + y2 * pitch + x2; \ + if (x2 <= x1) { \ + ++pitch; \ + } else { \ + --pitch; \ + } \ + if (!draw_end) { \ + pixel += pitch; \ + } \ + length = (y1-y2); \ + } \ + if (draw_end) { \ + ++length; \ + } \ + while (length--) { \ + op; \ + pixel += pitch; \ + } \ +} + +/* Bresenham's line algorithm */ +#define BLINE(x1, y1, x2, y2, op, draw_end) \ { \ int i, deltax, deltay, numpixels; \ int d, dinc1, dinc2; \ @@ -341,45 +430,123 @@ do { \ } \ } \ } -#define DRAWLINE BRESENHAM -/* - * Define draw rect macro - * (not tested, this level of optimization not needed ... yet?) - */ -#define DRAWRECT(type, op) \ -do { \ - int width = rect->w; \ - int height = rect->h; \ - int pitch = (dst->pitch / dst->format->BytesPerPixel); \ - int skip = pitch - width; \ - type *pixel; \ - pixel = (type *)dst->pixels + rect->y * pitch + rect->x; \ - { int n = (width+3)/4; \ - switch (width & 3) { \ - case 0: do { op; pixel++; \ - case 3: op; pixel++; \ - case 2: op; pixel++; \ - case 1: op; pixel++; \ - } while ( --n > 0 ); \ - } \ +/* Xiaolin Wu's line algorithm, based on Michael Abrash's implementation */ +#define WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \ +{ \ + Uint16 ErrorAdj, ErrorAcc; \ + Uint16 ErrorAccTemp, Weighting; \ + int DeltaX, DeltaY, Temp, XDir; \ + unsigned r, g, b, a, inva; \ + \ + /* Draw the initial pixel, which is always exactly intersected by \ + the line and so needs no weighting */ \ + opaque_op(x1, y1); \ + \ + /* Draw the final pixel, which is always exactly intersected by the line \ + and so needs no weighting */ \ + if (draw_end) { \ + opaque_op(x2, y2); \ } \ - pixel += skip; \ - width -= 1; \ - height -= 2; \ - while (height--) { \ - op; pixel += width; op; pixel += skip; \ + \ + /* Make sure the line runs top to bottom */ \ + if (y1 > y2) { \ + Temp = y1; y1 = y2; y2 = Temp; \ + Temp = x1; x1 = x2; x2 = Temp; \ } \ - { int n = (width+3)/4; \ - switch (width & 3) { \ - case 0: do { op; pixel++; \ - case 3: op; pixel++; \ - case 2: op; pixel++; \ - case 1: op; pixel++; \ - } while ( --n > 0 ); \ + DeltaY = y2 - y1; \ + \ + if ((DeltaX = x2 - x1) >= 0) { \ + XDir = 1; \ + } else { \ + XDir = -1; \ + DeltaX = -DeltaX; /* make DeltaX positive */ \ + } \ + \ + /* line is not horizontal, diagonal, or vertical */ \ + ErrorAcc = 0; /* initialize the line error accumulator to 0 */ \ + \ + /* Is this an X-major or Y-major line? */ \ + if (DeltaY > DeltaX) { \ + /* Y-major line; calculate 16-bit fixed-point fractional part of a \ + pixel that X advances each time Y advances 1 pixel, truncating the \ + result so that we won't overrun the endpoint along the X axis */ \ + ErrorAdj = ((unsigned long) DeltaX << 16) / (unsigned long) DeltaY; \ + /* Draw all pixels other than the first and last */ \ + while (--DeltaY) { \ + ErrorAccTemp = ErrorAcc; /* remember currrent accumulated error */ \ + ErrorAcc += ErrorAdj; /* calculate error for next pixel */ \ + if (ErrorAcc <= ErrorAccTemp) { \ + /* The error accumulator turned over, so advance the X coord */ \ + x1 += XDir; \ + } \ + y1++; /* Y-major, so always advance Y */ \ + /* The IntensityBits most significant bits of ErrorAcc give us the \ + intensity weighting for this pixel, and the complement of the \ + weighting for the paired pixel */ \ + Weighting = ErrorAcc >> 8; \ + { \ + a = DRAW_MUL(_a, (Weighting ^ 255)); \ + r = DRAW_MUL(_r, a); \ + g = DRAW_MUL(_g, a); \ + b = DRAW_MUL(_b, a); \ + inva = (a ^ 0xFF); \ + blend_op(x1, y1); \ + } \ + { \ + a = DRAW_MUL(_a, Weighting); \ + r = DRAW_MUL(_r, a); \ + g = DRAW_MUL(_g, a); \ + b = DRAW_MUL(_b, a); \ + inva = (a ^ 0xFF); \ + blend_op(x1 + XDir, y1); \ + } \ + } \ + } else { \ + /* X-major line; calculate 16-bit fixed-point fractional part of a \ + pixel that Y advances each time X advances 1 pixel, truncating the \ + result to avoid overrunning the endpoint along the X axis */ \ + ErrorAdj = ((unsigned long) DeltaY << 16) / (unsigned long) DeltaX; \ + /* Draw all pixels other than the first and last */ \ + while (--DeltaX) { \ + ErrorAccTemp = ErrorAcc; /* remember currrent accumulated error */ \ + ErrorAcc += ErrorAdj; /* calculate error for next pixel */ \ + if (ErrorAcc <= ErrorAccTemp) { \ + /* The error accumulator turned over, so advance the Y coord */ \ + y1++; \ + } \ + x1 += XDir; /* X-major, so always advance X */ \ + /* The IntensityBits most significant bits of ErrorAcc give us the \ + intensity weighting for this pixel, and the complement of the \ + weighting for the paired pixel */ \ + Weighting = ErrorAcc >> 8; \ + { \ + a = DRAW_MUL(_a, (Weighting ^ 255)); \ + r = DRAW_MUL(_r, a); \ + g = DRAW_MUL(_g, a); \ + b = DRAW_MUL(_b, a); \ + inva = (a ^ 0xFF); \ + blend_op(x1, y1); \ + } \ + { \ + a = DRAW_MUL(_a, Weighting); \ + r = DRAW_MUL(_r, a); \ + g = DRAW_MUL(_g, a); \ + b = DRAW_MUL(_b, a); \ + inva = (a ^ 0xFF); \ + blend_op(x1, y1 + 1); \ + } \ } \ } \ -} while (0) +} + +#ifdef AA_LINES +#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \ + WULINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) +#else +#define AALINE(x1, y1, x2, y2, opaque_op, blend_op, draw_end) \ + BLINE(x1, y1, x2, y2, opaque_op, draw_end) +#endif /* * Define fill rect macro diff --git a/src/video/SDL_drawline.c b/src/video/SDL_drawline.c index 3d572ac62..aa185b34a 100644 --- a/src/video/SDL_drawline.c +++ b/src/video/SDL_drawline.c @@ -23,17 +23,116 @@ #include "SDL_draw.h" +static void +SDL_DrawLine1(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color, + SDL_bool draw_end) +{ + if (y1 == y2) { + HLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end); + } else if (x1 == x2) { + VLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end); + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + DLINE(Uint8, DRAW_FASTSETPIXEL1, draw_end); + } else { + BLINE(x1, y1, x2, y2, DRAW_FASTSETPIXELXY1, draw_end); + } +} + +static void +SDL_DrawLine2(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color, + SDL_bool draw_end) +{ + if (y1 == y2) { + HLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end); + } else if (x1 == x2) { + VLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end); + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + DLINE(Uint16, DRAW_FASTSETPIXEL2, draw_end); + } else { + Uint8 _r, _g, _b, _a; + const SDL_PixelFormat * fmt = dst->format; + SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a); + if (fmt->Rmask == 0x7C00) { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB555, + draw_end); + } else if (fmt->Rmask == 0xF800) { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY_BLEND_RGB565, + draw_end); + } else { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY2, DRAW_SETPIXELXY2_BLEND_RGB, + draw_end); + } + } +} + +static void +SDL_DrawLine4(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color, + SDL_bool draw_end) +{ + if (y1 == y2) { + HLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); + } else if (x1 == x2) { + VLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); + } else if (ABS(x1 - x2) == ABS(y1 - y2)) { + DLINE(Uint32, DRAW_FASTSETPIXEL4, draw_end); + } else { + Uint8 _r, _g, _b, _a; + const SDL_PixelFormat * fmt = dst->format; + SDL_GetRGBA(color, fmt, &_r, &_g, &_b, &_a); + if (fmt->Rmask == 0x00FF0000) { + if (!fmt->Amask) { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_RGB888, + draw_end); + } else { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY_BLEND_ARGB8888, + draw_end); + } + } else { + AALINE(x1, y1, x2, y2, + DRAW_FASTSETPIXELXY4, DRAW_SETPIXELXY4_BLEND_RGB, + draw_end); + } + } +} + +typedef void (*DrawLineFunc) (SDL_Surface * dst, + int x1, int y1, int x2, int y2, + Uint32 color, SDL_bool draw_end); + +static DrawLineFunc +SDL_CalculateDrawLineFunc(const SDL_PixelFormat * fmt) +{ + switch (fmt->BytesPerPixel) { + case 1: + if (fmt->BitsPerPixel < 8) { + break; + } + return SDL_DrawLine1; + case 2: + return SDL_DrawLine2; + case 4: + return SDL_DrawLine4; + } + return NULL; +} int SDL_DrawLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color) { + DrawLineFunc func; + if (!dst) { - SDL_SetError("Passed NULL destination surface"); + SDL_SetError("SDL_DrawLine(): Passed NULL destination surface"); return -1; } - /* This function doesn't work on surfaces < 8 bpp */ - if (dst->format->BitsPerPixel < 8) { + func = SDL_CalculateDrawLineFunc(dst->format); + if (!func) { SDL_SetError("SDL_DrawLine(): Unsupported surface format"); return -1; } @@ -41,23 +140,10 @@ SDL_DrawLine(SDL_Surface * dst, int x1, int y1, int x2, int y2, Uint32 color) /* Perform clipping */ /* FIXME: We don't actually want to clip, as it may change line slope */ if (!SDL_IntersectRectAndLine(&dst->clip_rect, &x1, &y1, &x2, &y2)) { - return (0); + return 0; } - switch (dst->format->BytesPerPixel) { - case 1: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL1, SDL_TRUE); - break; - case 2: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL2, SDL_TRUE); - break; - case 3: - SDL_Unsupported(); - return -1; - case 4: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL4, SDL_TRUE); - break; - } + func(dst, x1, y1, x2, y2, color, SDL_TRUE); return 0; } @@ -66,27 +152,27 @@ SDL_DrawLines(SDL_Surface * dst, const SDL_Point * points, int count, Uint32 color) { int i; + int x1, y1; + int x2, y2; + SDL_bool draw_end; + DrawLineFunc func; if (!dst) { - SDL_SetError("Passed NULL destination surface"); + SDL_SetError("SDL_DrawLines(): Passed NULL destination surface"); return -1; } - /* This function doesn't work on surfaces < 8 bpp */ - if (dst->format->BitsPerPixel < 8) { - SDL_SetError("SDL_DrawLine(): Unsupported surface format"); + func = SDL_CalculateDrawLineFunc(dst->format); + if (!func) { + SDL_SetError("SDL_DrawLines(): Unsupported surface format"); return -1; } - if (count < 2) { - return 0; - } - for (i = 1; i < count; ++i) { - int x1 = points[i-1].x; - int y1 = points[i-1].y; - int x2 = points[i].x; - int y2 = points[i].y; + x1 = points[i-1].x; + y1 = points[i-1].y; + x2 = points[i].x; + y2 = points[i].y; /* Perform clipping */ /* FIXME: We don't actually want to clip, as it may change line slope */ @@ -94,20 +180,13 @@ SDL_DrawLines(SDL_Surface * dst, const SDL_Point * points, int count, continue; } - switch (dst->format->BytesPerPixel) { - case 1: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL1, SDL_TRUE); - break; - case 2: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL2, SDL_TRUE); - break; - case 3: - SDL_Unsupported(); - return -1; - case 4: - DRAWLINE(x1, y1, x2, y2, DRAW_FASTSETPIXEL4, SDL_TRUE); - break; - } + /* Draw the end if it was clipped */ + draw_end = (x2 != points[i].x || y2 != points[i].y); + + func(dst, x1, y1, x2, y2, color, draw_end); + } + if (points[0].x != points[count-1].x || points[0].y != points[count-1].y) { + SDL_DrawPoint(dst, points[count-1].x, points[count-1].y, color); } return 0; } diff --git a/src/video/SDL_drawpoint.c b/src/video/SDL_drawpoint.c index 74f9ff739..4390e869f 100644 --- a/src/video/SDL_drawpoint.c +++ b/src/video/SDL_drawpoint.c @@ -47,16 +47,16 @@ SDL_DrawPoint(SDL_Surface * dst, int x, int y, Uint32 color) switch (dst->format->BytesPerPixel) { case 1: - DRAW_FASTSETPIXEL1(x, y); + DRAW_FASTSETPIXELXY1(x, y); break; case 2: - DRAW_FASTSETPIXEL2(x, y); + DRAW_FASTSETPIXELXY2(x, y); break; case 3: SDL_Unsupported(); return -1; case 4: - DRAW_FASTSETPIXEL4(x, y); + DRAW_FASTSETPIXELXY4(x, y); break; } return 0; @@ -97,16 +97,16 @@ SDL_DrawPoints(SDL_Surface * dst, const SDL_Point * points, int count, switch (dst->format->BytesPerPixel) { case 1: - DRAW_FASTSETPIXEL1(x, y); + DRAW_FASTSETPIXELXY1(x, y); break; case 2: - DRAW_FASTSETPIXEL2(x, y); + DRAW_FASTSETPIXELXY2(x, y); break; case 3: SDL_Unsupported(); return -1; case 4: - DRAW_FASTSETPIXEL4(x, y); + DRAW_FASTSETPIXELXY4(x, y); break; } } diff --git a/src/video/SDL_renderer_gl.c b/src/video/SDL_renderer_gl.c index 79d1b12e0..c7371e2fc 100644 --- a/src/video/SDL_renderer_gl.c +++ b/src/video/SDL_renderer_gl.c @@ -96,12 +96,15 @@ static int GL_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, static void GL_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void GL_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); -static int GL_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int GL_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int GL_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, - int count); +static int GL_RenderClear(SDL_Renderer * renderer); +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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static int GL_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, @@ -306,9 +309,11 @@ GL_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->LockTexture = GL_LockTexture; renderer->UnlockTexture = GL_UnlockTexture; renderer->DirtyTexture = GL_DirtyTexture; - renderer->RenderPoints = GL_RenderPoints; - renderer->RenderLines = GL_RenderLines; - renderer->RenderRects = GL_RenderRects; + 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; renderer->RenderWritePixels = GL_RenderWritePixels; @@ -1114,7 +1119,23 @@ GL_SetBlendMode(GL_RenderData * data, int blendMode, int isprimitive) } static int -GL_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) +GL_RenderClear(SDL_Renderer * renderer) +{ + GL_RenderData *data = (GL_RenderData *) renderer->driverdata; + + data->glClearColor((GLfloat) renderer->r * inv255f, + (GLfloat) renderer->g * inv255f, + (GLfloat) renderer->b * inv255f, + (GLfloat) renderer->a * inv255f); + + data->glClear(GL_COLOR_BUFFER_BIT); + + return 0; +} + +static int +GL_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, + int count) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; int i; @@ -1136,7 +1157,8 @@ GL_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -GL_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) +GL_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, + int count) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; int i; @@ -1199,7 +1221,46 @@ GL_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -GL_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) +GL_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) +{ + GL_RenderData *data = (GL_RenderData *) renderer->driverdata; + int i, x, y; + SDL_Point points[4]; + + GL_SetBlendMode(data, renderer->blendMode, 1); + + 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) { GL_RenderData *data = (GL_RenderData *) renderer->driverdata; int i; diff --git a/src/video/SDL_renderer_sw.c b/src/video/SDL_renderer_sw.c index 5aa018d3e..77fc4cae2 100644 --- a/src/video/SDL_renderer_sw.c +++ b/src/video/SDL_renderer_sw.c @@ -59,12 +59,14 @@ static int SW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch); static void SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); -static int SW_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int SW_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int SW_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, - int count); +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, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static int SW_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, @@ -230,9 +232,10 @@ SW_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->ActivateRenderer = SW_ActivateRenderer; renderer->DisplayModeChanged = SW_DisplayModeChanged; - renderer->RenderPoints = SW_RenderPoints; - renderer->RenderLines = SW_RenderLines; - renderer->RenderRects = SW_RenderRects; + renderer->RenderDrawPoints = SW_RenderDrawPoints; + renderer->RenderDrawLines = SW_RenderDrawLines; + renderer->RenderDrawRects = SW_RenderDrawRects; + renderer->RenderFillRects = SW_RenderFillRects; renderer->RenderCopy = SW_RenderCopy; renderer->RenderReadPixels = SW_RenderReadPixels; renderer->RenderWritePixels = SW_RenderWritePixels; @@ -539,7 +542,8 @@ SW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) } static int -SW_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) +SW_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, + int count) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; SDL_Texture *texture = data->texture[data->current_texture]; @@ -602,7 +606,8 @@ SW_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -SW_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) +SW_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, + int count) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; SDL_Texture *texture = data->texture[data->current_texture]; @@ -670,7 +675,8 @@ SW_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -SW_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) +SW_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, + int count) { SW_RenderData *data = (SW_RenderData *) renderer->driverdata; SDL_Texture *texture = data->texture[data->current_texture]; @@ -712,7 +718,7 @@ SW_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) if (renderer->blendMode == SDL_BLENDMODE_NONE || renderer->blendMode == SDL_BLENDMODE_MASK) { - status = SDL_FillRect(&data->surface, NULL, color); + status = SDL_DrawRect(&data->surface, NULL, color); } else { status = SDL_BlendRect(&data->surface, NULL, renderer->blendMode, @@ -725,6 +731,63 @@ SW_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) return status; } +static int +SW_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, + int count) +{ + SW_RenderData *data = (SW_RenderData *) renderer->driverdata; + SDL_Texture *texture = data->texture[data->current_texture]; + SDL_Rect clip, rect; + Uint32 color = 0; + int i; + int status = 0; + + clip.x = 0; + clip.y = 0; + clip.w = texture->w; + clip.h = texture->h; + + if (renderer->blendMode == SDL_BLENDMODE_NONE || + renderer->blendMode == SDL_BLENDMODE_MASK) { + color = SDL_MapRGBA(data->surface.format, + renderer->r, renderer->g, renderer->b, + renderer->a); + } + + for (i = 0; i < count; ++i) { + if (!SDL_IntersectRect(rects[i], &clip, &rect)) { + /* Nothing to draw */ + continue; + } + + if (data->renderer->info.flags & SDL_RENDERER_PRESENTCOPY) { + SDL_AddDirtyRect(&data->dirty, &rect); + } + + 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 || + renderer->blendMode == SDL_BLENDMODE_MASK) { + status = SDL_FillRect(&data->surface, NULL, color); + } else { + status = SDL_BlendFillRect(&data->surface, NULL, + renderer->blendMode, + renderer->r, renderer->g, renderer->b, + renderer->a); + } + + data->renderer->UnlockTexture(data->renderer, texture); + } + return status; +} + static int SW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) diff --git a/src/video/SDL_sysvideo.h b/src/video/SDL_sysvideo.h index b0bfbde4c..62edbbc78 100644 --- a/src/video/SDL_sysvideo.h +++ b/src/video/SDL_sysvideo.h @@ -90,12 +90,19 @@ struct SDL_Renderer int numrects, const SDL_Rect * rects); int (*SetDrawColor) (SDL_Renderer * renderer); int (*SetDrawBlendMode) (SDL_Renderer * renderer); - int (*RenderPoints) (SDL_Renderer * renderer, const SDL_Point * points, - int count); - int (*RenderLines) (SDL_Renderer * renderer, const SDL_Point * points, - int count); - int (*RenderRects) (SDL_Renderer * renderer, const SDL_Rect ** rects, - int count); + int (*RenderClear) (SDL_Renderer * renderer); + int (*RenderDrawPoints) (SDL_Renderer * renderer, const SDL_Point * points, + 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 (*RenderDrawEllipse) (SDL_Renderer * renderer, int x, int y, + int w, int h); + int (*RenderFillEllipse) (SDL_Renderer * renderer, int x, int y, + int w, int h); int (*RenderCopy) (SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect); int (*RenderReadPixels) (SDL_Renderer * renderer, const SDL_Rect * rect, diff --git a/src/video/SDL_video.c b/src/video/SDL_video.c index 467f38246..73c48afaa 100644 --- a/src/video/SDL_video.c +++ b/src/video/SDL_video.c @@ -2483,22 +2483,49 @@ SDL_GetRenderDrawBlendMode(int *blendMode) } 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 @@ SDL_RenderPoints(const SDL_Point * points, int count) 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 @@ SDL_RenderLine(int x1, int y1, int x2, int y2) 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,77 @@ SDL_RenderLines(const SDL_Point * points, int count) 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_RenderDrawRect(const SDL_Rect * rect) +{ + return SDL_RenderDrawRects(&rect, 1); +} + +int +SDL_RenderDrawRects(const SDL_Rect ** rects, int count) +{ + SDL_Renderer *renderer; + int i; + + if (!rects) { + SDL_SetError("SDL_RenderDrawRects(): Passed NULL rects"); + return -1; + } + + renderer = SDL_GetCurrentRenderer(SDL_TRUE); + if (!renderer) { + return -1; + } + if (!renderer->RenderDrawRects) { + 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->RenderDrawRects(renderer, &rect, 1); + } + } + return renderer->RenderDrawRects(renderer, rects, count); } int -SDL_RenderRect(const SDL_Rect * rect) +SDL_RenderFillRect(const SDL_Rect * rect) { - return SDL_RenderRects(&rect, 1); + return SDL_RenderFillRects(&rect, 1); } int -SDL_RenderRects(const SDL_Rect ** rects, int count) +SDL_RenderFillRects(const SDL_Rect ** rects, int count) { SDL_Renderer *renderer; int i; if (!rects) { - SDL_SetError("SDL_RenderRects(): Passed NULL rects"); + SDL_SetError("SDL_RenderFillRects(): Passed NULL rects"); return -1; } @@ -2573,7 +2647,7 @@ SDL_RenderRects(const SDL_Rect ** rects, int count) if (!renderer) { return -1; } - if (!renderer->RenderRects) { + if (!renderer->RenderFillRects) { SDL_Unsupported(); return -1; } @@ -2593,10 +2667,52 @@ SDL_RenderRects(const SDL_Rect ** rects, int count) full_rect.w = window->w; full_rect.h = window->h; rect = &full_rect; - return renderer->RenderRects(renderer, &rect, 1); + return renderer->RenderFillRects(renderer, &rect, 1); } } - return renderer->RenderRects(renderer, rects, count); + 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 diff --git a/src/video/dummy/SDL_nullrender.c b/src/video/dummy/SDL_nullrender.c index 5887ad267..dfa1022b0 100644 --- a/src/video/dummy/SDL_nullrender.c +++ b/src/video/dummy/SDL_nullrender.c @@ -31,12 +31,14 @@ static SDL_Renderer *SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags); -static int SDL_DUMMY_RenderPoints(SDL_Renderer * renderer, - const SDL_Point * points, int count); -static int SDL_DUMMY_RenderLines(SDL_Renderer * renderer, - const SDL_Point * points, int count); -static int SDL_DUMMY_RenderRects(SDL_Renderer * renderer, - const SDL_Rect ** rects, int count); +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, SDL_Texture * texture, const SDL_Rect * srcrect, @@ -100,9 +102,10 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags) } SDL_zerop(data); - renderer->RenderPoints = SDL_DUMMY_RenderPoints; - renderer->RenderLines = SDL_DUMMY_RenderLines; - renderer->RenderRects = SDL_DUMMY_RenderRects; + 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; renderer->RenderWritePixels = SDL_DUMMY_RenderWritePixels; @@ -140,8 +143,8 @@ SDL_DUMMY_CreateRenderer(SDL_Window * window, Uint32 flags) } static int -SDL_DUMMY_RenderPoints(SDL_Renderer * renderer, - const SDL_Point * points, int count) +SDL_DUMMY_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, int count) { SDL_DUMMY_RenderData *data = (SDL_DUMMY_RenderData *) renderer->driverdata; @@ -162,8 +165,8 @@ SDL_DUMMY_RenderPoints(SDL_Renderer * renderer, } static int -SDL_DUMMY_RenderLines(SDL_Renderer * renderer, - const SDL_Point * points, int count) +SDL_DUMMY_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, int count) { SDL_DUMMY_RenderData *data = (SDL_DUMMY_RenderData *) renderer->driverdata; @@ -184,8 +187,8 @@ SDL_DUMMY_RenderLines(SDL_Renderer * renderer, } static int -SDL_DUMMY_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, - int count) +SDL_DUMMY_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, + int count) { SDL_DUMMY_RenderData *data = (SDL_DUMMY_RenderData *) renderer->driverdata; @@ -197,7 +200,7 @@ SDL_DUMMY_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, renderer->r, renderer->g, renderer->b, renderer->a); - return SDL_FillRects(target, rects, count, color); + return SDL_DrawRects(target, rects, count, color); } else { return SDL_BlendRects(target, rects, count, renderer->blendMode, @@ -206,6 +209,29 @@ SDL_DUMMY_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, } } +static int +SDL_DUMMY_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, + int count) +{ + SDL_DUMMY_RenderData *data = + (SDL_DUMMY_RenderData *) renderer->driverdata; + SDL_Surface *target = data->screens[data->current_screen]; + + if (renderer->blendMode == SDL_BLENDMODE_NONE || + renderer->blendMode == SDL_BLENDMODE_MASK) { + Uint32 color = SDL_MapRGBA(target->format, + renderer->r, renderer->g, renderer->b, + renderer->a); + + return SDL_FillRects(target, rects, count, color); + } else { + return SDL_BlendFillRects(target, rects, count, + renderer->blendMode, + renderer->r, renderer->g, renderer->b, + renderer->a); + } +} + static int SDL_DUMMY_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) diff --git a/src/video/ps3/SDL_ps3render.c b/src/video/ps3/SDL_ps3render.c index 2a2fa6262..b4a93d710 100644 --- a/src/video/ps3/SDL_ps3render.c +++ b/src/video/ps3/SDL_ps3render.c @@ -503,8 +503,9 @@ SDL_PS3_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) status = SDL_FillRect(target, &real_rect, color); } else { status = - SDL_BlendRect(target, &real_rect, renderer->blendMode, - renderer->r, renderer->g, renderer->b, renderer->a); + SDL_BlendFillRect(target, &real_rect, renderer->blendMode, + renderer->r, renderer->g, renderer->b, + renderer->a); } return status; } diff --git a/src/video/x11/SDL_x11render.c b/src/video/x11/SDL_x11render.c index 314bc7785..98cdb993c 100644 --- a/src/video/x11/SDL_x11render.c +++ b/src/video/x11/SDL_x11render.c @@ -50,12 +50,14 @@ static int X11_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, void **pixels, int *pitch); static void X11_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static int X11_SetDrawBlendMode(SDL_Renderer * renderer); -static int X11_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int X11_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, - int count); -static int X11_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, - int count); +static int X11_RenderDrawPoints(SDL_Renderer * renderer, + const SDL_Point * points, int count); +static int X11_RenderDrawLines(SDL_Renderer * renderer, + const SDL_Point * points, int count); +static int X11_RenderDrawRects(SDL_Renderer * renderer, + const SDL_Rect ** rects, int count); +static int X11_RenderFillRects(SDL_Renderer * renderer, + const SDL_Rect ** rects, int count); static int X11_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static int X11_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, @@ -208,9 +210,10 @@ X11_CreateRenderer(SDL_Window * window, Uint32 flags) renderer->LockTexture = X11_LockTexture; renderer->UnlockTexture = X11_UnlockTexture; renderer->SetDrawBlendMode = X11_SetDrawBlendMode; - renderer->RenderPoints = X11_RenderPoints; - renderer->RenderLines = X11_RenderLines; - renderer->RenderRects = X11_RenderRects; + renderer->RenderDrawPoints = X11_RenderDrawPoints; + renderer->RenderDrawLines = X11_RenderDrawLines; + renderer->RenderDrawRects = X11_RenderDrawRects; + renderer->RenderFillRects = X11_RenderFillRects; renderer->RenderCopy = X11_RenderCopy; renderer->RenderReadPixels = X11_RenderReadPixels; renderer->RenderWritePixels = X11_RenderWritePixels; @@ -600,7 +603,8 @@ renderdrawcolor(SDL_Renderer * renderer, int premult) } static int -X11_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) +X11_RenderDrawPoints(SDL_Renderer * renderer, const SDL_Point * points, + int count) { X11_RenderData *data = (X11_RenderData *) renderer->driverdata; SDL_Window *window = SDL_GetWindowFromID(renderer->window); @@ -649,7 +653,8 @@ X11_RenderPoints(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -X11_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) +X11_RenderDrawLines(SDL_Renderer * renderer, const SDL_Point * points, + int count) { X11_RenderData *data = (X11_RenderData *) renderer->driverdata; SDL_Window *window = SDL_GetWindowFromID(renderer->window); @@ -787,7 +792,52 @@ X11_RenderLines(SDL_Renderer * renderer, const SDL_Point * points, int count) } static int -X11_RenderRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) +X11_RenderDrawRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) +{ + X11_RenderData *data = (X11_RenderData *) renderer->driverdata; + SDL_Window *window = SDL_GetWindowFromID(renderer->window); + SDL_Rect clip, rect; + unsigned long foreground; + XRectangle *xrects, *xrect; + int i, xcount; + + clip.x = 0; + clip.y = 0; + clip.w = window->w; + clip.h = window->h; + + foreground = renderdrawcolor(renderer, 1); + XSetForeground(data->display, data->gc, foreground); + + xrect = xrects = SDL_stack_alloc(XRectangle, count); + xcount = 0; + for (i = 0; i < count; ++i) { + if (!SDL_IntersectRect(rects[i], &clip, &rect)) { + continue; + } + + xrect->x = (short)rect.x; + xrect->y = (short)rect.y; + xrect->width = (unsigned short)rect.w; + xrect->height = (unsigned short)rect.h; + ++xrect; + ++xcount; + + if (data->makedirty) { + SDL_AddDirtyRect(&data->dirty, &rect); + } + } + if (xcount > 0) { + XDrawRectangles(data->display, data->drawable, data->gc, + xrects, xcount); + } + SDL_stack_free(xpoints); + + return 0; +} + +static int +X11_RenderFillRects(SDL_Renderer * renderer, const SDL_Rect ** rects, int count) { X11_RenderData *data = (X11_RenderData *) renderer->driverdata; SDL_Window *window = SDL_GetWindowFromID(renderer->window); diff --git a/src/video/x11/SDL_x11sym.h b/src/video/x11/SDL_x11sym.h index bce182eff..1c52566c2 100644 --- a/src/video/x11/SDL_x11sym.h +++ b/src/video/x11/SDL_x11sym.h @@ -50,6 +50,10 @@ SDL_X11_SYM(int,XDefineCursor,(Display* a,Window b,Cursor c),(a,b,c),return) SDL_X11_SYM(int,XDeleteProperty,(Display* a,Window b,Atom c),(a,b,c),return) SDL_X11_SYM(int,XDestroyWindow,(Display* a,Window b),(a,b),return) SDL_X11_SYM(int,XDisplayKeycodes,(Display* a,int* b,int* c),(a,b,c),return) +SDL_X11_SYM(int,XDrawLines,(Display* a, Drawable b, GC c, XPoint* d, int e, int f),(a,b,c,d,e,f),return) +SDL_X11_SYM(int,XDrawPoint,(Display* a, Drawable b, GC c, int d, int e),(a,b,c,d,e),return) +SDL_X11_SYM(int,XDrawPoints,(Display* a, Drawable b, GC c, XPoint* d, int e, int f),(a,b,c,d,e,f),return) +SDL_X11_SYM(int,XDrawRectangles,(Display* a,Drawable b,GC c,XRectangle* d,int e),(a,b,c,d,e),return) SDL_X11_SYM(int,XFillRectangles,(Display* a,Drawable b,GC c,XRectangle* d,int e),(a,b,c,d,e),return) SDL_X11_SYM(char*,XDisplayName,(_Xconst char* a),(a),return) SDL_X11_SYM(int,XEventsQueued,(Display* a,int b),(a,b),return) @@ -95,9 +99,6 @@ SDL_X11_SYM(Display*,XOpenDisplay,(_Xconst char* a),(a),return) SDL_X11_SYM(int,XPeekEvent,(Display* a,XEvent* b),(a,b),return) SDL_X11_SYM(int,XPending,(Display* a),(a),return) SDL_X11_SYM(int,XPutImage,(Display* a,Drawable b,GC c,XImage* d,int e,int f,int g,int h,unsigned int i,unsigned int j),(a,b,c,d,e,f,g,h,i,j),return) -SDL_X11_SYM(int,XDrawLines,(Display* a, Drawable b, GC c, XPoint* d, int e, int f),(a,b,c,d,e,f),return) -SDL_X11_SYM(int,XDrawPoint,(Display* a, Drawable b, GC c, int d, int e),(a,b,c,d,e),return) -SDL_X11_SYM(int,XDrawPoints,(Display* a, Drawable b, GC c, XPoint* d, int e, int f),(a,b,c,d,e,f),return) SDL_X11_SYM(int,XQueryColors,(Display* a,Colormap b,XColor* c,int d),(a,b,c,d),return) SDL_X11_SYM(int,XQueryKeymap,(Display* a,char *b),(a,b),return) SDL_X11_SYM(Bool,XQueryPointer,(Display* a,Window b,Window* c,Window* d,int* e,int* f,int* g,int* h,unsigned int* i),(a,b,c,d,e,f,g,h,i),return) diff --git a/test/automated/Makefile b/test/automated/Makefile index 02e26d3f6..dea509afa 100644 --- a/test/automated/Makefile +++ b/test/automated/Makefile @@ -1,6 +1,6 @@ -CFLAGS := -W -Wall -Wextra -g `sdl-config --cflags` +CFLAGS := -W -Wall -Wextra -g `sdl-config --cflags` -DSDL_NO_COMPAT LDFLAGS := `sdl-config --libs` # If it doesn't pick up defaults diff --git a/test/automated/render/render.c b/test/automated/render/render.c index f87e151e8..889c6a058 100644 --- a/test/automated/render/render.c +++ b/test/automated/render/render.c @@ -341,9 +341,9 @@ static int render_clearScreen (void) */ /* Clear screen. */ - ret = SDL_RenderRect( NULL ); + ret = SDL_RenderFillRect( NULL ); /* - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; */ @@ -413,8 +413,8 @@ static int render_testPrimitives (void) ret = SDL_SetRenderDrawColor( 13, 73, 200, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderRect( &rect ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( &rect ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; /* Draw a rectangle. */ @@ -425,8 +425,8 @@ static int render_testPrimitives (void) ret = SDL_SetRenderDrawColor( 200, 0, 100, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderRect( &rect ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( &rect ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; /* Draw some points like so: @@ -439,8 +439,8 @@ static int render_testPrimitives (void) ret = SDL_SetRenderDrawColor( x*y, x*y/2, x*y/3, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderPoint( x, y ); - if (SDL_ATassert( "SDL_RenderPoint", ret == 0)) + ret = SDL_RenderDrawPoint( x, y ); + if (SDL_ATassert( "SDL_RenderDrawPoint", ret == 0)) return -1; } } @@ -449,29 +449,29 @@ static int render_testPrimitives (void) ret = SDL_SetRenderDrawColor( 0, 255, 0, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderLine( 0, 30, 80, 30 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 0, 30, 80, 30 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; ret = SDL_SetRenderDrawColor( 55, 55, 5, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderLine( 40, 30, 40, 60 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 40, 30, 40, 60 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; ret = SDL_SetRenderDrawColor( 5, 105, 105, SDL_ALPHA_OPAQUE ); if (SDL_ATassert( "SDL_SetRenderDrawColor", ret == 0)) return -1; - ret = SDL_RenderLine( 0, 0, 29, 29 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 0, 0, 29, 29 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; - ret = SDL_RenderLine( 29, 30, 0, 59 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 29, 30, 0, 59 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; - ret = SDL_RenderLine( 79, 0, 50, 29 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 79, 0, 50, 29 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; - ret = SDL_RenderLine( 79, 59, 50, 30 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 79, 59, 50, 30 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; /* See if it's the same. */ @@ -506,8 +506,8 @@ static int render_testPrimitivesBlend (void) ret = SDL_SetRenderDrawBlendMode( SDL_BLENDMODE_NONE ); if (SDL_ATassert( "SDL_SetRenderDrawBlendMode", ret == 0)) return -1; - ret = SDL_RenderRect( NULL ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( NULL ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; rect.x = 10; rect.y = 25; @@ -519,8 +519,8 @@ static int render_testPrimitivesBlend (void) ret = SDL_SetRenderDrawBlendMode( SDL_BLENDMODE_ADD ); if (SDL_ATassert( "SDL_SetRenderDrawBlendMode", ret == 0)) return -1; - ret = SDL_RenderRect( &rect ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( &rect ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; rect.x = 30; rect.y = 40; @@ -532,8 +532,8 @@ static int render_testPrimitivesBlend (void) ret = SDL_SetRenderDrawBlendMode( SDL_BLENDMODE_BLEND ); if (SDL_ATassert( "SDL_SetRenderDrawBlendMode", ret == 0)) return -1; - ret = SDL_RenderRect( &rect ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( &rect ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; rect.x = 25; rect.y = 25; @@ -545,8 +545,8 @@ static int render_testPrimitivesBlend (void) ret = SDL_SetRenderDrawBlendMode( SDL_BLENDMODE_MOD ); if (SDL_ATassert( "SDL_SetRenderDrawBlendMode", ret == 0)) return -1; - ret = SDL_RenderRect( &rect ); - if (SDL_ATassert( "SDL_RenderRect", ret == 0)) + ret = SDL_RenderFillRect( &rect ); + if (SDL_ATassert( "SDL_RenderFillRect", ret == 0)) return -1; /* Draw blended lines, lines for everyone. */ @@ -558,8 +558,8 @@ static int render_testPrimitivesBlend (void) (((i/2)%3)==1) ? SDL_BLENDMODE_ADD : SDL_BLENDMODE_MOD ); if (SDL_ATassert( "SDL_SetRenderDrawBlendMode", ret == 0)) return -1; - ret = SDL_RenderLine( 0, 0, i, 59 ); - if (SDL_ATassert( "SDL_RenderLine", ret == 0)) + ret = SDL_RenderDrawLine( 0, 0, i, 59 ); + if (SDL_ATassert( "SDL_RenderDrawLine", ret == 0)) return -1; } for (i=0; iformat->palette) { - ret = SDL_SetColorKey(face, (SDL_SRCCOLORKEY | SDL_RLEACCEL), - *(Uint8 *) face->pixels); + ret = SDL_SetColorKey(face, SDL_RLEACCEL, *(Uint8 *) face->pixels); if (SDL_ATassert( "SDL_SetColorKey", ret == 0)) return; } @@ -184,29 +183,29 @@ static void surface_testPrimitivesBlend( SDL_Surface *testsur ) return; /* Create some rectangles for each blend mode. */ - ret = SDL_BlendRect( testsur, NULL, SDL_BLENDMODE_NONE, 255, 255, 255, 0 ); - if (SDL_ATassert( "SDL_BlendRect", ret == 0)) + ret = SDL_BlendFillRect( testsur, NULL, SDL_BLENDMODE_NONE, 255, 255, 255, 0 ); + if (SDL_ATassert( "SDL_BlendFillRect", ret == 0)) return; rect.x = 10; rect.y = 25; rect.w = 40; rect.h = 25; - ret = SDL_BlendRect( testsur, &rect, SDL_BLENDMODE_ADD, 240, 10, 10, 75 ); - if (SDL_ATassert( "SDL_BlendRect", ret == 0)) + ret = SDL_BlendFillRect( testsur, &rect, SDL_BLENDMODE_ADD, 240, 10, 10, 75 ); + if (SDL_ATassert( "SDL_BlendFillRect", ret == 0)) return; rect.x = 30; rect.y = 40; rect.w = 45; rect.h = 15; - ret = SDL_BlendRect( testsur, &rect, SDL_BLENDMODE_BLEND, 10, 240, 10, 100 ); - if (SDL_ATassert( "SDL_BlendRect", ret == 0)) + ret = SDL_BlendFillRect( testsur, &rect, SDL_BLENDMODE_BLEND, 10, 240, 10, 100 ); + if (SDL_ATassert( "SDL_BlendFillRect", ret == 0)) return; rect.x = 25; rect.y = 25; rect.w = 25; rect.h = 25; - ret = SDL_BlendRect( testsur, &rect, SDL_BLENDMODE_MOD, 10, 10, 240, 125 ); - if (SDL_ATassert( "SDL_BlendRect", ret == 0)) + ret = SDL_BlendFillRect( testsur, &rect, SDL_BLENDMODE_MOD, 10, 10, 240, 125 ); + if (SDL_ATassert( "SDL_BlendFillRect", ret == 0)) return; /* Draw blended lines, lines for everyone. */ diff --git a/test/automated/testsdl.c b/test/automated/testsdl.c index c38fbda3d..9d3576da1 100644 --- a/test/automated/testsdl.c +++ b/test/automated/testsdl.c @@ -6,7 +6,6 @@ * Released under Public Domain. */ - #include "SDL.h" #include "SDL_at.h" diff --git a/test/testdraw2.c b/test/testdraw2.c index 6a39c6489..0b55b7759 100644 --- a/test/testdraw2.c +++ b/test/testdraw2.c @@ -58,7 +58,7 @@ DrawPoints(SDL_WindowID window) x = rand() % window_w; y = rand() % window_h; - SDL_RenderPoint(x, y); + SDL_RenderDrawPoint(x, y); } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); } @@ -102,16 +102,16 @@ DrawLines(SDL_WindowID window) (Uint8) current_color, (Uint8) current_alpha); if (i == 0) { - SDL_RenderLine(0, 0, window_w - 1, window_h - 1); - SDL_RenderLine(0, window_h - 1, window_w - 1, 0); - SDL_RenderLine(0, window_h / 2, window_w - 1, window_h / 2); - SDL_RenderLine(window_w / 2, 0, window_w / 2, window_h - 1); + SDL_RenderDrawLine(0, 0, window_w - 1, window_h - 1); + SDL_RenderDrawLine(0, window_h - 1, window_w - 1, 0); + SDL_RenderDrawLine(0, window_h / 2, window_w - 1, window_h / 2); + SDL_RenderDrawLine(window_w / 2, 0, window_w / 2, window_h - 1); } else { x1 = (rand() % (window_w*2)) - window_w; x2 = (rand() % (window_w*2)) - window_w; y1 = (rand() % (window_h*2)) - window_h; y2 = (rand() % (window_h*2)) - window_h; - SDL_RenderLine(x1, y1, x2, y2); + SDL_RenderDrawLine(x1, y1, x2, y2); } } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); @@ -159,7 +159,7 @@ DrawRects(SDL_WindowID window) rect.h = rand() % (window_h / 2); rect.x = (rand() % (window_w*2) - window_w) - (rect.w / 2); rect.y = (rand() % (window_h*2) - window_h) - (rect.h / 2); - SDL_RenderRect(&rect); + SDL_RenderFillRect(&rect); } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); } @@ -231,7 +231,7 @@ main(int argc, char *argv[]) for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); } srand(time(NULL)); @@ -251,7 +251,7 @@ main(int argc, char *argv[]) case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(event.window.windowID); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); break; } break; @@ -262,7 +262,7 @@ main(int argc, char *argv[]) for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); DrawRects(state->windows[i]); DrawLines(state->windows[i]); diff --git a/test/testintersections.c b/test/testintersections.c index b308c1d60..c222210c7 100644 --- a/test/testintersections.c +++ b/test/testintersections.c @@ -59,7 +59,7 @@ DrawPoints(SDL_WindowID window) x = rand() % window_w; y = rand() % window_h; - SDL_RenderPoint(x, y); + SDL_RenderDrawPoint(x, y); } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); } @@ -100,12 +100,12 @@ DrawLines(SDL_WindowID window) SDL_SetRenderDrawColor(255, 255, 255, 255); if (i == -1) { - SDL_RenderLine(0, 0, window_w - 1, window_h - 1); - SDL_RenderLine(0, window_h - 1, window_w - 1, 0); - SDL_RenderLine(0, window_h / 2, window_w - 1, window_h / 2); - SDL_RenderLine(window_w / 2, 0, window_w / 2, window_h - 1); + SDL_RenderDrawLine(0, 0, window_w - 1, window_h - 1); + SDL_RenderDrawLine(0, window_h - 1, window_w - 1, 0); + SDL_RenderDrawLine(0, window_h / 2, window_w - 1, window_h / 2); + SDL_RenderDrawLine(window_w / 2, 0, window_w / 2, window_h - 1); } else { - SDL_RenderLine(lines[i].x, lines[i].y, lines[i].w, lines[i].h); + SDL_RenderDrawLine(lines[i].x, lines[i].y, lines[i].w, lines[i].h); } } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); @@ -150,7 +150,7 @@ DrawRects(SDL_WindowID window) SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); for (i = 0; i < num_rects; ++i) { SDL_SetRenderDrawColor(255, 127, 0, 255); - SDL_RenderRect(&rects[i]); + SDL_RenderFillRect(&rects[i]); } SDL_SetRenderDrawBlendMode(SDL_BLENDMODE_NONE); } @@ -178,7 +178,7 @@ DrawRectLineIntersections(SDL_WindowID window) if (SDL_IntersectRectAndLine(&r, &x1, &y1, &x2, &y2)) { SDL_SetRenderDrawColor(0, 255, 55, 255); - SDL_RenderLine(x1, y1, x2, y2); + SDL_RenderDrawLine(x1, y1, x2, y2); } } @@ -197,7 +197,7 @@ DrawRectRectIntersections(SDL_WindowID window) SDL_Rect r; if (SDL_IntersectRect(&rects[i], &rects[j], &r)) { SDL_SetRenderDrawColor(255, 200, 0, 255); - SDL_RenderRect(&r); + SDL_RenderFillRect(&r); } } @@ -272,7 +272,7 @@ main(int argc, char *argv[]) for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); } srand(time(NULL)); @@ -326,7 +326,7 @@ main(int argc, char *argv[]) case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(event.window.windowID); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); break; } break; @@ -337,7 +337,7 @@ main(int argc, char *argv[]) for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); DrawRects(state->windows[i]); DrawPoints(state->windows[i]); diff --git a/test/testnative.c b/test/testnative.c index 014927df3..bdecfe7c0 100644 --- a/test/testnative.c +++ b/test/testnative.c @@ -83,7 +83,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) /* Move the sprite, bounce at the wall, and draw */ n = 0; SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); for (i = 0; i < NUM_SPRITES; ++i) { position = &positions[i]; velocity = &velocities[i]; @@ -158,7 +158,7 @@ main(int argc, char *argv[]) /* Clear the window, load the sprite and go! */ SDL_SelectRenderer(window); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); sprite = LoadSprite(window, "icon.bmp"); if (!sprite) { @@ -199,7 +199,7 @@ main(int argc, char *argv[]) case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(event.window.windowID); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); break; } break; diff --git a/test/testsprite2.c b/test/testsprite2.c index d67402655..330dca821 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -139,21 +139,21 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) /* Draw a gray background */ SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); /* Test points */ SDL_SetRenderDrawColor(0xFF, 0x00, 0x00, 0xFF); - SDL_RenderPoint(0, 0); - SDL_RenderPoint(window_w-1, 0); - SDL_RenderPoint(0, window_h-1); - SDL_RenderPoint(window_w-1, window_h-1); + SDL_RenderDrawPoint(0, 0); + SDL_RenderDrawPoint(window_w-1, 0); + SDL_RenderDrawPoint(0, window_h-1); + SDL_RenderDrawPoint(window_w-1, window_h-1); /* Test horizontal and vertical lines */ SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF); - SDL_RenderLine(1, 0, window_w-2, 0); - SDL_RenderLine(1, window_h-1, window_w-2, window_h-1); - SDL_RenderLine(0, 1, 0, window_h-2); - SDL_RenderLine(window_w-1, 1, window_w-1, window_h-2); + SDL_RenderDrawLine(1, 0, window_w-2, 0); + SDL_RenderDrawLine(1, window_h-1, window_w-2, window_h-1); + SDL_RenderDrawLine(0, 1, 0, window_h-2); + SDL_RenderDrawLine(window_w-1, 1, window_w-1, window_h-2); /* Test fill and copy */ SDL_SetRenderDrawColor(0xFF, 0xFF, 0xFF, 0xFF); @@ -161,33 +161,33 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) temp.y = 1; temp.w = sprite_w; temp.h = sprite_h; - SDL_RenderRect(&temp); + SDL_RenderFillRect(&temp); SDL_RenderCopy(sprite, NULL, &temp); temp.x = window_w-sprite_w-1; temp.y = 1; temp.w = sprite_w; temp.h = sprite_h; - SDL_RenderRect(&temp); + SDL_RenderFillRect(&temp); SDL_RenderCopy(sprite, NULL, &temp); temp.x = 1; temp.y = window_h-sprite_h-1; temp.w = sprite_w; temp.h = sprite_h; - SDL_RenderRect(&temp); + SDL_RenderFillRect(&temp); SDL_RenderCopy(sprite, NULL, &temp); temp.x = window_w-sprite_w-1; temp.y = window_h-sprite_h-1; temp.w = sprite_w; temp.h = sprite_h; - SDL_RenderRect(&temp); + SDL_RenderFillRect(&temp); SDL_RenderCopy(sprite, NULL, &temp); /* Test diagonal lines */ SDL_SetRenderDrawColor(0x00, 0xFF, 0x00, 0xFF); - SDL_RenderLine(sprite_w, sprite_h, - window_w-sprite_w-2, window_h-sprite_h-2); - SDL_RenderLine(window_w-sprite_w-2, sprite_h, - sprite_w, window_h-sprite_h-2); + SDL_RenderDrawLine(sprite_w, sprite_h, + window_w-sprite_w-2, window_h-sprite_h-2); + SDL_RenderDrawLine(window_w-sprite_w-2, sprite_h, + sprite_w, window_h-sprite_h-2); /* Move the sprite, bounce at the wall, and draw */ n = 0; @@ -302,7 +302,7 @@ main(int argc, char *argv[]) for (i = 0; i < state->num_windows; ++i) { SDL_SelectRenderer(state->windows[i]); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); } if (LoadSprite("icon.bmp") < 0) { quit(2); @@ -348,7 +348,7 @@ main(int argc, char *argv[]) case SDL_WINDOWEVENT_EXPOSED: SDL_SelectRenderer(event.window.windowID); SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); break; } break; diff --git a/test/testspriteminimal.c b/test/testspriteminimal.c index 3460496e6..2a8749257 100644 --- a/test/testspriteminimal.c +++ b/test/testspriteminimal.c @@ -87,7 +87,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite) /* Draw a gray background */ SDL_SetRenderDrawColor(0xA0, 0xA0, 0xA0, 0xFF); - SDL_RenderRect(NULL); + SDL_RenderClear(); /* Move the sprite, bounce at the wall, and draw */ for (i = 0; i < NUM_SPRITES; ++i) {