SDL 2.0
SDL_blendpoint.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_blendpoint.h"
27
28
29static int
31 Uint8 g, Uint8 b, Uint8 a)
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
54 Uint8 g, Uint8 b, Uint8 a)
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
77 Uint8 g, Uint8 b, Uint8 a)
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
100 Uint8 r, Uint8 g, Uint8 b, Uint8 a)
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
123 Uint8 g, Uint8 b, Uint8 a)
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
168 Uint8 g, Uint8 b, Uint8 a)
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
197 Uint8 g, Uint8 b, Uint8 a)
198{
199 if (!dst) {
200 return SDL_SetError("Passed NULL destination surface");
201 }
202
203 /* This function doesn't work on surfaces < 8 bpp */
204 if (dst->format->BitsPerPixel < 8) {
205 return SDL_SetError("SDL_BlendPoint(): Unsupported surface format");
206 }
207
208 /* Perform clipping */
209 if (x < dst->clip_rect.x || y < dst->clip_rect.y ||
210 x >= (dst->clip_rect.x + dst->clip_rect.w) ||
211 y >= (dst->clip_rect.y + dst->clip_rect.h)) {
212 return 0;
213 }
214
216 r = DRAW_MUL(r, a);
217 g = DRAW_MUL(g, a);
218 b = DRAW_MUL(b, a);
219 }
220
221 switch (dst->format->BitsPerPixel) {
222 case 15:
223 switch (dst->format->Rmask) {
224 case 0x7C00:
225 return SDL_BlendPoint_RGB555(dst, x, y, blendMode, r, g, b, a);
226 }
227 break;
228 case 16:
229 switch (dst->format->Rmask) {
230 case 0xF800:
231 return SDL_BlendPoint_RGB565(dst, x, y, blendMode, r, g, b, a);
232 }
233 break;
234 case 32:
235 switch (dst->format->Rmask) {
236 case 0x00FF0000:
237 if (!dst->format->Amask) {
238 return SDL_BlendPoint_RGB888(dst, x, y, blendMode, r, g, b, a);
239 } else {
240 return SDL_BlendPoint_ARGB8888(dst, x, y, blendMode, r, g, b, a);
241 }
242 /* break; -Wunreachable-code-break */
243 }
244 break;
245 default:
246 break;
247 }
248
249 if (!dst->format->Amask) {
250 return SDL_BlendPoint_RGB(dst, x, y, blendMode, r, g, b, a);
251 } else {
252 return SDL_BlendPoint_RGBA(dst, x, y, blendMode, r, g, b, a);
253 }
254}
255
256int
259{
260 int minx, miny;
261 int maxx, maxy;
262 int i;
263 int x, y;
264 int (*func)(SDL_Surface * dst, int x, int y,
266 int status = 0;
267
268 if (!dst) {
269 return SDL_SetError("Passed NULL destination surface");
270 }
271
272 /* This function doesn't work on surfaces < 8 bpp */
273 if (dst->format->BitsPerPixel < 8) {
274 return SDL_SetError("SDL_BlendPoints(): Unsupported surface format");
275 }
276
278 r = DRAW_MUL(r, a);
279 g = DRAW_MUL(g, a);
280 b = DRAW_MUL(b, a);
281 }
282
283 /* FIXME: Does this function pointer slow things down significantly? */
284 switch (dst->format->BitsPerPixel) {
285 case 15:
286 switch (dst->format->Rmask) {
287 case 0x7C00:
289 break;
290 }
291 break;
292 case 16:
293 switch (dst->format->Rmask) {
294 case 0xF800:
296 break;
297 }
298 break;
299 case 32:
300 switch (dst->format->Rmask) {
301 case 0x00FF0000:
302 if (!dst->format->Amask) {
304 } else {
306 }
307 break;
308 }
309 break;
310 default:
311 break;
312 }
313
314 if (!func) {
315 if (!dst->format->Amask) {
317 } else {
319 }
320 }
321
322 minx = dst->clip_rect.x;
323 maxx = dst->clip_rect.x + dst->clip_rect.w - 1;
324 miny = dst->clip_rect.y;
325 maxy = dst->clip_rect.y + dst->clip_rect.h - 1;
326
327 for (i = 0; i < count; ++i) {
328 x = points[i].x;
329 y = points[i].y;
330
331 if (x < minx || x > maxx || y < miny || y > maxy) {
332 continue;
333 }
334 status = func(dst, x, y, blendMode, r, g, b, a);
335 }
336 return status;
337}
338
339#endif /* !SDL_RENDER_DISABLED */
340
341/* vi: set ts=4 sw=4 expandtab: */
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
static int SDL_BlendPoint_RGBA(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendPoint_RGB888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendPoint(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendPoint_ARGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendPoint_RGB555(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendPoint_RGB565(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
static int SDL_BlendPoint_RGB(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
int SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
#define DRAW_SETPIXELXY_RGB565(x, y)
Definition: SDL_draw.h:140
#define DRAW_SETPIXELXY4_MOD_RGB(x, y)
Definition: SDL_draw.h:254
#define DRAW_SETPIXELXY_MOD_RGB888(x, y)
Definition: SDL_draw.h:180
#define DRAW_SETPIXELXY_MOD_RGB555(x, y)
Definition: SDL_draw.h:118
#define DRAW_SETPIXELXY4_ADD_RGB(x, y)
Definition: SDL_draw.h:248
#define DRAW_SETPIXELXY_ADD_RGB888(x, y)
Definition: SDL_draw.h:177
#define DRAW_SETPIXELXY_ADD_RGB565(x, y)
Definition: SDL_draw.h:146
#define DRAW_SETPIXELXY_RGB888(x, y)
Definition: SDL_draw.h:171
#define DRAW_SETPIXELXY4_RGB(x, y)
Definition: SDL_draw.h:236
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y)
Definition: SDL_draw.h:174
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y)
Definition: SDL_draw.h:239
#define DRAW_SETPIXELXY_RGB555(x, y)
Definition: SDL_draw.h:109
#define DRAW_SETPIXELXY_ADD_RGB555(x, y)
Definition: SDL_draw.h:115
#define DRAW_SETPIXELXY_ARGB8888(x, y)
Definition: SDL_draw.h:202
#define DRAW_SETPIXELXY_MOD_RGB565(x, y)
Definition: SDL_draw.h:149
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y)
Definition: SDL_draw.h:143
#define DRAW_SETPIXELXY2_ADD_RGB(x, y)
Definition: SDL_draw.h:245
#define DRAW_MUL(_a, _b)
Definition: SDL_draw.h:29
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y)
Definition: SDL_draw.h:112
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y)
Definition: SDL_draw.h:205
#define DRAW_SETPIXELXY4_ADD_RGBA(x, y)
Definition: SDL_draw.h:283
#define DRAW_SETPIXELXY_ADD_ARGB8888(x, y)
Definition: SDL_draw.h:208
#define DRAW_SETPIXELXY_MOD_ARGB8888(x, y)
Definition: SDL_draw.h:211
#define DRAW_SETPIXELXY4_BLEND_RGBA(x, y)
Definition: SDL_draw.h:280
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y)
Definition: SDL_draw.h:242
#define DRAW_SETPIXELXY2_MOD_RGB(x, y)
Definition: SDL_draw.h:251
#define DRAW_SETPIXELXY4_MOD_RGBA(x, y)
Definition: SDL_draw.h:286
#define DRAW_SETPIXELXY2_RGB(x, y)
Definition: SDL_draw.h:233
#define DRAW_SETPIXELXY4_RGBA(x, y)
Definition: SDL_draw.h:277
#define SDL_SetError
#define SDL_Unsupported()
Definition: SDL_error.h:53
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
GLboolean GLboolean GLboolean b
GLfixed GLfixed GLint GLint GLfixed points
GLenum func
GLboolean GLboolean GLboolean GLboolean a
GLenum GLenum dst
GLboolean GLboolean g
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
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
The structure that defines a point (integer)
Definition: SDL_rect.h:49
A collection of pixels used in software blitting.
Definition: SDL_surface.h:71
static SDL_BlendMode blendMode
Definition: testdraw2.c:34