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 
29 static int
31  Uint8 g, Uint8 b, Uint8 a)
32 {
33  unsigned inva = 0xff - a;
34 
35  switch (blendMode) {
38  break;
39  case SDL_BLENDMODE_ADD:
41  break;
42  case SDL_BLENDMODE_MOD:
44  break;
45  default:
47  break;
48  }
49  return 0;
50 }
51 
52 static int
54  Uint8 g, Uint8 b, Uint8 a)
55 {
56  unsigned inva = 0xff - a;
57 
58  switch (blendMode) {
61  break;
62  case SDL_BLENDMODE_ADD:
64  break;
65  case SDL_BLENDMODE_MOD:
67  break;
68  default:
70  break;
71  }
72  return 0;
73 }
74 
75 static int
77  Uint8 g, Uint8 b, Uint8 a)
78 {
79  unsigned inva = 0xff - a;
80 
81  switch (blendMode) {
84  break;
85  case SDL_BLENDMODE_ADD:
87  break;
88  case SDL_BLENDMODE_MOD:
90  break;
91  default:
93  break;
94  }
95  return 0;
96 }
97 
98 static int
100  Uint8 r, Uint8 g, Uint8 b, Uint8 a)
101 {
102  unsigned inva = 0xff - a;
103 
104  switch (blendMode) {
105  case SDL_BLENDMODE_BLEND:
107  break;
108  case SDL_BLENDMODE_ADD:
110  break;
111  case SDL_BLENDMODE_MOD:
113  break;
114  default:
116  break;
117  }
118  return 0;
119 }
120 
121 static 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) {
131  case SDL_BLENDMODE_BLEND:
133  break;
134  case SDL_BLENDMODE_ADD:
136  break;
137  case SDL_BLENDMODE_MOD:
139  break;
140  default:
142  break;
143  }
144  return 0;
145  case 4:
146  switch (blendMode) {
147  case SDL_BLENDMODE_BLEND:
149  break;
150  case SDL_BLENDMODE_ADD:
152  break;
153  case SDL_BLENDMODE_MOD:
155  break;
156  default:
158  break;
159  }
160  return 0;
161  default:
162  return SDL_Unsupported();
163  }
164 }
165 
166 static 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) {
176  case SDL_BLENDMODE_BLEND:
178  break;
179  case SDL_BLENDMODE_ADD:
181  break;
182  case SDL_BLENDMODE_MOD:
184  break;
185  default:
187  break;
188  }
189  return 0;
190  default:
191  return SDL_Unsupported();
192  }
193 }
194 
195 int
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 
256 int
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: */
points
GLfixed GLfixed GLint GLint GLfixed points
Definition: SDL_opengl_glext.h:4558
SDL_PixelFormat::BytesPerPixel
Uint8 BytesPerPixel
Definition: SDL_pixels.h:320
blendMode
static SDL_BlendMode blendMode
Definition: testdraw2.c:34
DRAW_SETPIXELXY_ARGB8888
#define DRAW_SETPIXELXY_ARGB8888(x, y)
Definition: SDL_draw.h:202
SDL_Surface
A collection of pixels used in software blitting.
Definition: SDL_surface.h:70
SDL_BLENDMODE_ADD
@ SDL_BLENDMODE_ADD
Definition: SDL_blendmode.h:47
NULL
#define NULL
Definition: begin_code.h:167
SDL_PixelFormat::format
Uint32 format
Definition: SDL_pixels.h:317
b
GLboolean GLboolean GLboolean b
Definition: SDL_opengl_glext.h:1109
DRAW_SETPIXELXY4_BLEND_RGBA
#define DRAW_SETPIXELXY4_BLEND_RGBA(x, y)
Definition: SDL_draw.h:280
g
GLboolean GLboolean g
Definition: SDL_opengl_glext.h:1109
count
GLuint GLuint GLsizei count
Definition: SDL_opengl.h:1571
DRAW_SETPIXELXY4_RGB
#define DRAW_SETPIXELXY4_RGB(x, y)
Definition: SDL_draw.h:236
DRAW_SETPIXELXY2_ADD_RGB
#define DRAW_SETPIXELXY2_ADD_RGB(x, y)
Definition: SDL_draw.h:245
r
GLdouble GLdouble GLdouble r
Definition: SDL_opengl.h:2079
SDL_BlendPoint_RGBA
static int SDL_BlendPoint_RGBA(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:167
DRAW_SETPIXELXY2_RGB
#define DRAW_SETPIXELXY2_RGB(x, y)
Definition: SDL_draw.h:233
a
GLboolean GLboolean GLboolean GLboolean a
Definition: SDL_opengl_glext.h:1109
func
GLenum func
Definition: SDL_opengl_glext.h:657
DRAW_SETPIXELXY_RGB888
#define DRAW_SETPIXELXY_RGB888(x, y)
Definition: SDL_draw.h:171
SDL_BlendPoints
int SDL_BlendPoints(SDL_Surface *dst, const SDL_Point *points, int count, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:257
dst
GLenum GLenum dst
Definition: SDL_opengl_glext.h:1737
SDL_BlendPoint_RGB565
static int SDL_BlendPoint_RGB565(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:53
DRAW_SETPIXELXY_ADD_RGB555
#define DRAW_SETPIXELXY_ADD_RGB555(x, y)
Definition: SDL_draw.h:115
SDL_BLENDMODE_MOD
@ SDL_BLENDMODE_MOD
Definition: SDL_blendmode.h:50
DRAW_SETPIXELXY_ADD_RGB565
#define DRAW_SETPIXELXY_ADD_RGB565(x, y)
Definition: SDL_draw.h:146
DRAW_SETPIXELXY2_MOD_RGB
#define DRAW_SETPIXELXY2_MOD_RGB(x, y)
Definition: SDL_draw.h:251
x
GLint GLint GLint GLint GLint x
Definition: SDL_opengl.h:1574
DRAW_SETPIXELXY4_MOD_RGBA
#define DRAW_SETPIXELXY4_MOD_RGBA(x, y)
Definition: SDL_draw.h:286
SDL_draw.h
SDL_blendpoint.h
DRAW_SETPIXELXY_MOD_RGB888
#define DRAW_SETPIXELXY_MOD_RGB888(x, y)
Definition: SDL_draw.h:180
DRAW_SETPIXELXY4_ADD_RGB
#define DRAW_SETPIXELXY4_ADD_RGB(x, y)
Definition: SDL_draw.h:248
DRAW_SETPIXELXY_MOD_ARGB8888
#define DRAW_SETPIXELXY_MOD_ARGB8888(x, y)
Definition: SDL_draw.h:211
SDL_BlendPoint
int SDL_BlendPoint(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:196
DRAW_SETPIXELXY_BLEND_ARGB8888
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y)
Definition: SDL_draw.h:205
SDL_BlendPoint_RGB
static int SDL_BlendPoint_RGB(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:122
DRAW_SETPIXELXY_ADD_ARGB8888
#define DRAW_SETPIXELXY_ADD_ARGB8888(x, y)
Definition: SDL_draw.h:208
DRAW_SETPIXELXY_BLEND_RGB565
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y)
Definition: SDL_draw.h:143
DRAW_SETPIXELXY_RGB555
#define DRAW_SETPIXELXY_RGB555(x, y)
Definition: SDL_draw.h:109
SDL_PixelFormat
Definition: SDL_pixels.h:315
DRAW_MUL
#define DRAW_MUL(_a, _b)
Definition: SDL_draw.h:29
DRAW_SETPIXELXY4_RGBA
#define DRAW_SETPIXELXY4_RGBA(x, y)
Definition: SDL_draw.h:277
DRAW_SETPIXELXY2_BLEND_RGB
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y)
Definition: SDL_draw.h:239
DRAW_SETPIXELXY_MOD_RGB565
#define DRAW_SETPIXELXY_MOD_RGB565(x, y)
Definition: SDL_draw.h:149
SDL_BLENDMODE_BLEND
@ SDL_BLENDMODE_BLEND
Definition: SDL_blendmode.h:44
y
GLint GLint GLint GLint GLint GLint y
Definition: SDL_opengl.h:1574
DRAW_SETPIXELXY4_MOD_RGB
#define DRAW_SETPIXELXY4_MOD_RGB(x, y)
Definition: SDL_draw.h:254
DRAW_SETPIXELXY_MOD_RGB555
#define DRAW_SETPIXELXY_MOD_RGB555(x, y)
Definition: SDL_draw.h:118
SDL_Point
The structure that defines a point (integer)
Definition: SDL_rect.h:48
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:30
DRAW_SETPIXELXY_BLEND_RGB888
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y)
Definition: SDL_draw.h:174
DRAW_SETPIXELXY4_BLEND_RGB
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y)
Definition: SDL_draw.h:242
DRAW_SETPIXELXY_BLEND_RGB555
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y)
Definition: SDL_draw.h:112
DRAW_SETPIXELXY_RGB565
#define DRAW_SETPIXELXY_RGB565(x, y)
Definition: SDL_draw.h:140
SDL_BlendPoint_RGB555
static int SDL_BlendPoint_RGB555(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:30
SDL_BlendPoint_RGB888
static int SDL_BlendPoint_RGB888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:76
DRAW_SETPIXELXY_ADD_RGB888
#define DRAW_SETPIXELXY_ADD_RGB888(x, y)
Definition: SDL_draw.h:177
SDL_Unsupported
#define SDL_Unsupported()
Definition: SDL_error.h:53
SDL_BlendMode
SDL_BlendMode
The blend mode used in SDL_RenderCopy() and drawing operations.
Definition: SDL_blendmode.h:40
i
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
DRAW_SETPIXELXY4_ADD_RGBA
#define DRAW_SETPIXELXY4_ADD_RGBA(x, y)
Definition: SDL_draw.h:283
SDL_BlendPoint_ARGB8888
static int SDL_BlendPoint_ARGB8888(SDL_Surface *dst, int x, int y, SDL_BlendMode blendMode, Uint8 r, Uint8 g, Uint8 b, Uint8 a)
Definition: SDL_blendpoint.c:99
Uint8
uint8_t Uint8
Definition: SDL_stdinc.h:179