Skip to content
This repository has been archived by the owner on Feb 11, 2021. It is now read-only.

Latest commit

 

History

History
578 lines (538 loc) · 15.9 KB

SDL_blit.h

File metadata and controls

578 lines (538 loc) · 15.9 KB
 
Apr 26, 2001
Apr 26, 2001
1
2
/*
SDL - Simple DirectMedia Layer
Dec 8, 2008
Dec 8, 2008
3
Copyright (C) 1997-2009 Sam Lantinga
Apr 26, 2001
Apr 26, 2001
4
5
This library is free software; you can redistribute it and/or
Feb 1, 2006
Feb 1, 2006
6
modify it under the terms of the GNU Lesser General Public
Apr 26, 2001
Apr 26, 2001
7
License as published by the Free Software Foundation; either
Feb 1, 2006
Feb 1, 2006
8
version 2.1 of the License, or (at your option) any later version.
Apr 26, 2001
Apr 26, 2001
9
10
11
12
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Feb 1, 2006
Feb 1, 2006
13
Lesser General Public License for more details.
Apr 26, 2001
Apr 26, 2001
14
Feb 1, 2006
Feb 1, 2006
15
16
17
You should have received a copy of the GNU Lesser General Public
License along with this library; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Apr 26, 2001
Apr 26, 2001
18
19
Sam Lantinga
Dec 14, 2001
Dec 14, 2001
20
slouken@libsdl.org
Apr 26, 2001
Apr 26, 2001
21
*/
Feb 21, 2006
Feb 21, 2006
22
#include "SDL_config.h"
Apr 26, 2001
Apr 26, 2001
23
24
25
26
#ifndef _SDL_blit_h
#define _SDL_blit_h
Aug 16, 2007
Aug 16, 2007
27
28
#ifdef __MMX__
#include <mmintrin.h>
Aug 17, 2007
Aug 17, 2007
29
30
31
#endif
#ifdef __3dNOW__
#include <mm3dnow.h>
Aug 16, 2007
Aug 16, 2007
32
33
34
35
#endif
#ifdef __SSE__
#include <xmmintrin.h>
#endif
Aug 17, 2007
Aug 17, 2007
36
37
38
#ifdef __SSE2__
#include <emmintrin.h>
#endif
Aug 16, 2007
Aug 16, 2007
39
Aug 16, 2007
Aug 16, 2007
40
#include "SDL_cpuinfo.h"
Apr 26, 2001
Apr 26, 2001
41
42
#include "SDL_endian.h"
Aug 17, 2007
Aug 17, 2007
43
/* SDL blit copy flags */
Aug 18, 2007
Aug 18, 2007
44
45
46
47
48
49
50
51
52
53
54
#define SDL_COPY_MODULATE_COLOR 0x00000001
#define SDL_COPY_MODULATE_ALPHA 0x00000002
#define SDL_COPY_MASK 0x00000010
#define SDL_COPY_BLEND 0x00000020
#define SDL_COPY_ADD 0x00000040
#define SDL_COPY_MOD 0x00000080
#define SDL_COPY_COLORKEY 0x00000100
#define SDL_COPY_NEAREST 0x00000200
#define SDL_COPY_RLE_DESIRED 0x00001000
#define SDL_COPY_RLE_COLORKEY 0x00002000
#define SDL_COPY_RLE_ALPHAKEY 0x00004000
Dec 7, 2008
Dec 7, 2008
55
#define SDL_COPY_RLE_MASK (SDL_COPY_RLE_DESIRED|SDL_COPY_RLE_COLORKEY|SDL_COPY_RLE_ALPHAKEY)
Aug 17, 2007
Aug 17, 2007
56
57
/* SDL blit CPU flags */
Aug 18, 2007
Aug 18, 2007
58
59
60
61
62
63
64
#define SDL_CPU_ANY 0x00000000
#define SDL_CPU_MMX 0x00000001
#define SDL_CPU_3DNOW 0x00000002
#define SDL_CPU_SSE 0x00000004
#define SDL_CPU_SSE2 0x00000008
#define SDL_CPU_ALTIVEC_PREFETCH 0x00000010
#define SDL_CPU_ALTIVEC_NOPREFETCH 0x00000020
Aug 17, 2007
Aug 17, 2007
65
Aug 18, 2007
Aug 18, 2007
66
67
typedef struct
{
Aug 17, 2007
Aug 17, 2007
68
69
70
Uint8 *src;
int src_w, src_h;
int src_pitch;
Aug 18, 2007
Aug 18, 2007
71
int src_skip;
Aug 17, 2007
Aug 17, 2007
72
73
74
Uint8 *dst;
int dst_w, dst_h;
int dst_pitch;
Aug 18, 2007
Aug 18, 2007
75
int dst_skip;
Aug 17, 2007
Aug 17, 2007
76
77
SDL_PixelFormat *src_fmt;
SDL_PixelFormat *dst_fmt;
Jul 10, 2006
Jul 10, 2006
78
Uint8 *table;
Aug 17, 2007
Aug 17, 2007
79
80
81
int flags;
Uint32 colorkey;
Uint8 r, g, b, a;
Apr 26, 2001
Apr 26, 2001
82
83
} SDL_BlitInfo;
Aug 18, 2007
Aug 18, 2007
84
typedef void (SDLCALL * SDL_BlitFunc) (SDL_BlitInfo * info);
Aug 17, 2007
Aug 17, 2007
85
Aug 18, 2007
Aug 18, 2007
86
87
typedef struct
{
Aug 17, 2007
Aug 17, 2007
88
89
90
91
92
93
Uint32 src_format;
Uint32 dst_format;
int flags;
int cpu;
SDL_BlitFunc func;
} SDL_BlitFuncEntry;
Apr 26, 2001
Apr 26, 2001
94
95
/* Blit mapping definition */
Jul 10, 2006
Jul 10, 2006
96
97
98
99
typedef struct SDL_BlitMap
{
SDL_Surface *dst;
int identity;
Aug 17, 2007
Aug 17, 2007
100
101
SDL_blit blit;
void *data;
Aug 17, 2007
Aug 17, 2007
102
SDL_BlitInfo info;
Jul 10, 2006
Jul 10, 2006
103
104
105
106
/* the version count matches the destination; mismatch indicates
an invalid mapping */
unsigned int format_version;
Apr 26, 2001
Apr 26, 2001
107
108
109
} SDL_BlitMap;
/* Functions found in SDL_blit.c */
Jul 10, 2006
Jul 10, 2006
110
extern int SDL_CalculateBlit(SDL_Surface * surface);
Apr 26, 2001
Apr 26, 2001
111
Aug 18, 2007
Aug 18, 2007
112
113
114
115
116
/* Functions found in SDL_blit_*.c */
extern SDL_BlitFunc SDL_CalculateBlit0(SDL_Surface * surface);
extern SDL_BlitFunc SDL_CalculateBlit1(SDL_Surface * surface);
extern SDL_BlitFunc SDL_CalculateBlitN(SDL_Surface * surface);
extern SDL_BlitFunc SDL_CalculateBlitA(SDL_Surface * surface);
Aug 17, 2007
Aug 17, 2007
117
Apr 26, 2001
Apr 26, 2001
118
119
120
121
/*
* Useful macros for blitting routines
*/
Aug 16, 2007
Aug 16, 2007
122
123
124
#if defined(__GNUC__)
#define DECLARE_ALIGNED(t,v,a) t __attribute__((aligned(a))) v
#elif defined(_MSC_VER)
Aug 16, 2007
Aug 16, 2007
125
#define DECLARE_ALIGNED(t,v,a) __declspec(align(a)) t v
Aug 16, 2007
Aug 16, 2007
126
127
128
129
#else
#define DECLARE_ALIGNED(t,v,a) t v
#endif
Apr 26, 2001
Apr 26, 2001
130
131
132
133
134
135
#define FORMAT_EQUAL(A, B) \
((A)->BitsPerPixel == (B)->BitsPerPixel \
&& ((A)->Rmask == (B)->Rmask) && ((A)->Amask == (B)->Amask))
/* Load pixel of the specified format from a buffer and get its R-G-B values */
/* FIXME: rescale values to 0..255 here? */
Oct 20, 2005
Oct 20, 2005
136
#define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \
Apr 26, 2001
Apr 26, 2001
137
{ \
Oct 20, 2005
Oct 20, 2005
138
139
140
r = (((Pixel&fmt->Rmask)>>fmt->Rshift)<<fmt->Rloss); \
g = (((Pixel&fmt->Gmask)>>fmt->Gshift)<<fmt->Gloss); \
b = (((Pixel&fmt->Bmask)>>fmt->Bshift)<<fmt->Bloss); \
Apr 26, 2001
Apr 26, 2001
141
}
Oct 20, 2005
Oct 20, 2005
142
#define RGB_FROM_RGB565(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
143
{ \
Oct 20, 2005
Oct 20, 2005
144
145
146
r = (((Pixel&0xF800)>>11)<<3); \
g = (((Pixel&0x07E0)>>5)<<2); \
b = ((Pixel&0x001F)<<3); \
Apr 26, 2001
Apr 26, 2001
147
}
Oct 20, 2005
Oct 20, 2005
148
#define RGB_FROM_RGB555(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
149
{ \
Oct 20, 2005
Oct 20, 2005
150
151
152
r = (((Pixel&0x7C00)>>10)<<3); \
g = (((Pixel&0x03E0)>>5)<<3); \
b = ((Pixel&0x001F)<<3); \
Apr 26, 2001
Apr 26, 2001
153
}
Oct 20, 2005
Oct 20, 2005
154
#define RGB_FROM_RGB888(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
155
{ \
Oct 20, 2005
Oct 20, 2005
156
157
158
r = ((Pixel&0xFF0000)>>16); \
g = ((Pixel&0xFF00)>>8); \
b = (Pixel&0xFF); \
Apr 26, 2001
Apr 26, 2001
159
}
Oct 20, 2005
Oct 20, 2005
160
#define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \
Apr 26, 2001
Apr 26, 2001
161
162
163
do { \
switch (bpp) { \
case 2: \
Oct 20, 2005
Oct 20, 2005
164
Pixel = *((Uint16 *)(buf)); \
Apr 26, 2001
Apr 26, 2001
165
166
167
168
break; \
\
case 3: { \
Uint8 *B = (Uint8 *)(buf); \
Dec 2, 2008
Dec 2, 2008
169
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
Oct 20, 2005
Oct 20, 2005
170
Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \
Apr 26, 2001
Apr 26, 2001
171
} else { \
Oct 20, 2005
Oct 20, 2005
172
Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \
Apr 26, 2001
Apr 26, 2001
173
174
175
176
177
} \
} \
break; \
\
case 4: \
Oct 20, 2005
Oct 20, 2005
178
Pixel = *((Uint32 *)(buf)); \
Apr 26, 2001
Apr 26, 2001
179
180
181
break; \
\
default: \
Dec 2, 2008
Dec 2, 2008
182
Pixel; /* stop gcc complaints */ \
Apr 26, 2001
Apr 26, 2001
183
184
break; \
} \
Dec 2, 2008
Dec 2, 2008
185
} while (0)
Apr 26, 2001
Apr 26, 2001
186
Oct 20, 2005
Oct 20, 2005
187
#define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
188
189
190
do { \
switch (bpp) { \
case 2: \
Oct 20, 2005
Oct 20, 2005
191
Pixel = *((Uint16 *)(buf)); \
Dec 2, 2008
Dec 2, 2008
192
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
Apr 26, 2001
Apr 26, 2001
193
194
break; \
\
Dec 2, 2008
Dec 2, 2008
195
196
197
198
199
case 3: { \
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
r = *((buf)+fmt->Rshift/8); \
g = *((buf)+fmt->Gshift/8); \
b = *((buf)+fmt->Bshift/8); \
Apr 26, 2001
Apr 26, 2001
200
} else { \
Dec 2, 2008
Dec 2, 2008
201
202
203
r = *((buf)+2-fmt->Rshift/8); \
g = *((buf)+2-fmt->Gshift/8); \
b = *((buf)+2-fmt->Bshift/8); \
Apr 26, 2001
Apr 26, 2001
204
205
206
207
208
} \
} \
break; \
\
case 4: \
Oct 20, 2005
Oct 20, 2005
209
Pixel = *((Uint32 *)(buf)); \
Dec 2, 2008
Dec 2, 2008
210
RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \
Apr 26, 2001
Apr 26, 2001
211
212
break; \
\
Dec 2, 2008
Dec 2, 2008
213
214
default: \
Pixel; /* stop gcc complaints */ \
Apr 26, 2001
Apr 26, 2001
215
216
break; \
} \
Dec 2, 2008
Dec 2, 2008
217
} while (0)
Apr 26, 2001
Apr 26, 2001
218
219
/* Assemble R-G-B values into a specified pixel format and store them */
Oct 20, 2005
Oct 20, 2005
220
#define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \
Apr 26, 2001
Apr 26, 2001
221
{ \
Oct 20, 2005
Oct 20, 2005
222
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
Apr 26, 2001
Apr 26, 2001
223
224
225
((g>>fmt->Gloss)<<fmt->Gshift)| \
((b>>fmt->Bloss)<<fmt->Bshift); \
}
Oct 20, 2005
Oct 20, 2005
226
#define RGB565_FROM_RGB(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
227
{ \
Oct 20, 2005
Oct 20, 2005
228
Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \
Apr 26, 2001
Apr 26, 2001
229
}
Oct 20, 2005
Oct 20, 2005
230
#define RGB555_FROM_RGB(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
231
{ \
Oct 20, 2005
Oct 20, 2005
232
Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \
Apr 26, 2001
Apr 26, 2001
233
}
Oct 20, 2005
Oct 20, 2005
234
#define RGB888_FROM_RGB(Pixel, r, g, b) \
Apr 26, 2001
Apr 26, 2001
235
{ \
Oct 20, 2005
Oct 20, 2005
236
Pixel = (r<<16)|(g<<8)|b; \
Apr 26, 2001
Apr 26, 2001
237
238
239
240
241
}
#define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \
{ \
switch (bpp) { \
case 2: { \
Oct 20, 2005
Oct 20, 2005
242
Uint16 Pixel; \
Apr 26, 2001
Apr 26, 2001
243
\
Oct 20, 2005
Oct 20, 2005
244
245
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
*((Uint16 *)(buf)) = Pixel; \
Apr 26, 2001
Apr 26, 2001
246
247
248
249
} \
break; \
\
case 3: { \
Dec 2, 2008
Dec 2, 2008
250
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
Apr 26, 2001
Apr 26, 2001
251
252
253
254
255
256
257
258
259
260
261
262
*((buf)+fmt->Rshift/8) = r; \
*((buf)+fmt->Gshift/8) = g; \
*((buf)+fmt->Bshift/8) = b; \
} else { \
*((buf)+2-fmt->Rshift/8) = r; \
*((buf)+2-fmt->Gshift/8) = g; \
*((buf)+2-fmt->Bshift/8) = b; \
} \
} \
break; \
\
case 4: { \
Oct 20, 2005
Oct 20, 2005
263
Uint32 Pixel; \
Apr 26, 2001
Apr 26, 2001
264
\
Oct 20, 2005
Oct 20, 2005
265
266
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
*((Uint32 *)(buf)) = Pixel; \
Apr 26, 2001
Apr 26, 2001
267
268
269
270
271
272
273
274
275
} \
break; \
} \
}
#define ASSEMBLE_RGB_AMASK(buf, bpp, fmt, r, g, b, Amask) \
{ \
switch (bpp) { \
case 2: { \
Uint16 *bufp; \
Oct 20, 2005
Oct 20, 2005
276
Uint16 Pixel; \
Apr 26, 2001
Apr 26, 2001
277
278
\
bufp = (Uint16 *)buf; \
Oct 20, 2005
Oct 20, 2005
279
280
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
*bufp = Pixel | (*bufp & Amask); \
Apr 26, 2001
Apr 26, 2001
281
282
283
284
} \
break; \
\
case 3: { \
Dec 2, 2008
Dec 2, 2008
285
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
Apr 26, 2001
Apr 26, 2001
286
287
288
289
290
291
292
293
294
295
296
297
298
*((buf)+fmt->Rshift/8) = r; \
*((buf)+fmt->Gshift/8) = g; \
*((buf)+fmt->Bshift/8) = b; \
} else { \
*((buf)+2-fmt->Rshift/8) = r; \
*((buf)+2-fmt->Gshift/8) = g; \
*((buf)+2-fmt->Bshift/8) = b; \
} \
} \
break; \
\
case 4: { \
Uint32 *bufp; \
Oct 20, 2005
Oct 20, 2005
299
Uint32 Pixel; \
Apr 26, 2001
Apr 26, 2001
300
301
\
bufp = (Uint32 *)buf; \
Oct 20, 2005
Oct 20, 2005
302
303
PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \
*bufp = Pixel | (*bufp & Amask); \
Apr 26, 2001
Apr 26, 2001
304
305
306
307
308
309
} \
break; \
} \
}
/* FIXME: Should we rescale alpha into 0..255 here? */
Oct 20, 2005
Oct 20, 2005
310
#define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
311
{ \
Oct 20, 2005
Oct 20, 2005
312
313
314
315
r = ((Pixel&fmt->Rmask)>>fmt->Rshift)<<fmt->Rloss; \
g = ((Pixel&fmt->Gmask)>>fmt->Gshift)<<fmt->Gloss; \
b = ((Pixel&fmt->Bmask)>>fmt->Bshift)<<fmt->Bloss; \
a = ((Pixel&fmt->Amask)>>fmt->Ashift)<<fmt->Aloss; \
Apr 26, 2001
Apr 26, 2001
316
}
Oct 20, 2005
Oct 20, 2005
317
#define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
318
{ \
Oct 20, 2005
Oct 20, 2005
319
320
321
322
r = (Pixel&fmt->Rmask)>>fmt->Rshift; \
g = (Pixel&fmt->Gmask)>>fmt->Gshift; \
b = (Pixel&fmt->Bmask)>>fmt->Bshift; \
a = (Pixel&fmt->Amask)>>fmt->Ashift; \
Apr 26, 2001
Apr 26, 2001
323
}
Oct 20, 2005
Oct 20, 2005
324
#define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
325
{ \
Oct 20, 2005
Oct 20, 2005
326
327
328
329
r = (Pixel>>24); \
g = ((Pixel>>16)&0xFF); \
b = ((Pixel>>8)&0xFF); \
a = (Pixel&0xFF); \
Apr 26, 2001
Apr 26, 2001
330
}
Oct 20, 2005
Oct 20, 2005
331
#define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
332
{ \
Oct 20, 2005
Oct 20, 2005
333
334
335
336
r = ((Pixel>>16)&0xFF); \
g = ((Pixel>>8)&0xFF); \
b = (Pixel&0xFF); \
a = (Pixel>>24); \
Apr 26, 2001
Apr 26, 2001
337
}
Oct 20, 2005
Oct 20, 2005
338
#define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
339
{ \
Oct 20, 2005
Oct 20, 2005
340
341
342
343
r = (Pixel&0xFF); \
g = ((Pixel>>8)&0xFF); \
b = ((Pixel>>16)&0xFF); \
a = (Pixel>>24); \
Apr 26, 2001
Apr 26, 2001
344
}
Oct 20, 2005
Oct 20, 2005
345
#define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
346
347
348
do { \
switch (bpp) { \
case 2: \
Oct 20, 2005
Oct 20, 2005
349
Pixel = *((Uint16 *)(buf)); \
Dec 2, 2008
Dec 2, 2008
350
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
Apr 26, 2001
Apr 26, 2001
351
352
break; \
\
Dec 2, 2008
Dec 2, 2008
353
354
355
356
357
case 3: { \
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
r = *((buf)+fmt->Rshift/8); \
g = *((buf)+fmt->Gshift/8); \
b = *((buf)+fmt->Bshift/8); \
Apr 26, 2001
Apr 26, 2001
358
} else { \
Dec 2, 2008
Dec 2, 2008
359
360
361
r = *((buf)+2-fmt->Rshift/8); \
g = *((buf)+2-fmt->Gshift/8); \
b = *((buf)+2-fmt->Bshift/8); \
Apr 26, 2001
Apr 26, 2001
362
} \
Dec 2, 2008
Dec 2, 2008
363
a = 0xFF; \
Apr 26, 2001
Apr 26, 2001
364
365
366
367
} \
break; \
\
case 4: \
Oct 20, 2005
Oct 20, 2005
368
Pixel = *((Uint32 *)(buf)); \
Dec 2, 2008
Dec 2, 2008
369
RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \
Apr 26, 2001
Apr 26, 2001
370
371
372
break; \
\
default: \
Dec 2, 2008
Dec 2, 2008
373
Pixel; /* stop gcc complaints */ \
Apr 26, 2001
Apr 26, 2001
374
375
break; \
} \
Dec 2, 2008
Dec 2, 2008
376
} while (0)
Apr 26, 2001
Apr 26, 2001
377
378
/* FIXME: this isn't correct, especially for Alpha (maximum != 255) */
Oct 20, 2005
Oct 20, 2005
379
#define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \
Apr 26, 2001
Apr 26, 2001
380
{ \
Oct 20, 2005
Oct 20, 2005
381
Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \
Apr 26, 2001
Apr 26, 2001
382
383
((g>>fmt->Gloss)<<fmt->Gshift)| \
((b>>fmt->Bloss)<<fmt->Bshift)| \
Oct 22, 2002
Oct 22, 2002
384
((a>>fmt->Aloss)<<fmt->Ashift); \
Apr 26, 2001
Apr 26, 2001
385
386
387
388
389
}
#define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \
{ \
switch (bpp) { \
case 2: { \
Oct 20, 2005
Oct 20, 2005
390
Uint16 Pixel; \
Apr 26, 2001
Apr 26, 2001
391
\
Oct 20, 2005
Oct 20, 2005
392
393
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
*((Uint16 *)(buf)) = Pixel; \
Apr 26, 2001
Apr 26, 2001
394
395
396
} \
break; \
\
Dec 2, 2008
Dec 2, 2008
397
398
case 3: { \
if (SDL_BYTEORDER == SDL_LIL_ENDIAN) { \
Apr 26, 2001
Apr 26, 2001
399
400
401
402
403
404
405
406
407
408
409
410
*((buf)+fmt->Rshift/8) = r; \
*((buf)+fmt->Gshift/8) = g; \
*((buf)+fmt->Bshift/8) = b; \
} else { \
*((buf)+2-fmt->Rshift/8) = r; \
*((buf)+2-fmt->Gshift/8) = g; \
*((buf)+2-fmt->Bshift/8) = b; \
} \
} \
break; \
\
case 4: { \
Oct 20, 2005
Oct 20, 2005
411
Uint32 Pixel; \
Apr 26, 2001
Apr 26, 2001
412
\
Oct 20, 2005
Oct 20, 2005
413
414
PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \
*((Uint32 *)(buf)) = Pixel; \
Apr 26, 2001
Apr 26, 2001
415
416
417
418
419
} \
break; \
} \
}
Oct 20, 2005
Oct 20, 2005
420
/* Blend the RGB values of two Pixels based on a source alpha value */
Apr 26, 2001
Apr 26, 2001
421
422
423
424
425
426
427
#define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \
do { \
dR = (((sR-dR)*(A))>>8)+dR; \
dG = (((sG-dG)*(A))>>8)+dG; \
dB = (((sB-dB)*(A))>>8)+dB; \
} while(0)
Oct 20, 2005
Oct 20, 2005
428
/* Blend the RGB values of two Pixels based on a source alpha value */
Apr 17, 2005
Apr 17, 2005
429
430
431
432
433
434
435
436
437
438
439
440
441
#define ACCURATE_ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB) \
do { \
unsigned tR, tG, tB, tA; \
tA = 255 - sA; \
tR = 1 + (sR * sA) + (dR * tA); \
dR = (tR + (tR >> 8)) >> 8; \
tG = 1 + (sG * sA) + (dG * tA); \
dG = (tG + (tG >> 8)) >> 8; \
tB = 1 + (sB * sA) + (dB * tA); \
dB = (tB + (tB >> 8)) >> 8; \
} while(0)
Apr 26, 2001
Apr 26, 2001
442
/* This is a very useful loop for optimizing blitters */
Dec 2, 2002
Dec 2, 2002
443
444
445
#if defined(_MSC_VER) && (_MSC_VER == 1300)
/* There's a bug in the Visual C++ 7 optimizer when compiling this code */
#else
Apr 26, 2001
Apr 26, 2001
446
#define USE_DUFFS_LOOP
Dec 2, 2002
Dec 2, 2002
447
#endif
Apr 26, 2001
Apr 26, 2001
448
449
450
451
452
#ifdef USE_DUFFS_LOOP
/* 8-times unrolled loop */
#define DUFFS_LOOP8(pixel_copy_increment, width) \
{ int n = (width+7)/8; \
Jul 7, 2001
Jul 7, 2001
453
switch (width & 7) { \
Apr 26, 2001
Apr 26, 2001
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
case 0: do { pixel_copy_increment; \
case 7: pixel_copy_increment; \
case 6: pixel_copy_increment; \
case 5: pixel_copy_increment; \
case 4: pixel_copy_increment; \
case 3: pixel_copy_increment; \
case 2: pixel_copy_increment; \
case 1: pixel_copy_increment; \
} while ( --n > 0 ); \
} \
}
/* 4-times unrolled loop */
#define DUFFS_LOOP4(pixel_copy_increment, width) \
{ int n = (width+3)/4; \
Jul 7, 2001
Jul 7, 2001
469
switch (width & 3) { \
Apr 26, 2001
Apr 26, 2001
470
471
472
473
474
475
476
477
case 0: do { pixel_copy_increment; \
case 3: pixel_copy_increment; \
case 2: pixel_copy_increment; \
case 1: pixel_copy_increment; \
} while ( --n > 0 ); \
} \
}
Aug 22, 2003
Aug 22, 2003
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
/* 2 - times unrolled loop */
#define DUFFS_LOOP_DOUBLE2(pixel_copy_increment, \
double_pixel_copy_increment, width) \
{ int n, w = width; \
if( w & 1 ) { \
pixel_copy_increment; \
w--; \
} \
if ( w > 0 ) { \
n = ( w + 2) / 4; \
switch( w & 2 ) { \
case 0: do { double_pixel_copy_increment; \
case 2: double_pixel_copy_increment; \
} while ( --n > 0 ); \
} \
} \
}
/* 2 - times unrolled loop 4 pixels */
#define DUFFS_LOOP_QUATRO2(pixel_copy_increment, \
double_pixel_copy_increment, \
quatro_pixel_copy_increment, width) \
{ int n, w = width; \
if(w & 1) { \
pixel_copy_increment; \
w--; \
} \
if(w & 2) { \
double_pixel_copy_increment; \
w -= 2; \
} \
if ( w > 0 ) { \
n = ( w + 7 ) / 8; \
switch( w & 4 ) { \
case 0: do { quatro_pixel_copy_increment; \
case 4: quatro_pixel_copy_increment; \
} while ( --n > 0 ); \
} \
} \
}
Apr 26, 2001
Apr 26, 2001
519
520
521
522
523
524
/* Use the 8-times version of the loop by default */
#define DUFFS_LOOP(pixel_copy_increment, width) \
DUFFS_LOOP8(pixel_copy_increment, width)
#else
Aug 22, 2003
Aug 22, 2003
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
/* Don't use Duff's device to unroll loops */
#define DUFFS_LOOP_DOUBLE2(pixel_copy_increment, \
double_pixel_copy_increment, width) \
{ int n = width; \
if( n & 1 ) { \
pixel_copy_increment; \
n--; \
} \
n=n>>1; \
for(; n > 0; --n) { \
double_pixel_copy_increment; \
} \
}
/* Don't use Duff's device to unroll loops */
#define DUFFS_LOOP_QUATRO2(pixel_copy_increment, \
double_pixel_copy_increment, \
quatro_pixel_copy_increment, width) \
{ int n = width; \
if(n & 1) { \
pixel_copy_increment; \
n--; \
} \
if(n & 2) { \
double_pixel_copy_increment; \
n -= 2; \
} \
n=n>>2; \
for(; n > 0; --n) { \
quatro_pixel_copy_increment; \
} \
}
Apr 26, 2001
Apr 26, 2001
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
/* Don't use Duff's device to unroll loops */
#define DUFFS_LOOP(pixel_copy_increment, width) \
{ int n; \
for ( n=width; n > 0; --n ) { \
pixel_copy_increment; \
} \
}
#define DUFFS_LOOP8(pixel_copy_increment, width) \
DUFFS_LOOP(pixel_copy_increment, width)
#define DUFFS_LOOP4(pixel_copy_increment, width) \
DUFFS_LOOP(pixel_copy_increment, width)
#endif /* USE_DUFFS_LOOP */
/* Prevent Visual C++ 6.0 from printing out stupid warnings */
#if defined(_MSC_VER) && (_MSC_VER >= 600)
#pragma warning(disable: 4550)
#endif
#endif /* _SDL_blit_h */
Jul 10, 2006
Jul 10, 2006
578
/* vi: set ts=4 sw=4 expandtab: */