SDL 2.0
SDL_blendfillrect.c
Go to the documentation of this file.
1/*
2 Simple DirectMedia Layer
3 Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
4
5 This software is provided 'as-is', without any express or implied
6 warranty. In no event will the authors be held liable for any damages
7 arising from the use of this software.
8
9 Permission is granted to anyone to use this software for any purpose,
10 including commercial applications, and to alter it and redistribute it
11 freely, subject to the following restrictions:
12
13 1. The origin of this software must not be misrepresented; you must not
14 claim that you wrote the original software. If you use this software
15 in a product, an acknowledgment in the product documentation would be
16 appreciated but is not required.
17 2. Altered source versions must be plainly marked as such, and must not be
18 misrepresented as being the original software.
19 3. This notice may not be removed or altered from any source distribution.
20*/
21#include "../../SDL_internal.h"
22
23#if !SDL_RENDER_DISABLED
24
25#include "SDL_draw.h"
26#include "SDL_blendfillrect.h"
27
28
29static int
32{
33 unsigned inva = 0xff - a;
34
35 switch (blendMode) {
38 break;
41 break;
44 break;
45 default:
47 break;
48 }
49 return 0;
50}
51
52static int
55{
56 unsigned inva = 0xff - a;
57
58 switch (blendMode) {
61 break;
64 break;
67 break;
68 default:
70 break;
71 }
72 return 0;
73}
74
75static int
78{
79 unsigned inva = 0xff - a;
80
81 switch (blendMode) {
84 break;
87 break;
90 break;
91 default:
93 break;
94 }
95 return 0;
96}
97
98static int
101{
102 unsigned inva = 0xff - a;
103
104 switch (blendMode) {
107 break;
110 break;
113 break;
114 default:
116 break;
117 }
118 return 0;
119}
120
121static int
124{
125 SDL_PixelFormat *fmt = dst->format;
126 unsigned inva = 0xff - a;
127
128 switch (fmt->BytesPerPixel) {
129 case 2:
130 switch (blendMode) {
133 break;
136 break;
139 break;
140 default:
142 break;
143 }
144 return 0;
145 case 4:
146 switch (blendMode) {
149 break;
152 break;
155 break;
156 default:
158 break;
159 }
160 return 0;
161 default:
162 return SDL_Unsupported();
163 }
164}
165
166static int
169{
170 SDL_PixelFormat *fmt = dst->format;
171 unsigned inva = 0xff - a;
172
173 switch (fmt->BytesPerPixel) {
174 case 4:
175 switch (blendMode) {
178 break;
181 break;
184 break;
185 default:
187 break;
188 }
189 return 0;
190 default:
191 return SDL_Unsupported();
192 }
193}
194
195int
198{
199 SDL_Rect clipped;
200
201 if (!dst) {
202 return SDL_SetError("Passed NULL destination surface");
203 }
204
205 /* This function doesn't work on surfaces < 8 bpp */
206 if (dst->format->BitsPerPixel < 8) {
207 return SDL_SetError("SDL_BlendFillRect(): Unsupported surface format");
208 }
209
210 /* If 'rect' == NULL, then fill the whole surface */
211 if (rect) {
212 /* Perform clipping */
213 if (!SDL_IntersectRect(rect, &dst->clip_rect, &clipped)) {
214 return 0;
215 }
216 rect = &clipped;
217 } else {
218 rect = &dst->clip_rect;
219 }
220
222 r = DRAW_MUL(r, a);
223 g = DRAW_MUL(g, a);
224 b = DRAW_MUL(b, a);
225 }
226
227 switch (dst->format->BitsPerPixel) {
228 case 15:
229 switch (dst->format->Rmask) {
230 case 0x7C00:
232 }
233 break;
234 case 16:
235 switch (dst->format->Rmask) {
236 case 0xF800:
238 }
239 break;
240 case 32:
241 switch (dst->format->Rmask) {
242 case 0x00FF0000:
243 if (!dst->format->Amask) {
245 } else {
247 }
248 /* break; -Wunreachable-code-break */
249 }
250 break;
251 default:
252 break;
253 }
254
255 if (!dst->format->Amask) {
257 } else {
259 }
260}
261
262int
265{
267 int i;
268 int (*func)(SDL_Surface * dst, const SDL_Rect * rect,
270 int status = 0;
271
272 if (!dst) {
273 return SDL_SetError("Passed NULL destination surface");
274 }
275
276 /* This function doesn't work on surfaces < 8 bpp */
277 if (dst->format->BitsPerPixel < 8) {
278 return SDL_SetError("SDL_BlendFillRects(): Unsupported surface format");
279 }
280
282 r = DRAW_MUL(r, a);
283 g = DRAW_MUL(g, a);
284 b = DRAW_MUL(b, a);
285 }
286
287 /* FIXME: Does this function pointer slow things down significantly? */
288 switch (dst->format->BitsPerPixel) {
289 case 15:
290 switch (dst->format->Rmask) {
291 case 0x7C00:
293 }
294 break;
295 case 16:
296 switch (dst->format->Rmask) {
297 case 0xF800:
299 }
300 break;
301 case 32:
302 switch (dst->format->Rmask) {
303 case 0x00FF0000:
304 if (!dst->format->Amask) {
306 } else {
308 }
309 break;
310 }
311 break;
312 default:
313 break;
314 }
315
316 if (!func) {
317 if (!dst->format->Amask) {
319 } else {
321 }
322 }
323
324 for (i = 0; i < count; ++i) {
325 /* Perform clipping */
326 if (!SDL_IntersectRect(&rects[i], &dst->clip_rect, &rect)) {
327 continue;
328 }
329 status = func(dst, &rect, blendMode, r, g, b, a);
330 }
331 return status;
332}
333
334#endif /* !SDL_RENDER_DISABLED */
335
336/* vi: set ts=4 sw=4 expandtab: */
static int SDL_BlendFillRect_RGB565(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendFillRects(SDL_Surface *dst, const SDL_Rect *rects, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendFillRect_RGB555(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendFillRect_RGB(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendFillRect(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendFillRect_RGB888(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendFillRect_ARGB8888(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendFillRect_RGBA(SDL_Surface *dst, const SDL_Rect *rect, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:41
@ SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
@ SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44
@ SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
#define DRAW_SETPIXEL_RGB888
Definition: SDL_draw.h:156
#define DRAW_SETPIXEL_ARGB8888
Definition: SDL_draw.h:187
#define DRAW_SETPIXEL_RGB565
Definition: SDL_draw.h:125
#define DRAW_SETPIXEL_MOD_RGB565
Definition: SDL_draw.h:136
#define DRAW_SETPIXEL_BLEND_RGB
Definition: SDL_draw.h:221
#define DRAW_SETPIXEL_ADD_ARGB8888
Definition: SDL_draw.h:194
#define DRAW_MUL(_a, _b)
Definition: SDL_draw.h:29
#define FILLRECT(type, op)
Definition: SDL_draw.h:545
#define DRAW_SETPIXEL_RGB
Definition: SDL_draw.h:218
#define DRAW_SETPIXEL_MOD_RGBA
Definition: SDL_draw.h:273
#define DRAW_SETPIXEL_MOD_ARGB8888
Definition: SDL_draw.h:198
#define DRAW_SETPIXEL_BLEND_RGB565
Definition: SDL_draw.h:128
#define DRAW_SETPIXEL_ADD_RGB888
Definition: SDL_draw.h:163
#define DRAW_SETPIXEL_BLEND_ARGB8888
Definition: SDL_draw.h:190
#define DRAW_SETPIXEL_ADD_RGB555
Definition: SDL_draw.h:101
#define DRAW_SETPIXEL_RGB555
Definition: SDL_draw.h:94
#define DRAW_SETPIXEL_MOD_RGB
Definition: SDL_draw.h:229
#define DRAW_SETPIXEL_MOD_RGB888
Definition: SDL_draw.h:167
#define DRAW_SETPIXEL_RGBA
Definition: SDL_draw.h:262
#define DRAW_SETPIXEL_BLEND_RGB888
Definition: SDL_draw.h:159
#define DRAW_SETPIXEL_BLEND_RGBA
Definition: SDL_draw.h:265
#define DRAW_SETPIXEL_MOD_RGB555
Definition: SDL_draw.h:105
#define DRAW_SETPIXEL_BLEND_RGB555
Definition: SDL_draw.h:97
#define DRAW_SETPIXEL_ADD_RGBA
Definition: SDL_draw.h:269
#define DRAW_SETPIXEL_ADD_RGB
Definition: SDL_draw.h:225
#define DRAW_SETPIXEL_ADD_RGB565
Definition: SDL_draw.h:132
#define SDL_SetError
#define SDL_IntersectRect
#define SDL_Unsupported()
Definition: SDL_error.h:53
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLboolean GLboolean GLboolean b
GLenum func
GLboolean GLboolean GLboolean GLboolean a
GLenum GLenum dst
GLboolean GLboolean g
uint32_t Uint32
Definition: SDL_stdinc.h:203
uint16_t Uint16
Definition: SDL_stdinc.h:191
uint8_t Uint8
Definition: SDL_stdinc.h:179
return Display return Display Bool Bool int int int return Display XEvent Bool(*) XPointer return Display return Display Drawable _Xconst char unsigned int unsigned int return Display Pixmap Pixmap XColor XColor unsigned int unsigned int return Display _Xconst char char int char return Display Visual unsigned int int int char unsigned int unsigned int in i)
Definition: SDL_x11sym.h:50
#define NULL
Definition: begin_code.h:167
EGLSurface EGLint * rects
Definition: eglext.h:282
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
A rectangle, with the origin at the upper left (integer).
Definition: SDL_rect.h:78
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
SDL_Rect rect
Definition: testrelative.c:27