Commit e4c73114 authored by Sam Lantinga's avatar Sam Lantinga

In the process of adding rectangle drawing

--HG--
rename : src/video/SDL_blendrect.c => src/video/SDL_blendfillrect.c
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404343
parent c7fe958b
...@@ -416,7 +416,7 @@ extern DECLSPEC int SDLCALL SDL_DrawPoints ...@@ -416,7 +416,7 @@ extern DECLSPEC int SDLCALL SDL_DrawPoints
* *
* \return 0 on success, or -1 on error. * \return 0 on success, or -1 on error.
*/ */
extern DECLSPEC int SDLCALL SDL_BlendPoint extern DECLSPEC int SDLCALL SDL_BlendDrawPoint
(SDL_Surface * dst, int x, int y, (SDL_Surface * dst, int x, int y,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
extern DECLSPEC int SDLCALL SDL_BlendPoints extern DECLSPEC int SDLCALL SDL_BlendPoints
...@@ -448,6 +448,35 @@ extern DECLSPEC int SDLCALL SDL_BlendLines ...@@ -448,6 +448,35 @@ extern DECLSPEC int SDLCALL SDL_BlendLines
(SDL_Surface * dst, const SDL_Point * points, int count, (SDL_Surface * dst, const SDL_Point * points, int count,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
/**
* Draws the given rectangle with \c color.
*
* If \c rect is NULL, the whole surface will be outlined 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_DrawRect
(SDL_Surface * dst, const SDL_Rect * rect, Uint32 color);
extern DECLSPEC int SDLCALL SDL_DrawRects
(SDL_Surface * dst, const SDL_Rect ** rects, int count, Uint32 color);
/**
* Blends the given rectangle with \c color.
*
* If \c rect is NULL, the whole surface will have a blended outline of \c color.
*
* \return 0 on success, or -1 on error.
*/
extern DECLSPEC int SDLCALL SDL_BlendRect
(SDL_Surface * dst, const SDL_Rect * rect,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
extern DECLSPEC int SDLCALL SDL_BlendRects
(SDL_Surface * dst, const SDL_Rect ** rects, int count,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
/** /**
* Performs a fast fill of the given rectangle with \c color. * Performs a fast fill of the given rectangle with \c color.
* *
...@@ -466,14 +495,14 @@ extern DECLSPEC int SDLCALL SDL_FillRects ...@@ -466,14 +495,14 @@ extern DECLSPEC int SDLCALL SDL_FillRects
/** /**
* Blends an RGBA value into the given rectangle. * Blends an RGBA value into the given rectangle.
* *
* If \c rect is NULL, the whole surface will be filled with \c color. * If \c rect is NULL, the whole surface will be blended with \c color.
* *
* \return This function returns 0 on success, or -1 on error. * \return This function returns 0 on success, or -1 on error.
*/ */
extern DECLSPEC int SDLCALL SDL_BlendRect extern DECLSPEC int SDLCALL SDL_BlendFillRect
(SDL_Surface * dst, const SDL_Rect * rect, (SDL_Surface * dst, const SDL_Rect * rect,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
extern DECLSPEC int SDLCALL SDL_BlendRects extern DECLSPEC int SDLCALL SDL_BlendFillRects
(SDL_Surface * dst, const SDL_Rect ** rects, int count, (SDL_Surface * dst, const SDL_Rect ** rects, int count,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a); int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a);
......
...@@ -25,8 +25,8 @@ ...@@ -25,8 +25,8 @@
#include "SDL_draw.h" #include "SDL_draw.h"
static int static int
SDL_BlendRect_RGB555(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_RGB555(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -48,8 +48,8 @@ SDL_BlendRect_RGB555(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -48,8 +48,8 @@ SDL_BlendRect_RGB555(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
static int static int
SDL_BlendRect_RGB565(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_RGB565(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -71,8 +71,8 @@ SDL_BlendRect_RGB565(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -71,8 +71,8 @@ SDL_BlendRect_RGB565(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
static int static int
SDL_BlendRect_RGB888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_RGB888(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -94,8 +94,8 @@ SDL_BlendRect_RGB888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -94,8 +94,8 @@ SDL_BlendRect_RGB888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
static int static int
SDL_BlendRect_ARGB8888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_ARGB8888(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -117,8 +117,8 @@ SDL_BlendRect_ARGB8888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -117,8 +117,8 @@ SDL_BlendRect_ARGB8888(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
static int static int
SDL_BlendRect_RGB(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_RGB(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_PixelFormat *fmt = dst->format; SDL_PixelFormat *fmt = dst->format;
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -163,8 +163,8 @@ SDL_BlendRect_RGB(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -163,8 +163,8 @@ SDL_BlendRect_RGB(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
static int static int
SDL_BlendRect_RGBA(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, SDL_BlendFillRect_RGBA(SDL_Surface * dst, const SDL_Rect * rect,
Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_PixelFormat *fmt = dst->format; SDL_PixelFormat *fmt = dst->format;
unsigned inva = 0xff - a; unsigned inva = 0xff - a;
...@@ -193,8 +193,8 @@ SDL_BlendRect_RGBA(SDL_Surface * dst, const SDL_Rect * rect, int blendMode, ...@@ -193,8 +193,8 @@ SDL_BlendRect_RGBA(SDL_Surface * dst, const SDL_Rect * rect, int blendMode,
} }
int int
SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect, SDL_BlendFillRect(SDL_Surface * dst, const SDL_Rect * rect,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_Rect clipped; SDL_Rect clipped;
...@@ -203,9 +203,14 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect, ...@@ -203,9 +203,14 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect,
return -1; return -1;
} }
if (blendMode < SDL_BLENDMODE_BLEND) {
Uint32 color = SDL_MapRGBA(dst->format, r, g, b, a);
return SDL_FillRect(dst, rect, color);
}
/* This function doesn't work on surfaces < 8 bpp */ /* This function doesn't work on surfaces < 8 bpp */
if (dst->format->BitsPerPixel < 8) { if (dst->format->BitsPerPixel < 8) {
SDL_SetError("SDL_BlendRect(): Unsupported surface format"); SDL_SetError("SDL_BlendFillRect(): Unsupported surface format");
return -1; return -1;
} }
...@@ -230,22 +235,22 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect, ...@@ -230,22 +235,22 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect,
case 15: case 15:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0x7C00: case 0x7C00:
return SDL_BlendRect_RGB555(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_RGB555(dst, rect, blendMode, r, g, b, a);
} }
break; break;
case 16: case 16:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0xF800: case 0xF800:
return SDL_BlendRect_RGB565(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_RGB565(dst, rect, blendMode, r, g, b, a);
} }
break; break;
case 32: case 32:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0x00FF0000: case 0x00FF0000:
if (!dst->format->Amask) { if (!dst->format->Amask) {
return SDL_BlendRect_RGB888(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_RGB888(dst, rect, blendMode, r, g, b, a);
} else { } else {
return SDL_BlendRect_ARGB8888(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_ARGB8888(dst, rect, blendMode, r, g, b, a);
} }
break; break;
} }
...@@ -255,15 +260,15 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect, ...@@ -255,15 +260,15 @@ SDL_BlendRect(SDL_Surface * dst, const SDL_Rect * rect,
} }
if (!dst->format->Amask) { if (!dst->format->Amask) {
return SDL_BlendRect_RGB(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_RGB(dst, rect, blendMode, r, g, b, a);
} else { } else {
return SDL_BlendRect_RGBA(dst, rect, blendMode, r, g, b, a); return SDL_BlendFillRect_RGBA(dst, rect, blendMode, r, g, b, a);
} }
} }
int int
SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, SDL_BlendFillRects(SDL_Surface * dst, const SDL_Rect ** rects, int count,
int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a) int blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
{ {
SDL_Rect clipped; SDL_Rect clipped;
int i; int i;
...@@ -276,9 +281,14 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, ...@@ -276,9 +281,14 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count,
return -1; return -1;
} }
if (blendMode < SDL_BLENDMODE_BLEND) {
Uint32 color = SDL_MapRGBA(dst->format, r, g, b, a);
return SDL_FillRects(dst, rects, color);
}
/* This function doesn't work on surfaces < 8 bpp */ /* This function doesn't work on surfaces < 8 bpp */
if (dst->format->BitsPerPixel < 8) { if (dst->format->BitsPerPixel < 8) {
SDL_SetError("SDL_BlendRects(): Unsupported surface format"); SDL_SetError("SDL_BlendFillRects(): Unsupported surface format");
return -1; return -1;
} }
...@@ -293,22 +303,22 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, ...@@ -293,22 +303,22 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count,
case 15: case 15:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0x7C00: case 0x7C00:
func = SDL_BlendRect_RGB555; func = SDL_BlendFillRect_RGB555;
} }
break; break;
case 16: case 16:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0xF800: case 0xF800:
func = SDL_BlendRect_RGB565; func = SDL_BlendFillRect_RGB565;
} }
break; break;
case 32: case 32:
switch (dst->format->Rmask) { switch (dst->format->Rmask) {
case 0x00FF0000: case 0x00FF0000:
if (!dst->format->Amask) { if (!dst->format->Amask) {
func = SDL_BlendRect_RGB888; func = SDL_BlendFillRect_RGB888;
} else { } else {
func = SDL_BlendRect_ARGB8888; func = SDL_BlendFillRect_ARGB8888;
} }
break; break;
} }
...@@ -319,9 +329,9 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count, ...@@ -319,9 +329,9 @@ SDL_BlendRects(SDL_Surface * dst, const SDL_Rect ** rects, int count,
if (!func) { if (!func) {
if (!dst->format->Amask) { if (!dst->format->Amask) {
func = SDL_BlendRect_RGB; func = SDL_BlendFillRect_RGB;
} else { } else {
func = SDL_BlendRect_RGBA; func = SDL_BlendFillRect_RGBA;
} }
} }
......
...@@ -341,7 +341,44 @@ do { \ ...@@ -341,7 +341,44 @@ do { \
#define DRAWLINE(x0, y0, x1, y1, op) BRESENHAM(x0, y0, x1, y1, op) #define DRAWLINE(x0, y0, x1, y1, op) BRESENHAM(x0, y0, x1, y1, op)
/* /*
* Define blend fill macro * Define draw rect macro
*/
#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 ); \
} \
} \
pixel += skip; \
width -= 1; \
height -= 2; \
while (height--) { \
op; pixel += width; op; pixel += skip; \
} \
{ 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 ); \
} \
} \
} while (0)
/*
* Define fill rect macro
*/ */
#define FILLRECT(type, op) \ #define FILLRECT(type, op) \
...@@ -365,8 +402,4 @@ do { \ ...@@ -365,8 +402,4 @@ do { \
} \ } \
} while (0) } while (0)
/*
* Define blend line macro
*/
/* vi: set ts=4 sw=4 expandtab: */ /* vi: set ts=4 sw=4 expandtab: */
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment