slouken@0
|
1 |
/*
|
slouken@5535
|
2 |
Simple DirectMedia Layer
|
slouken@12503
|
3 |
Copyright (C) 1997-2019 Sam Lantinga <slouken@libsdl.org>
|
slouken@0
|
4 |
|
slouken@5535
|
5 |
This software is provided 'as-is', without any express or implied
|
slouken@5535
|
6 |
warranty. In no event will the authors be held liable for any damages
|
slouken@5535
|
7 |
arising from the use of this software.
|
slouken@0
|
8 |
|
slouken@5535
|
9 |
Permission is granted to anyone to use this software for any purpose,
|
slouken@5535
|
10 |
including commercial applications, and to alter it and redistribute it
|
slouken@5535
|
11 |
freely, subject to the following restrictions:
|
slouken@0
|
12 |
|
slouken@5535
|
13 |
1. The origin of this software must not be misrepresented; you must not
|
slouken@5535
|
14 |
claim that you wrote the original software. If you use this software
|
slouken@5535
|
15 |
in a product, an acknowledgment in the product documentation would be
|
slouken@5535
|
16 |
appreciated but is not required.
|
slouken@5535
|
17 |
2. Altered source versions must be plainly marked as such, and must not be
|
slouken@5535
|
18 |
misrepresented as being the original software.
|
slouken@5535
|
19 |
3. This notice may not be removed or altered from any source distribution.
|
slouken@0
|
20 |
*/
|
icculus@8093
|
21 |
#include "../SDL_internal.h"
|
slouken@0
|
22 |
|
slouken@0
|
23 |
#include "SDL_video.h"
|
slouken@1358
|
24 |
#include "SDL_endian.h"
|
slouken@1358
|
25 |
#include "SDL_cpuinfo.h"
|
slouken@0
|
26 |
#include "SDL_blit.h"
|
slouken@0
|
27 |
|
icculus@6281
|
28 |
#include "SDL_assert.h"
|
icculus@6281
|
29 |
|
slouken@0
|
30 |
/* Functions to blit from N-bit surfaces to other surfaces */
|
slouken@0
|
31 |
|
slouken@5389
|
32 |
#if SDL_ALTIVEC_BLITTERS
|
slouken@6165
|
33 |
#ifdef HAVE_ALTIVEC_H
|
slouken@6165
|
34 |
#include <altivec.h>
|
slouken@6165
|
35 |
#endif
|
slouken@5389
|
36 |
#ifdef __MACOSX__
|
slouken@5389
|
37 |
#include <sys/sysctl.h>
|
slouken@5389
|
38 |
static size_t
|
slouken@5389
|
39 |
GetL3CacheSize(void)
|
slouken@5389
|
40 |
{
|
slouken@5389
|
41 |
const char key[] = "hw.l3cachesize";
|
slouken@5389
|
42 |
u_int64_t result = 0;
|
slouken@5389
|
43 |
size_t typeSize = sizeof(result);
|
slouken@5389
|
44 |
|
slouken@5389
|
45 |
|
slouken@5389
|
46 |
int err = sysctlbyname(key, &result, &typeSize, NULL, 0);
|
slouken@5389
|
47 |
if (0 != err)
|
slouken@5389
|
48 |
return 0;
|
slouken@5389
|
49 |
|
slouken@5389
|
50 |
return result;
|
slouken@5389
|
51 |
}
|
slouken@5389
|
52 |
#else
|
slouken@5389
|
53 |
static size_t
|
slouken@5389
|
54 |
GetL3CacheSize(void)
|
slouken@5389
|
55 |
{
|
slouken@5389
|
56 |
/* XXX: Just guess G4 */
|
slouken@5389
|
57 |
return 2097152;
|
slouken@5389
|
58 |
}
|
slouken@5389
|
59 |
#endif /* __MACOSX__ */
|
slouken@5389
|
60 |
|
slouken@5389
|
61 |
#if (defined(__MACOSX__) && (__GNUC__ < 4))
|
slouken@5389
|
62 |
#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
|
slouken@5389
|
63 |
(vector unsigned char) ( a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p )
|
slouken@5389
|
64 |
#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \
|
slouken@5389
|
65 |
(vector unsigned short) ( a,b,c,d,e,f,g,h )
|
slouken@5389
|
66 |
#else
|
slouken@5389
|
67 |
#define VECUINT8_LITERAL(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p) \
|
slouken@5389
|
68 |
(vector unsigned char) { a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p }
|
slouken@5389
|
69 |
#define VECUINT16_LITERAL(a,b,c,d,e,f,g,h) \
|
slouken@5389
|
70 |
(vector unsigned short) { a,b,c,d,e,f,g,h }
|
slouken@5389
|
71 |
#endif
|
slouken@5389
|
72 |
|
slouken@5389
|
73 |
#define UNALIGNED_PTR(x) (((size_t) x) & 0x0000000F)
|
slouken@5389
|
74 |
#define VSWIZZLE32(a,b,c,d) (vector unsigned char) \
|
slouken@5389
|
75 |
( 0x00+a, 0x00+b, 0x00+c, 0x00+d, \
|
slouken@5389
|
76 |
0x04+a, 0x04+b, 0x04+c, 0x04+d, \
|
slouken@5389
|
77 |
0x08+a, 0x08+b, 0x08+c, 0x08+d, \
|
slouken@5389
|
78 |
0x0C+a, 0x0C+b, 0x0C+c, 0x0C+d )
|
slouken@5389
|
79 |
|
slouken@5389
|
80 |
#define MAKE8888(dstfmt, r, g, b, a) \
|
slouken@5389
|
81 |
( ((r<<dstfmt->Rshift)&dstfmt->Rmask) | \
|
slouken@5389
|
82 |
((g<<dstfmt->Gshift)&dstfmt->Gmask) | \
|
slouken@5389
|
83 |
((b<<dstfmt->Bshift)&dstfmt->Bmask) | \
|
slouken@5389
|
84 |
((a<<dstfmt->Ashift)&dstfmt->Amask) )
|
slouken@5389
|
85 |
|
slouken@5389
|
86 |
/*
|
slouken@5389
|
87 |
* Data Stream Touch...Altivec cache prefetching.
|
slouken@5389
|
88 |
*
|
slouken@5389
|
89 |
* Don't use this on a G5...however, the speed boost is very significant
|
slouken@5389
|
90 |
* on a G4.
|
slouken@5389
|
91 |
*/
|
slouken@5389
|
92 |
#define DST_CHAN_SRC 1
|
slouken@5389
|
93 |
#define DST_CHAN_DEST 2
|
slouken@5389
|
94 |
|
slouken@5389
|
95 |
/* macro to set DST control word value... */
|
slouken@5389
|
96 |
#define DST_CTRL(size, count, stride) \
|
slouken@5389
|
97 |
(((size) << 24) | ((count) << 16) | (stride))
|
slouken@5389
|
98 |
|
slouken@5389
|
99 |
#define VEC_ALIGNER(src) ((UNALIGNED_PTR(src)) \
|
slouken@5389
|
100 |
? vec_lvsl(0, src) \
|
slouken@5389
|
101 |
: vec_add(vec_lvsl(8, src), vec_splat_u8(8)))
|
slouken@5389
|
102 |
|
slouken@5389
|
103 |
/* Calculate the permute vector used for 32->32 swizzling */
|
slouken@5389
|
104 |
static vector unsigned char
|
slouken@5389
|
105 |
calc_swizzle32(const SDL_PixelFormat * srcfmt, const SDL_PixelFormat * dstfmt)
|
slouken@5389
|
106 |
{
|
slouken@5389
|
107 |
/*
|
slouken@5389
|
108 |
* We have to assume that the bits that aren't used by other
|
slouken@5389
|
109 |
* colors is alpha, and it's one complete byte, since some formats
|
slouken@5389
|
110 |
* leave alpha with a zero mask, but we should still swizzle the bits.
|
slouken@5389
|
111 |
*/
|
slouken@5389
|
112 |
/* ARGB */
|
slouken@5389
|
113 |
const static const struct SDL_PixelFormat default_pixel_format = {
|
slouken@5407
|
114 |
0, NULL, 0, 0,
|
slouken@6165
|
115 |
{0, 0},
|
slouken@6165
|
116 |
0x00FF0000, 0x0000FF00, 0x000000FF, 0xFF000000,
|
slouken@5389
|
117 |
0, 0, 0, 0,
|
slouken@5389
|
118 |
16, 8, 0, 24,
|
slouken@5407
|
119 |
0, NULL
|
slouken@5389
|
120 |
};
|
slouken@5389
|
121 |
const vector unsigned char plus = VECUINT8_LITERAL(0x00, 0x00, 0x00, 0x00,
|
slouken@5389
|
122 |
0x04, 0x04, 0x04, 0x04,
|
slouken@5389
|
123 |
0x08, 0x08, 0x08, 0x08,
|
slouken@5389
|
124 |
0x0C, 0x0C, 0x0C,
|
slouken@5389
|
125 |
0x0C);
|
slouken@5389
|
126 |
vector unsigned char vswiz;
|
slouken@5389
|
127 |
vector unsigned int srcvec;
|
slouken@10559
|
128 |
Uint32 rmask, gmask, bmask, amask;
|
slouken@10558
|
129 |
|
slouken@10558
|
130 |
if (!srcfmt) {
|
slouken@10558
|
131 |
srcfmt = &default_pixel_format;
|
slouken@10558
|
132 |
}
|
slouken@10558
|
133 |
if (!dstfmt) {
|
slouken@10558
|
134 |
dstfmt = &default_pixel_format;
|
slouken@10558
|
135 |
}
|
slouken@10558
|
136 |
|
slouken@10559
|
137 |
#define RESHIFT(X) (3 - ((X) >> 3))
|
slouken@10559
|
138 |
rmask = RESHIFT(srcfmt->Rshift) << (dstfmt->Rshift);
|
slouken@10559
|
139 |
gmask = RESHIFT(srcfmt->Gshift) << (dstfmt->Gshift);
|
slouken@10559
|
140 |
bmask = RESHIFT(srcfmt->Bshift) << (dstfmt->Bshift);
|
slouken@10559
|
141 |
|
slouken@5389
|
142 |
/* Use zero for alpha if either surface doesn't have alpha */
|
slouken@5389
|
143 |
if (dstfmt->Amask) {
|
slouken@5389
|
144 |
amask =
|
slouken@5389
|
145 |
((srcfmt->Amask) ? RESHIFT(srcfmt->
|
slouken@5389
|
146 |
Ashift) : 0x10) << (dstfmt->Ashift);
|
slouken@5389
|
147 |
} else {
|
slouken@5389
|
148 |
amask =
|
slouken@5389
|
149 |
0x10101010 & ((dstfmt->Rmask | dstfmt->Gmask | dstfmt->Bmask) ^
|
slouken@5389
|
150 |
0xFFFFFFFF);
|
slouken@5389
|
151 |
}
|
slouken@5389
|
152 |
#undef RESHIFT
|
slouken@10559
|
153 |
|
slouken@5389
|
154 |
((unsigned int *) (char *) &srcvec)[0] = (rmask | gmask | bmask | amask);
|
slouken@5389
|
155 |
vswiz = vec_add(plus, (vector unsigned char) vec_splat(srcvec, 0));
|
slouken@5389
|
156 |
return (vswiz);
|
slouken@5389
|
157 |
}
|
slouken@5389
|
158 |
|
slouken@5389
|
159 |
static void Blit_RGB888_RGB565(SDL_BlitInfo * info);
|
slouken@5389
|
160 |
static void
|
slouken@5389
|
161 |
Blit_RGB888_RGB565Altivec(SDL_BlitInfo * info)
|
slouken@5389
|
162 |
{
|
slouken@5389
|
163 |
int height = info->dst_h;
|
slouken@5389
|
164 |
Uint8 *src = (Uint8 *) info->src;
|
slouken@5389
|
165 |
int srcskip = info->src_skip;
|
slouken@5389
|
166 |
Uint8 *dst = (Uint8 *) info->dst;
|
slouken@5389
|
167 |
int dstskip = info->dst_skip;
|
slouken@5389
|
168 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
169 |
vector unsigned char valpha = vec_splat_u8(0);
|
slouken@5389
|
170 |
vector unsigned char vpermute = calc_swizzle32(srcfmt, NULL);
|
slouken@5389
|
171 |
vector unsigned char vgmerge = VECUINT8_LITERAL(0x00, 0x02, 0x00, 0x06,
|
slouken@5389
|
172 |
0x00, 0x0a, 0x00, 0x0e,
|
slouken@5389
|
173 |
0x00, 0x12, 0x00, 0x16,
|
slouken@5389
|
174 |
0x00, 0x1a, 0x00, 0x1e);
|
slouken@5389
|
175 |
vector unsigned short v1 = vec_splat_u16(1);
|
slouken@5389
|
176 |
vector unsigned short v3 = vec_splat_u16(3);
|
slouken@5389
|
177 |
vector unsigned short v3f =
|
slouken@5389
|
178 |
VECUINT16_LITERAL(0x003f, 0x003f, 0x003f, 0x003f,
|
slouken@5389
|
179 |
0x003f, 0x003f, 0x003f, 0x003f);
|
slouken@5389
|
180 |
vector unsigned short vfc =
|
slouken@5389
|
181 |
VECUINT16_LITERAL(0x00fc, 0x00fc, 0x00fc, 0x00fc,
|
slouken@5389
|
182 |
0x00fc, 0x00fc, 0x00fc, 0x00fc);
|
slouken@5389
|
183 |
vector unsigned short vf800 = (vector unsigned short) vec_splat_u8(-7);
|
slouken@5389
|
184 |
vf800 = vec_sl(vf800, vec_splat_u16(8));
|
slouken@5389
|
185 |
|
slouken@5389
|
186 |
while (height--) {
|
slouken@5389
|
187 |
vector unsigned char valigner;
|
slouken@5389
|
188 |
vector unsigned char voverflow;
|
slouken@5389
|
189 |
vector unsigned char vsrc;
|
slouken@5389
|
190 |
|
slouken@5389
|
191 |
int width = info->dst_w;
|
slouken@5389
|
192 |
int extrawidth;
|
slouken@5389
|
193 |
|
slouken@5389
|
194 |
/* do scalar until we can align... */
|
slouken@5389
|
195 |
#define ONE_PIXEL_BLEND(condition, widthvar) \
|
slouken@5389
|
196 |
while (condition) { \
|
slouken@5389
|
197 |
Uint32 Pixel; \
|
slouken@5389
|
198 |
unsigned sR, sG, sB, sA; \
|
slouken@5389
|
199 |
DISEMBLE_RGBA((Uint8 *)src, 4, srcfmt, Pixel, \
|
slouken@5389
|
200 |
sR, sG, sB, sA); \
|
slouken@5389
|
201 |
*(Uint16 *)(dst) = (((sR << 8) & 0x0000F800) | \
|
slouken@5389
|
202 |
((sG << 3) & 0x000007E0) | \
|
slouken@5389
|
203 |
((sB >> 3) & 0x0000001F)); \
|
slouken@5389
|
204 |
dst += 2; \
|
slouken@5389
|
205 |
src += 4; \
|
slouken@5389
|
206 |
widthvar--; \
|
slouken@5389
|
207 |
}
|
slouken@5389
|
208 |
|
slouken@5389
|
209 |
ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);
|
slouken@5389
|
210 |
|
slouken@5389
|
211 |
/* After all that work, here's the vector part! */
|
slouken@5389
|
212 |
extrawidth = (width % 8); /* trailing unaligned stores */
|
slouken@5389
|
213 |
width -= extrawidth;
|
slouken@5389
|
214 |
vsrc = vec_ld(0, src);
|
slouken@5389
|
215 |
valigner = VEC_ALIGNER(src);
|
slouken@5389
|
216 |
|
slouken@5389
|
217 |
while (width) {
|
slouken@5389
|
218 |
vector unsigned short vpixel, vrpixel, vgpixel, vbpixel;
|
slouken@5389
|
219 |
vector unsigned int vsrc1, vsrc2;
|
slouken@5389
|
220 |
vector unsigned char vdst;
|
slouken@5389
|
221 |
|
slouken@5389
|
222 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
223 |
vsrc = vec_perm(vsrc, voverflow, valigner);
|
slouken@5389
|
224 |
vsrc1 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute);
|
slouken@5389
|
225 |
src += 16;
|
slouken@5389
|
226 |
vsrc = voverflow;
|
slouken@5389
|
227 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
228 |
vsrc = vec_perm(vsrc, voverflow, valigner);
|
slouken@5389
|
229 |
vsrc2 = (vector unsigned int) vec_perm(vsrc, valpha, vpermute);
|
slouken@5389
|
230 |
/* 1555 */
|
slouken@5389
|
231 |
vpixel = (vector unsigned short) vec_packpx(vsrc1, vsrc2);
|
slouken@5389
|
232 |
vgpixel = (vector unsigned short) vec_perm(vsrc1, vsrc2, vgmerge);
|
slouken@5389
|
233 |
vgpixel = vec_and(vgpixel, vfc);
|
slouken@5389
|
234 |
vgpixel = vec_sl(vgpixel, v3);
|
slouken@5389
|
235 |
vrpixel = vec_sl(vpixel, v1);
|
slouken@5389
|
236 |
vrpixel = vec_and(vrpixel, vf800);
|
slouken@5389
|
237 |
vbpixel = vec_and(vpixel, v3f);
|
slouken@5389
|
238 |
vdst =
|
slouken@5389
|
239 |
vec_or((vector unsigned char) vrpixel,
|
slouken@5389
|
240 |
(vector unsigned char) vgpixel);
|
slouken@5389
|
241 |
/* 565 */
|
slouken@5389
|
242 |
vdst = vec_or(vdst, (vector unsigned char) vbpixel);
|
slouken@5389
|
243 |
vec_st(vdst, 0, dst);
|
slouken@5389
|
244 |
|
slouken@5389
|
245 |
width -= 8;
|
slouken@5389
|
246 |
src += 16;
|
slouken@5389
|
247 |
dst += 16;
|
slouken@5389
|
248 |
vsrc = voverflow;
|
slouken@5389
|
249 |
}
|
slouken@5389
|
250 |
|
icculus@6281
|
251 |
SDL_assert(width == 0);
|
slouken@5389
|
252 |
|
slouken@5389
|
253 |
/* do scalar until we can align... */
|
slouken@5389
|
254 |
ONE_PIXEL_BLEND((extrawidth), extrawidth);
|
slouken@5389
|
255 |
#undef ONE_PIXEL_BLEND
|
slouken@5389
|
256 |
|
slouken@5389
|
257 |
src += srcskip; /* move to next row, accounting for pitch. */
|
slouken@5389
|
258 |
dst += dstskip;
|
slouken@5389
|
259 |
}
|
slouken@5389
|
260 |
|
slouken@5389
|
261 |
|
slouken@5389
|
262 |
}
|
slouken@5389
|
263 |
|
slouken@5389
|
264 |
static void
|
slouken@5389
|
265 |
Blit_RGB565_32Altivec(SDL_BlitInfo * info)
|
slouken@5389
|
266 |
{
|
slouken@5389
|
267 |
int height = info->dst_h;
|
slouken@5389
|
268 |
Uint8 *src = (Uint8 *) info->src;
|
slouken@5389
|
269 |
int srcskip = info->src_skip;
|
slouken@5389
|
270 |
Uint8 *dst = (Uint8 *) info->dst;
|
slouken@5389
|
271 |
int dstskip = info->dst_skip;
|
slouken@5389
|
272 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
273 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@5389
|
274 |
unsigned alpha;
|
slouken@5389
|
275 |
vector unsigned char valpha;
|
slouken@5389
|
276 |
vector unsigned char vpermute;
|
slouken@5389
|
277 |
vector unsigned short vf800;
|
slouken@5389
|
278 |
vector unsigned int v8 = vec_splat_u32(8);
|
slouken@5389
|
279 |
vector unsigned int v16 = vec_add(v8, v8);
|
slouken@5389
|
280 |
vector unsigned short v2 = vec_splat_u16(2);
|
slouken@5389
|
281 |
vector unsigned short v3 = vec_splat_u16(3);
|
slouken@7208
|
282 |
/*
|
slouken@5389
|
283 |
0x10 - 0x1f is the alpha
|
slouken@5389
|
284 |
0x00 - 0x0e evens are the red
|
slouken@5389
|
285 |
0x01 - 0x0f odds are zero
|
slouken@5389
|
286 |
*/
|
slouken@5389
|
287 |
vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01,
|
slouken@5389
|
288 |
0x10, 0x02, 0x01, 0x01,
|
slouken@5389
|
289 |
0x10, 0x04, 0x01, 0x01,
|
slouken@5389
|
290 |
0x10, 0x06, 0x01,
|
slouken@5389
|
291 |
0x01);
|
slouken@5389
|
292 |
vector unsigned char vredalpha2 =
|
slouken@5389
|
293 |
(vector unsigned
|
slouken@5389
|
294 |
char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16))
|
slouken@5389
|
295 |
);
|
slouken@5389
|
296 |
/*
|
slouken@5389
|
297 |
0x00 - 0x0f is ARxx ARxx ARxx ARxx
|
slouken@5389
|
298 |
0x11 - 0x0f odds are blue
|
slouken@5389
|
299 |
*/
|
slouken@5389
|
300 |
vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11,
|
slouken@5389
|
301 |
0x04, 0x05, 0x06, 0x13,
|
slouken@5389
|
302 |
0x08, 0x09, 0x0a, 0x15,
|
slouken@5389
|
303 |
0x0c, 0x0d, 0x0e, 0x17);
|
slouken@5389
|
304 |
vector unsigned char vblue2 =
|
slouken@5389
|
305 |
(vector unsigned char) (vec_add((vector unsigned int) vblue1, v8)
|
slouken@5389
|
306 |
);
|
slouken@5389
|
307 |
/*
|
slouken@5389
|
308 |
0x00 - 0x0f is ARxB ARxB ARxB ARxB
|
slouken@5389
|
309 |
0x10 - 0x0e evens are green
|
slouken@5389
|
310 |
*/
|
slouken@5389
|
311 |
vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03,
|
slouken@5389
|
312 |
0x04, 0x05, 0x12, 0x07,
|
slouken@5389
|
313 |
0x08, 0x09, 0x14, 0x0b,
|
slouken@5389
|
314 |
0x0c, 0x0d, 0x16, 0x0f);
|
slouken@5389
|
315 |
vector unsigned char vgreen2 =
|
slouken@5389
|
316 |
(vector unsigned
|
slouken@5389
|
317 |
char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8))
|
slouken@5389
|
318 |
);
|
slouken@5389
|
319 |
|
icculus@6281
|
320 |
SDL_assert(srcfmt->BytesPerPixel == 2);
|
icculus@6281
|
321 |
SDL_assert(dstfmt->BytesPerPixel == 4);
|
slouken@5389
|
322 |
|
slouken@5389
|
323 |
vf800 = (vector unsigned short) vec_splat_u8(-7);
|
slouken@5389
|
324 |
vf800 = vec_sl(vf800, vec_splat_u16(8));
|
slouken@5389
|
325 |
|
slouken@5389
|
326 |
if (dstfmt->Amask && info->a) {
|
slouken@5389
|
327 |
((unsigned char *) &valpha)[0] = alpha = info->a;
|
slouken@5389
|
328 |
valpha = vec_splat(valpha, 0);
|
slouken@5389
|
329 |
} else {
|
slouken@5389
|
330 |
alpha = 0;
|
slouken@5389
|
331 |
valpha = vec_splat_u8(0);
|
slouken@5389
|
332 |
}
|
slouken@5389
|
333 |
|
slouken@5389
|
334 |
vpermute = calc_swizzle32(NULL, dstfmt);
|
slouken@5389
|
335 |
while (height--) {
|
slouken@5389
|
336 |
vector unsigned char valigner;
|
slouken@5389
|
337 |
vector unsigned char voverflow;
|
slouken@5389
|
338 |
vector unsigned char vsrc;
|
slouken@5389
|
339 |
|
slouken@5389
|
340 |
int width = info->dst_w;
|
slouken@5389
|
341 |
int extrawidth;
|
slouken@5389
|
342 |
|
slouken@5389
|
343 |
/* do scalar until we can align... */
|
slouken@5389
|
344 |
#define ONE_PIXEL_BLEND(condition, widthvar) \
|
slouken@5389
|
345 |
while (condition) { \
|
slouken@5389
|
346 |
unsigned sR, sG, sB; \
|
slouken@5389
|
347 |
unsigned short Pixel = *((unsigned short *)src); \
|
slouken@5389
|
348 |
sR = (Pixel >> 8) & 0xf8; \
|
slouken@5389
|
349 |
sG = (Pixel >> 3) & 0xfc; \
|
slouken@5389
|
350 |
sB = (Pixel << 3) & 0xf8; \
|
slouken@5389
|
351 |
ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \
|
slouken@5389
|
352 |
src += 2; \
|
slouken@5389
|
353 |
dst += 4; \
|
slouken@5389
|
354 |
widthvar--; \
|
slouken@5389
|
355 |
}
|
slouken@5389
|
356 |
ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);
|
slouken@5389
|
357 |
|
slouken@5389
|
358 |
/* After all that work, here's the vector part! */
|
slouken@5389
|
359 |
extrawidth = (width % 8); /* trailing unaligned stores */
|
slouken@5389
|
360 |
width -= extrawidth;
|
slouken@5389
|
361 |
vsrc = vec_ld(0, src);
|
slouken@5389
|
362 |
valigner = VEC_ALIGNER(src);
|
slouken@5389
|
363 |
|
slouken@5389
|
364 |
while (width) {
|
slouken@5389
|
365 |
vector unsigned short vR, vG, vB;
|
slouken@5389
|
366 |
vector unsigned char vdst1, vdst2;
|
slouken@5389
|
367 |
|
slouken@5389
|
368 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
369 |
vsrc = vec_perm(vsrc, voverflow, valigner);
|
slouken@5389
|
370 |
|
slouken@5389
|
371 |
vR = vec_and((vector unsigned short) vsrc, vf800);
|
slouken@5389
|
372 |
vB = vec_sl((vector unsigned short) vsrc, v3);
|
slouken@5389
|
373 |
vG = vec_sl(vB, v2);
|
slouken@5389
|
374 |
|
slouken@5389
|
375 |
vdst1 =
|
slouken@5389
|
376 |
(vector unsigned char) vec_perm((vector unsigned char) vR,
|
slouken@5389
|
377 |
valpha, vredalpha1);
|
slouken@5389
|
378 |
vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1);
|
slouken@5389
|
379 |
vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1);
|
slouken@5389
|
380 |
vdst1 = vec_perm(vdst1, valpha, vpermute);
|
slouken@5389
|
381 |
vec_st(vdst1, 0, dst);
|
slouken@5389
|
382 |
|
slouken@5389
|
383 |
vdst2 =
|
slouken@5389
|
384 |
(vector unsigned char) vec_perm((vector unsigned char) vR,
|
slouken@5389
|
385 |
valpha, vredalpha2);
|
slouken@5389
|
386 |
vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2);
|
slouken@5389
|
387 |
vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2);
|
slouken@5389
|
388 |
vdst2 = vec_perm(vdst2, valpha, vpermute);
|
slouken@5389
|
389 |
vec_st(vdst2, 16, dst);
|
slouken@5389
|
390 |
|
slouken@5389
|
391 |
width -= 8;
|
slouken@5389
|
392 |
dst += 32;
|
slouken@5389
|
393 |
src += 16;
|
slouken@5389
|
394 |
vsrc = voverflow;
|
slouken@5389
|
395 |
}
|
slouken@5389
|
396 |
|
icculus@6281
|
397 |
SDL_assert(width == 0);
|
slouken@5389
|
398 |
|
slouken@5389
|
399 |
|
slouken@5389
|
400 |
/* do scalar until we can align... */
|
slouken@5389
|
401 |
ONE_PIXEL_BLEND((extrawidth), extrawidth);
|
slouken@5389
|
402 |
#undef ONE_PIXEL_BLEND
|
slouken@5389
|
403 |
|
slouken@5389
|
404 |
src += srcskip; /* move to next row, accounting for pitch. */
|
slouken@5389
|
405 |
dst += dstskip;
|
slouken@5389
|
406 |
}
|
slouken@5389
|
407 |
|
slouken@5389
|
408 |
}
|
slouken@5389
|
409 |
|
slouken@5389
|
410 |
|
slouken@5389
|
411 |
static void
|
slouken@5389
|
412 |
Blit_RGB555_32Altivec(SDL_BlitInfo * info)
|
slouken@5389
|
413 |
{
|
slouken@5389
|
414 |
int height = info->dst_h;
|
slouken@5389
|
415 |
Uint8 *src = (Uint8 *) info->src;
|
slouken@5389
|
416 |
int srcskip = info->src_skip;
|
slouken@5389
|
417 |
Uint8 *dst = (Uint8 *) info->dst;
|
slouken@5389
|
418 |
int dstskip = info->dst_skip;
|
slouken@5389
|
419 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
420 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@5389
|
421 |
unsigned alpha;
|
slouken@5389
|
422 |
vector unsigned char valpha;
|
slouken@5389
|
423 |
vector unsigned char vpermute;
|
slouken@5389
|
424 |
vector unsigned short vf800;
|
slouken@5389
|
425 |
vector unsigned int v8 = vec_splat_u32(8);
|
slouken@5389
|
426 |
vector unsigned int v16 = vec_add(v8, v8);
|
slouken@5389
|
427 |
vector unsigned short v1 = vec_splat_u16(1);
|
slouken@5389
|
428 |
vector unsigned short v3 = vec_splat_u16(3);
|
slouken@7208
|
429 |
/*
|
slouken@5389
|
430 |
0x10 - 0x1f is the alpha
|
slouken@5389
|
431 |
0x00 - 0x0e evens are the red
|
slouken@5389
|
432 |
0x01 - 0x0f odds are zero
|
slouken@5389
|
433 |
*/
|
slouken@5389
|
434 |
vector unsigned char vredalpha1 = VECUINT8_LITERAL(0x10, 0x00, 0x01, 0x01,
|
slouken@5389
|
435 |
0x10, 0x02, 0x01, 0x01,
|
slouken@5389
|
436 |
0x10, 0x04, 0x01, 0x01,
|
slouken@5389
|
437 |
0x10, 0x06, 0x01,
|
slouken@5389
|
438 |
0x01);
|
slouken@5389
|
439 |
vector unsigned char vredalpha2 =
|
slouken@5389
|
440 |
(vector unsigned
|
slouken@5389
|
441 |
char) (vec_add((vector unsigned int) vredalpha1, vec_sl(v8, v16))
|
slouken@5389
|
442 |
);
|
slouken@5389
|
443 |
/*
|
slouken@5389
|
444 |
0x00 - 0x0f is ARxx ARxx ARxx ARxx
|
slouken@5389
|
445 |
0x11 - 0x0f odds are blue
|
slouken@5389
|
446 |
*/
|
slouken@5389
|
447 |
vector unsigned char vblue1 = VECUINT8_LITERAL(0x00, 0x01, 0x02, 0x11,
|
slouken@5389
|
448 |
0x04, 0x05, 0x06, 0x13,
|
slouken@5389
|
449 |
0x08, 0x09, 0x0a, 0x15,
|
slouken@5389
|
450 |
0x0c, 0x0d, 0x0e, 0x17);
|
slouken@5389
|
451 |
vector unsigned char vblue2 =
|
slouken@5389
|
452 |
(vector unsigned char) (vec_add((vector unsigned int) vblue1, v8)
|
slouken@5389
|
453 |
);
|
slouken@5389
|
454 |
/*
|
slouken@5389
|
455 |
0x00 - 0x0f is ARxB ARxB ARxB ARxB
|
slouken@5389
|
456 |
0x10 - 0x0e evens are green
|
slouken@5389
|
457 |
*/
|
slouken@5389
|
458 |
vector unsigned char vgreen1 = VECUINT8_LITERAL(0x00, 0x01, 0x10, 0x03,
|
slouken@5389
|
459 |
0x04, 0x05, 0x12, 0x07,
|
slouken@5389
|
460 |
0x08, 0x09, 0x14, 0x0b,
|
slouken@5389
|
461 |
0x0c, 0x0d, 0x16, 0x0f);
|
slouken@5389
|
462 |
vector unsigned char vgreen2 =
|
slouken@5389
|
463 |
(vector unsigned
|
slouken@5389
|
464 |
char) (vec_add((vector unsigned int) vgreen1, vec_sl(v8, v8))
|
slouken@5389
|
465 |
);
|
slouken@5389
|
466 |
|
icculus@6281
|
467 |
SDL_assert(srcfmt->BytesPerPixel == 2);
|
icculus@6281
|
468 |
SDL_assert(dstfmt->BytesPerPixel == 4);
|
slouken@5389
|
469 |
|
slouken@5389
|
470 |
vf800 = (vector unsigned short) vec_splat_u8(-7);
|
slouken@5389
|
471 |
vf800 = vec_sl(vf800, vec_splat_u16(8));
|
slouken@5389
|
472 |
|
slouken@5389
|
473 |
if (dstfmt->Amask && info->a) {
|
slouken@5389
|
474 |
((unsigned char *) &valpha)[0] = alpha = info->a;
|
slouken@5389
|
475 |
valpha = vec_splat(valpha, 0);
|
slouken@5389
|
476 |
} else {
|
slouken@5389
|
477 |
alpha = 0;
|
slouken@5389
|
478 |
valpha = vec_splat_u8(0);
|
slouken@5389
|
479 |
}
|
slouken@5389
|
480 |
|
slouken@5389
|
481 |
vpermute = calc_swizzle32(NULL, dstfmt);
|
slouken@5389
|
482 |
while (height--) {
|
slouken@5389
|
483 |
vector unsigned char valigner;
|
slouken@5389
|
484 |
vector unsigned char voverflow;
|
slouken@5389
|
485 |
vector unsigned char vsrc;
|
slouken@5389
|
486 |
|
slouken@5389
|
487 |
int width = info->dst_w;
|
slouken@5389
|
488 |
int extrawidth;
|
slouken@5389
|
489 |
|
slouken@5389
|
490 |
/* do scalar until we can align... */
|
slouken@5389
|
491 |
#define ONE_PIXEL_BLEND(condition, widthvar) \
|
slouken@5389
|
492 |
while (condition) { \
|
slouken@5389
|
493 |
unsigned sR, sG, sB; \
|
slouken@5389
|
494 |
unsigned short Pixel = *((unsigned short *)src); \
|
slouken@5389
|
495 |
sR = (Pixel >> 7) & 0xf8; \
|
slouken@5389
|
496 |
sG = (Pixel >> 2) & 0xf8; \
|
slouken@5389
|
497 |
sB = (Pixel << 3) & 0xf8; \
|
slouken@5389
|
498 |
ASSEMBLE_RGBA(dst, 4, dstfmt, sR, sG, sB, alpha); \
|
slouken@5389
|
499 |
src += 2; \
|
slouken@5389
|
500 |
dst += 4; \
|
slouken@5389
|
501 |
widthvar--; \
|
slouken@5389
|
502 |
}
|
slouken@5389
|
503 |
ONE_PIXEL_BLEND(((UNALIGNED_PTR(dst)) && (width)), width);
|
slouken@5389
|
504 |
|
slouken@5389
|
505 |
/* After all that work, here's the vector part! */
|
slouken@5389
|
506 |
extrawidth = (width % 8); /* trailing unaligned stores */
|
slouken@5389
|
507 |
width -= extrawidth;
|
slouken@5389
|
508 |
vsrc = vec_ld(0, src);
|
slouken@5389
|
509 |
valigner = VEC_ALIGNER(src);
|
slouken@5389
|
510 |
|
slouken@5389
|
511 |
while (width) {
|
slouken@5389
|
512 |
vector unsigned short vR, vG, vB;
|
slouken@5389
|
513 |
vector unsigned char vdst1, vdst2;
|
slouken@5389
|
514 |
|
slouken@5389
|
515 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
516 |
vsrc = vec_perm(vsrc, voverflow, valigner);
|
slouken@5389
|
517 |
|
slouken@5389
|
518 |
vR = vec_and(vec_sl((vector unsigned short) vsrc, v1), vf800);
|
slouken@5389
|
519 |
vB = vec_sl((vector unsigned short) vsrc, v3);
|
slouken@5389
|
520 |
vG = vec_sl(vB, v3);
|
slouken@5389
|
521 |
|
slouken@5389
|
522 |
vdst1 =
|
slouken@5389
|
523 |
(vector unsigned char) vec_perm((vector unsigned char) vR,
|
slouken@5389
|
524 |
valpha, vredalpha1);
|
slouken@5389
|
525 |
vdst1 = vec_perm(vdst1, (vector unsigned char) vB, vblue1);
|
slouken@5389
|
526 |
vdst1 = vec_perm(vdst1, (vector unsigned char) vG, vgreen1);
|
slouken@5389
|
527 |
vdst1 = vec_perm(vdst1, valpha, vpermute);
|
slouken@5389
|
528 |
vec_st(vdst1, 0, dst);
|
slouken@5389
|
529 |
|
slouken@5389
|
530 |
vdst2 =
|
slouken@5389
|
531 |
(vector unsigned char) vec_perm((vector unsigned char) vR,
|
slouken@5389
|
532 |
valpha, vredalpha2);
|
slouken@5389
|
533 |
vdst2 = vec_perm(vdst2, (vector unsigned char) vB, vblue2);
|
slouken@5389
|
534 |
vdst2 = vec_perm(vdst2, (vector unsigned char) vG, vgreen2);
|
slouken@5389
|
535 |
vdst2 = vec_perm(vdst2, valpha, vpermute);
|
slouken@5389
|
536 |
vec_st(vdst2, 16, dst);
|
slouken@5389
|
537 |
|
slouken@5389
|
538 |
width -= 8;
|
slouken@5389
|
539 |
dst += 32;
|
slouken@5389
|
540 |
src += 16;
|
slouken@5389
|
541 |
vsrc = voverflow;
|
slouken@5389
|
542 |
}
|
slouken@5389
|
543 |
|
icculus@6281
|
544 |
SDL_assert(width == 0);
|
slouken@5389
|
545 |
|
slouken@5389
|
546 |
|
slouken@5389
|
547 |
/* do scalar until we can align... */
|
slouken@5389
|
548 |
ONE_PIXEL_BLEND((extrawidth), extrawidth);
|
slouken@5389
|
549 |
#undef ONE_PIXEL_BLEND
|
slouken@5389
|
550 |
|
slouken@5389
|
551 |
src += srcskip; /* move to next row, accounting for pitch. */
|
slouken@5389
|
552 |
dst += dstskip;
|
slouken@5389
|
553 |
}
|
slouken@5389
|
554 |
|
slouken@5389
|
555 |
}
|
slouken@5389
|
556 |
|
slouken@5389
|
557 |
static void BlitNtoNKey(SDL_BlitInfo * info);
|
slouken@5389
|
558 |
static void BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info);
|
slouken@5389
|
559 |
static void
|
slouken@5389
|
560 |
Blit32to32KeyAltivec(SDL_BlitInfo * info)
|
slouken@5389
|
561 |
{
|
slouken@5389
|
562 |
int height = info->dst_h;
|
slouken@5389
|
563 |
Uint32 *srcp = (Uint32 *) info->src;
|
slouken@5389
|
564 |
int srcskip = info->src_skip / 4;
|
slouken@5389
|
565 |
Uint32 *dstp = (Uint32 *) info->dst;
|
slouken@5389
|
566 |
int dstskip = info->dst_skip / 4;
|
slouken@5389
|
567 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
568 |
int srcbpp = srcfmt->BytesPerPixel;
|
slouken@5389
|
569 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@5389
|
570 |
int dstbpp = dstfmt->BytesPerPixel;
|
slouken@5389
|
571 |
int copy_alpha = (srcfmt->Amask && dstfmt->Amask);
|
slouken@5389
|
572 |
unsigned alpha = dstfmt->Amask ? info->a : 0;
|
slouken@5389
|
573 |
Uint32 rgbmask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;
|
slouken@5389
|
574 |
Uint32 ckey = info->colorkey;
|
slouken@5389
|
575 |
vector unsigned int valpha;
|
slouken@5389
|
576 |
vector unsigned char vpermute;
|
slouken@5389
|
577 |
vector unsigned char vzero;
|
slouken@5389
|
578 |
vector unsigned int vckey;
|
slouken@5389
|
579 |
vector unsigned int vrgbmask;
|
slouken@5389
|
580 |
vpermute = calc_swizzle32(srcfmt, dstfmt);
|
slouken@5389
|
581 |
if (info->dst_w < 16) {
|
slouken@5389
|
582 |
if (copy_alpha) {
|
slouken@5389
|
583 |
BlitNtoNKeyCopyAlpha(info);
|
slouken@5389
|
584 |
} else {
|
slouken@5389
|
585 |
BlitNtoNKey(info);
|
slouken@5389
|
586 |
}
|
slouken@5389
|
587 |
return;
|
slouken@5389
|
588 |
}
|
slouken@5389
|
589 |
vzero = vec_splat_u8(0);
|
slouken@5389
|
590 |
if (alpha) {
|
slouken@5389
|
591 |
((unsigned char *) &valpha)[0] = (unsigned char) alpha;
|
slouken@5389
|
592 |
valpha =
|
slouken@5389
|
593 |
(vector unsigned int) vec_splat((vector unsigned char) valpha, 0);
|
slouken@5389
|
594 |
} else {
|
slouken@5389
|
595 |
valpha = (vector unsigned int) vzero;
|
slouken@5389
|
596 |
}
|
slouken@5389
|
597 |
ckey &= rgbmask;
|
slouken@5389
|
598 |
((unsigned int *) (char *) &vckey)[0] = ckey;
|
slouken@5389
|
599 |
vckey = vec_splat(vckey, 0);
|
slouken@5389
|
600 |
((unsigned int *) (char *) &vrgbmask)[0] = rgbmask;
|
slouken@5389
|
601 |
vrgbmask = vec_splat(vrgbmask, 0);
|
slouken@5389
|
602 |
|
slouken@5389
|
603 |
while (height--) {
|
slouken@5389
|
604 |
#define ONE_PIXEL_BLEND(condition, widthvar) \
|
slouken@5389
|
605 |
if (copy_alpha) { \
|
slouken@5389
|
606 |
while (condition) { \
|
slouken@5389
|
607 |
Uint32 Pixel; \
|
slouken@5389
|
608 |
unsigned sR, sG, sB, sA; \
|
slouken@5389
|
609 |
DISEMBLE_RGBA((Uint8 *)srcp, srcbpp, srcfmt, Pixel, \
|
slouken@5389
|
610 |
sR, sG, sB, sA); \
|
slouken@5389
|
611 |
if ( (Pixel & rgbmask) != ckey ) { \
|
slouken@5389
|
612 |
ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \
|
slouken@5389
|
613 |
sR, sG, sB, sA); \
|
slouken@5389
|
614 |
} \
|
slouken@5389
|
615 |
dstp = (Uint32 *) (((Uint8 *) dstp) + dstbpp); \
|
slouken@5389
|
616 |
srcp = (Uint32 *) (((Uint8 *) srcp) + srcbpp); \
|
slouken@5389
|
617 |
widthvar--; \
|
slouken@5389
|
618 |
} \
|
slouken@5389
|
619 |
} else { \
|
slouken@5389
|
620 |
while (condition) { \
|
slouken@5389
|
621 |
Uint32 Pixel; \
|
slouken@5389
|
622 |
unsigned sR, sG, sB; \
|
slouken@5389
|
623 |
RETRIEVE_RGB_PIXEL((Uint8 *)srcp, srcbpp, Pixel); \
|
slouken@5389
|
624 |
if ( Pixel != ckey ) { \
|
slouken@5389
|
625 |
RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB); \
|
slouken@5389
|
626 |
ASSEMBLE_RGBA((Uint8 *)dstp, dstbpp, dstfmt, \
|
slouken@5389
|
627 |
sR, sG, sB, alpha); \
|
slouken@5389
|
628 |
} \
|
slouken@5389
|
629 |
dstp = (Uint32 *) (((Uint8 *)dstp) + dstbpp); \
|
slouken@5389
|
630 |
srcp = (Uint32 *) (((Uint8 *)srcp) + srcbpp); \
|
slouken@5389
|
631 |
widthvar--; \
|
slouken@5389
|
632 |
} \
|
slouken@5389
|
633 |
}
|
slouken@5389
|
634 |
int width = info->dst_w;
|
slouken@5389
|
635 |
ONE_PIXEL_BLEND((UNALIGNED_PTR(dstp)) && (width), width);
|
icculus@6281
|
636 |
SDL_assert(width > 0);
|
slouken@5389
|
637 |
if (width > 0) {
|
slouken@5389
|
638 |
int extrawidth = (width % 4);
|
slouken@5389
|
639 |
vector unsigned char valigner = VEC_ALIGNER(srcp);
|
slouken@5389
|
640 |
vector unsigned int vs = vec_ld(0, srcp);
|
slouken@5389
|
641 |
width -= extrawidth;
|
icculus@6281
|
642 |
SDL_assert(width >= 4);
|
slouken@5389
|
643 |
while (width) {
|
slouken@5389
|
644 |
vector unsigned char vsel;
|
slouken@5389
|
645 |
vector unsigned int vd;
|
slouken@5389
|
646 |
vector unsigned int voverflow = vec_ld(15, srcp);
|
slouken@5389
|
647 |
/* load the source vec */
|
slouken@5389
|
648 |
vs = vec_perm(vs, voverflow, valigner);
|
slouken@5389
|
649 |
/* vsel is set for items that match the key */
|
slouken@5389
|
650 |
vsel = (vector unsigned char) vec_and(vs, vrgbmask);
|
slouken@5389
|
651 |
vsel = (vector unsigned char) vec_cmpeq(vs, vckey);
|
slouken@5389
|
652 |
/* permute the src vec to the dest format */
|
slouken@5389
|
653 |
vs = vec_perm(vs, valpha, vpermute);
|
slouken@5389
|
654 |
/* load the destination vec */
|
slouken@5389
|
655 |
vd = vec_ld(0, dstp);
|
slouken@5389
|
656 |
/* select the source and dest into vs */
|
slouken@5389
|
657 |
vd = (vector unsigned int) vec_sel((vector unsigned char) vs,
|
slouken@5389
|
658 |
(vector unsigned char) vd,
|
slouken@5389
|
659 |
vsel);
|
slouken@5389
|
660 |
|
slouken@5389
|
661 |
vec_st(vd, 0, dstp);
|
slouken@5389
|
662 |
srcp += 4;
|
slouken@5389
|
663 |
width -= 4;
|
slouken@5389
|
664 |
dstp += 4;
|
slouken@5389
|
665 |
vs = voverflow;
|
slouken@5389
|
666 |
}
|
slouken@5389
|
667 |
ONE_PIXEL_BLEND((extrawidth), extrawidth);
|
slouken@5389
|
668 |
#undef ONE_PIXEL_BLEND
|
slouken@5389
|
669 |
srcp += srcskip;
|
slouken@5389
|
670 |
dstp += dstskip;
|
slouken@5389
|
671 |
}
|
slouken@5389
|
672 |
}
|
slouken@5389
|
673 |
}
|
slouken@5389
|
674 |
|
slouken@5389
|
675 |
/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */
|
slouken@5389
|
676 |
/* Use this on a G5 */
|
slouken@5389
|
677 |
static void
|
slouken@5389
|
678 |
ConvertAltivec32to32_noprefetch(SDL_BlitInfo * info)
|
slouken@5389
|
679 |
{
|
slouken@5389
|
680 |
int height = info->dst_h;
|
slouken@5389
|
681 |
Uint32 *src = (Uint32 *) info->src;
|
slouken@5389
|
682 |
int srcskip = info->src_skip / 4;
|
slouken@5389
|
683 |
Uint32 *dst = (Uint32 *) info->dst;
|
slouken@5389
|
684 |
int dstskip = info->dst_skip / 4;
|
slouken@5389
|
685 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
686 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@5389
|
687 |
vector unsigned int vzero = vec_splat_u32(0);
|
slouken@5389
|
688 |
vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);
|
slouken@5389
|
689 |
if (dstfmt->Amask && !srcfmt->Amask) {
|
slouken@5389
|
690 |
if (info->a) {
|
slouken@5389
|
691 |
vector unsigned char valpha;
|
slouken@5389
|
692 |
((unsigned char *) &valpha)[0] = info->a;
|
slouken@5389
|
693 |
vzero = (vector unsigned int) vec_splat(valpha, 0);
|
slouken@5389
|
694 |
}
|
slouken@5389
|
695 |
}
|
slouken@5389
|
696 |
|
icculus@6281
|
697 |
SDL_assert(srcfmt->BytesPerPixel == 4);
|
icculus@6281
|
698 |
SDL_assert(dstfmt->BytesPerPixel == 4);
|
slouken@5389
|
699 |
|
slouken@5389
|
700 |
while (height--) {
|
slouken@5389
|
701 |
vector unsigned char valigner;
|
slouken@5389
|
702 |
vector unsigned int vbits;
|
slouken@5389
|
703 |
vector unsigned int voverflow;
|
slouken@5389
|
704 |
Uint32 bits;
|
slouken@5389
|
705 |
Uint8 r, g, b, a;
|
slouken@5389
|
706 |
|
slouken@5389
|
707 |
int width = info->dst_w;
|
slouken@5389
|
708 |
int extrawidth;
|
slouken@5389
|
709 |
|
slouken@5389
|
710 |
/* do scalar until we can align... */
|
slouken@5389
|
711 |
while ((UNALIGNED_PTR(dst)) && (width)) {
|
slouken@5389
|
712 |
bits = *(src++);
|
slouken@5389
|
713 |
RGBA_FROM_8888(bits, srcfmt, r, g, b, a);
|
slouken@6295
|
714 |
if(!srcfmt->Amask)
|
slouken@6304
|
715 |
a = info->a;
|
slouken@5389
|
716 |
*(dst++) = MAKE8888(dstfmt, r, g, b, a);
|
slouken@5389
|
717 |
width--;
|
slouken@5389
|
718 |
}
|
slouken@5389
|
719 |
|
slouken@5389
|
720 |
/* After all that work, here's the vector part! */
|
slouken@5389
|
721 |
extrawidth = (width % 4);
|
slouken@5389
|
722 |
width -= extrawidth;
|
slouken@5389
|
723 |
valigner = VEC_ALIGNER(src);
|
slouken@5389
|
724 |
vbits = vec_ld(0, src);
|
slouken@5389
|
725 |
|
slouken@5389
|
726 |
while (width) {
|
slouken@5389
|
727 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
728 |
src += 4;
|
slouken@5389
|
729 |
width -= 4;
|
slouken@5389
|
730 |
vbits = vec_perm(vbits, voverflow, valigner); /* src is ready. */
|
slouken@5389
|
731 |
vbits = vec_perm(vbits, vzero, vpermute); /* swizzle it. */
|
slouken@5389
|
732 |
vec_st(vbits, 0, dst); /* store it back out. */
|
slouken@5389
|
733 |
dst += 4;
|
slouken@5389
|
734 |
vbits = voverflow;
|
slouken@5389
|
735 |
}
|
slouken@5389
|
736 |
|
icculus@6281
|
737 |
SDL_assert(width == 0);
|
slouken@5389
|
738 |
|
slouken@5389
|
739 |
/* cover pixels at the end of the row that didn't fit in 16 bytes. */
|
slouken@5389
|
740 |
while (extrawidth) {
|
slouken@5389
|
741 |
bits = *(src++); /* max 7 pixels, don't bother with prefetch. */
|
slouken@5389
|
742 |
RGBA_FROM_8888(bits, srcfmt, r, g, b, a);
|
slouken@6295
|
743 |
if(!srcfmt->Amask)
|
slouken@6304
|
744 |
a = info->a;
|
slouken@5389
|
745 |
*(dst++) = MAKE8888(dstfmt, r, g, b, a);
|
slouken@5389
|
746 |
extrawidth--;
|
slouken@5389
|
747 |
}
|
slouken@5389
|
748 |
|
slouken@5389
|
749 |
src += srcskip;
|
slouken@5389
|
750 |
dst += dstskip;
|
slouken@5389
|
751 |
}
|
slouken@5389
|
752 |
|
slouken@5389
|
753 |
}
|
slouken@5389
|
754 |
|
slouken@5389
|
755 |
/* Altivec code to swizzle one 32-bit surface to a different 32-bit format. */
|
slouken@5389
|
756 |
/* Use this on a G4 */
|
slouken@5389
|
757 |
static void
|
slouken@5389
|
758 |
ConvertAltivec32to32_prefetch(SDL_BlitInfo * info)
|
slouken@5389
|
759 |
{
|
slouken@5389
|
760 |
const int scalar_dst_lead = sizeof(Uint32) * 4;
|
slouken@5389
|
761 |
const int vector_dst_lead = sizeof(Uint32) * 16;
|
slouken@5389
|
762 |
|
slouken@5389
|
763 |
int height = info->dst_h;
|
slouken@5389
|
764 |
Uint32 *src = (Uint32 *) info->src;
|
slouken@5389
|
765 |
int srcskip = info->src_skip / 4;
|
slouken@5389
|
766 |
Uint32 *dst = (Uint32 *) info->dst;
|
slouken@5389
|
767 |
int dstskip = info->dst_skip / 4;
|
slouken@5389
|
768 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@5389
|
769 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@5389
|
770 |
vector unsigned int vzero = vec_splat_u32(0);
|
slouken@5389
|
771 |
vector unsigned char vpermute = calc_swizzle32(srcfmt, dstfmt);
|
slouken@5389
|
772 |
if (dstfmt->Amask && !srcfmt->Amask) {
|
slouken@5389
|
773 |
if (info->a) {
|
slouken@5389
|
774 |
vector unsigned char valpha;
|
slouken@5389
|
775 |
((unsigned char *) &valpha)[0] = info->a;
|
slouken@5389
|
776 |
vzero = (vector unsigned int) vec_splat(valpha, 0);
|
slouken@5389
|
777 |
}
|
slouken@5389
|
778 |
}
|
slouken@5389
|
779 |
|
icculus@6281
|
780 |
SDL_assert(srcfmt->BytesPerPixel == 4);
|
icculus@6281
|
781 |
SDL_assert(dstfmt->BytesPerPixel == 4);
|
slouken@5389
|
782 |
|
slouken@5389
|
783 |
while (height--) {
|
slouken@5389
|
784 |
vector unsigned char valigner;
|
slouken@5389
|
785 |
vector unsigned int vbits;
|
slouken@5389
|
786 |
vector unsigned int voverflow;
|
slouken@5389
|
787 |
Uint32 bits;
|
slouken@5389
|
788 |
Uint8 r, g, b, a;
|
slouken@5389
|
789 |
|
slouken@5389
|
790 |
int width = info->dst_w;
|
slouken@5389
|
791 |
int extrawidth;
|
slouken@5389
|
792 |
|
slouken@5389
|
793 |
/* do scalar until we can align... */
|
slouken@5389
|
794 |
while ((UNALIGNED_PTR(dst)) && (width)) {
|
slouken@5389
|
795 |
vec_dstt(src + scalar_dst_lead, DST_CTRL(2, 32, 1024),
|
slouken@5389
|
796 |
DST_CHAN_SRC);
|
slouken@5389
|
797 |
vec_dstst(dst + scalar_dst_lead, DST_CTRL(2, 32, 1024),
|
slouken@5389
|
798 |
DST_CHAN_DEST);
|
slouken@5389
|
799 |
bits = *(src++);
|
slouken@5389
|
800 |
RGBA_FROM_8888(bits, srcfmt, r, g, b, a);
|
slouken@6295
|
801 |
if(!srcfmt->Amask)
|
slouken@6304
|
802 |
a = info->a;
|
slouken@5389
|
803 |
*(dst++) = MAKE8888(dstfmt, r, g, b, a);
|
slouken@5389
|
804 |
width--;
|
slouken@5389
|
805 |
}
|
slouken@5389
|
806 |
|
slouken@5389
|
807 |
/* After all that work, here's the vector part! */
|
slouken@5389
|
808 |
extrawidth = (width % 4);
|
slouken@5389
|
809 |
width -= extrawidth;
|
slouken@5389
|
810 |
valigner = VEC_ALIGNER(src);
|
slouken@5389
|
811 |
vbits = vec_ld(0, src);
|
slouken@5389
|
812 |
|
slouken@5389
|
813 |
while (width) {
|
slouken@5389
|
814 |
vec_dstt(src + vector_dst_lead, DST_CTRL(2, 32, 1024),
|
slouken@5389
|
815 |
DST_CHAN_SRC);
|
slouken@5389
|
816 |
vec_dstst(dst + vector_dst_lead, DST_CTRL(2, 32, 1024),
|
slouken@5389
|
817 |
DST_CHAN_DEST);
|
slouken@5389
|
818 |
voverflow = vec_ld(15, src);
|
slouken@5389
|
819 |
src += 4;
|
slouken@5389
|
820 |
width -= 4;
|
slouken@5389
|
821 |
vbits = vec_perm(vbits, voverflow, valigner); /* src is ready. */
|
slouken@5389
|
822 |
vbits = vec_perm(vbits, vzero, vpermute); /* swizzle it. */
|
slouken@5389
|
823 |
vec_st(vbits, 0, dst); /* store it back out. */
|
slouken@5389
|
824 |
dst += 4;
|
slouken@5389
|
825 |
vbits = voverflow;
|
slouken@5389
|
826 |
}
|
slouken@5389
|
827 |
|
icculus@6281
|
828 |
SDL_assert(width == 0);
|
slouken@5389
|
829 |
|
slouken@5389
|
830 |
/* cover pixels at the end of the row that didn't fit in 16 bytes. */
|
slouken@5389
|
831 |
while (extrawidth) {
|
slouken@5389
|
832 |
bits = *(src++); /* max 7 pixels, don't bother with prefetch. */
|
slouken@5389
|
833 |
RGBA_FROM_8888(bits, srcfmt, r, g, b, a);
|
slouken@6295
|
834 |
if(!srcfmt->Amask)
|
slouken@6304
|
835 |
a = info->a;
|
slouken@5389
|
836 |
*(dst++) = MAKE8888(dstfmt, r, g, b, a);
|
slouken@5389
|
837 |
extrawidth--;
|
slouken@5389
|
838 |
}
|
slouken@5389
|
839 |
|
slouken@5389
|
840 |
src += srcskip;
|
slouken@5389
|
841 |
dst += dstskip;
|
slouken@5389
|
842 |
}
|
slouken@5389
|
843 |
|
slouken@5389
|
844 |
vec_dss(DST_CHAN_SRC);
|
slouken@5389
|
845 |
vec_dss(DST_CHAN_DEST);
|
slouken@5389
|
846 |
}
|
slouken@5389
|
847 |
|
slouken@5389
|
848 |
static Uint32
|
slouken@5389
|
849 |
GetBlitFeatures(void)
|
slouken@5389
|
850 |
{
|
slouken@5389
|
851 |
static Uint32 features = 0xffffffff;
|
slouken@5389
|
852 |
if (features == 0xffffffff) {
|
slouken@5389
|
853 |
/* Provide an override for testing .. */
|
slouken@5389
|
854 |
char *override = SDL_getenv("SDL_ALTIVEC_BLIT_FEATURES");
|
slouken@5389
|
855 |
if (override) {
|
slouken@5389
|
856 |
features = 0;
|
slouken@5389
|
857 |
SDL_sscanf(override, "%u", &features);
|
slouken@5389
|
858 |
} else {
|
slouken@5389
|
859 |
features = (0
|
slouken@5389
|
860 |
/* Feature 1 is has-MMX */
|
slouken@5389
|
861 |
| ((SDL_HasMMX())? 1 : 0)
|
slouken@5389
|
862 |
/* Feature 2 is has-AltiVec */
|
slouken@5389
|
863 |
| ((SDL_HasAltiVec())? 2 : 0)
|
slouken@5389
|
864 |
/* Feature 4 is dont-use-prefetch */
|
slouken@5389
|
865 |
/* !!!! FIXME: Check for G5 or later, not the cache size! Always prefetch on a G4. */
|
slouken@5389
|
866 |
| ((GetL3CacheSize() == 0) ? 4 : 0)
|
slouken@5389
|
867 |
);
|
slouken@5389
|
868 |
}
|
slouken@5389
|
869 |
}
|
slouken@5389
|
870 |
return features;
|
slouken@5389
|
871 |
}
|
slouken@5389
|
872 |
|
slouken@5389
|
873 |
#if __MWERKS__
|
slouken@5389
|
874 |
#pragma altivec_model off
|
slouken@5389
|
875 |
#endif
|
slouken@5389
|
876 |
#else
|
icculus@1047
|
877 |
/* Feature 1 is has-MMX */
|
icculus@1047
|
878 |
#define GetBlitFeatures() ((Uint32)(SDL_HasMMX() ? 1 : 0))
|
slouken@5389
|
879 |
#endif
|
icculus@1047
|
880 |
|
icculus@1053
|
881 |
/* This is now endian dependent */
|
slouken@1443
|
882 |
#if SDL_BYTEORDER == SDL_LIL_ENDIAN
|
slouken@7208
|
883 |
#define HI 1
|
slouken@7208
|
884 |
#define LO 0
|
slouken@1443
|
885 |
#else /* SDL_BYTEORDER == SDL_BIG_ENDIAN */
|
slouken@7208
|
886 |
#define HI 0
|
slouken@7208
|
887 |
#define LO 1
|
icculus@1053
|
888 |
#endif
|
icculus@1053
|
889 |
|
slouken@0
|
890 |
/* Special optimized blit for RGB 8-8-8 --> RGB 3-3-2 */
|
slouken@0
|
891 |
#define RGB888_RGB332(dst, src) { \
|
slouken@7208
|
892 |
dst = (Uint8)((((src)&0x00E00000)>>16)| \
|
slouken@7208
|
893 |
(((src)&0x0000E000)>>11)| \
|
slouken@7208
|
894 |
(((src)&0x000000C0)>>6)); \
|
slouken@0
|
895 |
}
|
slouken@1895
|
896 |
static void
|
slouken@1895
|
897 |
Blit_RGB888_index8(SDL_BlitInfo * info)
|
slouken@0
|
898 |
{
|
slouken@0
|
899 |
#ifndef USE_DUFFS_LOOP
|
slouken@1895
|
900 |
int c;
|
slouken@0
|
901 |
#endif
|
slouken@1895
|
902 |
int width, height;
|
slouken@1895
|
903 |
Uint32 *src;
|
slouken@1895
|
904 |
const Uint8 *map;
|
slouken@1895
|
905 |
Uint8 *dst;
|
slouken@1895
|
906 |
int srcskip, dstskip;
|
slouken@0
|
907 |
|
slouken@1895
|
908 |
/* Set up some basic variables */
|
slouken@2262
|
909 |
width = info->dst_w;
|
slouken@2262
|
910 |
height = info->dst_h;
|
slouken@2262
|
911 |
src = (Uint32 *) info->src;
|
slouken@2267
|
912 |
srcskip = info->src_skip / 4;
|
slouken@2262
|
913 |
dst = info->dst;
|
slouken@2267
|
914 |
dstskip = info->dst_skip;
|
slouken@1895
|
915 |
map = info->table;
|
slouken@0
|
916 |
|
slouken@1895
|
917 |
if (map == NULL) {
|
slouken@1895
|
918 |
while (height--) {
|
slouken@0
|
919 |
#ifdef USE_DUFFS_LOOP
|
slouken@7208
|
920 |
/* *INDENT-OFF* */
|
slouken@7208
|
921 |
DUFFS_LOOP(
|
slouken@7208
|
922 |
RGB888_RGB332(*dst++, *src);
|
slouken@7208
|
923 |
, width);
|
slouken@7208
|
924 |
/* *INDENT-ON* */
|
slouken@0
|
925 |
#else
|
slouken@1895
|
926 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
927 |
/* Pack RGB into 8bit pixel */
|
slouken@1895
|
928 |
++src;
|
slouken@1895
|
929 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
930 |
++src;
|
slouken@1895
|
931 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
932 |
++src;
|
slouken@1895
|
933 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
934 |
++src;
|
slouken@1895
|
935 |
}
|
slouken@1895
|
936 |
switch (width & 3) {
|
slouken@1895
|
937 |
case 3:
|
slouken@1895
|
938 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
939 |
++src;
|
slouken@1895
|
940 |
case 2:
|
slouken@1895
|
941 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
942 |
++src;
|
slouken@1895
|
943 |
case 1:
|
slouken@1895
|
944 |
RGB888_RGB332(*dst++, *src);
|
slouken@1895
|
945 |
++src;
|
slouken@1895
|
946 |
}
|
slouken@0
|
947 |
#endif /* USE_DUFFS_LOOP */
|
slouken@1895
|
948 |
src += srcskip;
|
slouken@1895
|
949 |
dst += dstskip;
|
slouken@1895
|
950 |
}
|
slouken@1895
|
951 |
} else {
|
slouken@1895
|
952 |
int Pixel;
|
slouken@0
|
953 |
|
slouken@1895
|
954 |
while (height--) {
|
slouken@0
|
955 |
#ifdef USE_DUFFS_LOOP
|
slouken@7208
|
956 |
/* *INDENT-OFF* */
|
slouken@7208
|
957 |
DUFFS_LOOP(
|
slouken@7208
|
958 |
RGB888_RGB332(Pixel, *src);
|
slouken@7208
|
959 |
*dst++ = map[Pixel];
|
slouken@7208
|
960 |
++src;
|
slouken@7208
|
961 |
, width);
|
slouken@7208
|
962 |
/* *INDENT-ON* */
|
slouken@0
|
963 |
#else
|
slouken@1895
|
964 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
965 |
/* Pack RGB into 8bit pixel */
|
slouken@1895
|
966 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
967 |
*dst++ = map[Pixel];
|
slouken@1895
|
968 |
++src;
|
slouken@1895
|
969 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
970 |
*dst++ = map[Pixel];
|
slouken@1895
|
971 |
++src;
|
slouken@1895
|
972 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
973 |
*dst++ = map[Pixel];
|
slouken@1895
|
974 |
++src;
|
slouken@1895
|
975 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
976 |
*dst++ = map[Pixel];
|
slouken@1895
|
977 |
++src;
|
slouken@1895
|
978 |
}
|
slouken@1895
|
979 |
switch (width & 3) {
|
slouken@1895
|
980 |
case 3:
|
slouken@1895
|
981 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
982 |
*dst++ = map[Pixel];
|
slouken@1895
|
983 |
++src;
|
slouken@1895
|
984 |
case 2:
|
slouken@1895
|
985 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
986 |
*dst++ = map[Pixel];
|
slouken@1895
|
987 |
++src;
|
slouken@1895
|
988 |
case 1:
|
slouken@1895
|
989 |
RGB888_RGB332(Pixel, *src);
|
slouken@1895
|
990 |
*dst++ = map[Pixel];
|
slouken@1895
|
991 |
++src;
|
slouken@1895
|
992 |
}
|
slouken@0
|
993 |
#endif /* USE_DUFFS_LOOP */
|
slouken@1895
|
994 |
src += srcskip;
|
slouken@1895
|
995 |
dst += dstskip;
|
slouken@1895
|
996 |
}
|
slouken@1895
|
997 |
}
|
slouken@0
|
998 |
}
|
slouken@1895
|
999 |
|
slouken@7372
|
1000 |
/* Special optimized blit for RGB 10-10-10 --> RGB 3-3-2 */
|
slouken@7372
|
1001 |
#define RGB101010_RGB332(dst, src) { \
|
slouken@7372
|
1002 |
dst = (Uint8)((((src)&0x38000000)>>22)| \
|
slouken@7372
|
1003 |
(((src)&0x000E0000)>>15)| \
|
slouken@7372
|
1004 |
(((src)&0x00000300)>>8)); \
|
slouken@7372
|
1005 |
}
|
slouken@7372
|
1006 |
static void
|
slouken@7372
|
1007 |
Blit_RGB101010_index8(SDL_BlitInfo * info)
|
slouken@7372
|
1008 |
{
|
slouken@7372
|
1009 |
#ifndef USE_DUFFS_LOOP
|
slouken@7372
|
1010 |
int c;
|
slouken@7372
|
1011 |
#endif
|
slouken@7372
|
1012 |
int width, height;
|
slouken@7372
|
1013 |
Uint32 *src;
|
slouken@7372
|
1014 |
const Uint8 *map;
|
slouken@7372
|
1015 |
Uint8 *dst;
|
slouken@7372
|
1016 |
int srcskip, dstskip;
|
slouken@7372
|
1017 |
|
slouken@7372
|
1018 |
/* Set up some basic variables */
|
slouken@7372
|
1019 |
width = info->dst_w;
|
slouken@7372
|
1020 |
height = info->dst_h;
|
slouken@7372
|
1021 |
src = (Uint32 *) info->src;
|
slouken@7372
|
1022 |
srcskip = info->src_skip / 4;
|
slouken@7372
|
1023 |
dst = info->dst;
|
slouken@7372
|
1024 |
dstskip = info->dst_skip;
|
slouken@7372
|
1025 |
map = info->table;
|
slouken@7372
|
1026 |
|
slouken@7372
|
1027 |
if (map == NULL) {
|
slouken@7372
|
1028 |
while (height--) {
|
slouken@7372
|
1029 |
#ifdef USE_DUFFS_LOOP
|
slouken@7372
|
1030 |
/* *INDENT-OFF* */
|
slouken@7372
|
1031 |
DUFFS_LOOP(
|
slouken@7372
|
1032 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1033 |
, width);
|
slouken@7372
|
1034 |
/* *INDENT-ON* */
|
slouken@7372
|
1035 |
#else
|
slouken@7372
|
1036 |
for (c = width / 4; c; --c) {
|
slouken@7372
|
1037 |
/* Pack RGB into 8bit pixel */
|
slouken@7372
|
1038 |
++src;
|
slouken@7372
|
1039 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1040 |
++src;
|
slouken@7372
|
1041 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1042 |
++src;
|
slouken@7372
|
1043 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1044 |
++src;
|
slouken@7372
|
1045 |
}
|
slouken@7372
|
1046 |
switch (width & 3) {
|
slouken@7372
|
1047 |
case 3:
|
slouken@7372
|
1048 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1049 |
++src;
|
slouken@7372
|
1050 |
case 2:
|
slouken@7372
|
1051 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1052 |
++src;
|
slouken@7372
|
1053 |
case 1:
|
slouken@7372
|
1054 |
RGB101010_RGB332(*dst++, *src);
|
slouken@7372
|
1055 |
++src;
|
slouken@7372
|
1056 |
}
|
slouken@7372
|
1057 |
#endif /* USE_DUFFS_LOOP */
|
slouken@7372
|
1058 |
src += srcskip;
|
slouken@7372
|
1059 |
dst += dstskip;
|
slouken@7372
|
1060 |
}
|
slouken@7372
|
1061 |
} else {
|
slouken@7372
|
1062 |
int Pixel;
|
slouken@7372
|
1063 |
|
slouken@7372
|
1064 |
while (height--) {
|
slouken@7372
|
1065 |
#ifdef USE_DUFFS_LOOP
|
slouken@7372
|
1066 |
/* *INDENT-OFF* */
|
slouken@7372
|
1067 |
DUFFS_LOOP(
|
slouken@7372
|
1068 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1069 |
*dst++ = map[Pixel];
|
slouken@7372
|
1070 |
++src;
|
slouken@7372
|
1071 |
, width);
|
slouken@7372
|
1072 |
/* *INDENT-ON* */
|
slouken@7372
|
1073 |
#else
|
slouken@7372
|
1074 |
for (c = width / 4; c; --c) {
|
slouken@7372
|
1075 |
/* Pack RGB into 8bit pixel */
|
slouken@7372
|
1076 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1077 |
*dst++ = map[Pixel];
|
slouken@7372
|
1078 |
++src;
|
slouken@7372
|
1079 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1080 |
*dst++ = map[Pixel];
|
slouken@7372
|
1081 |
++src;
|
slouken@7372
|
1082 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1083 |
*dst++ = map[Pixel];
|
slouken@7372
|
1084 |
++src;
|
slouken@7372
|
1085 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1086 |
*dst++ = map[Pixel];
|
slouken@7372
|
1087 |
++src;
|
slouken@7372
|
1088 |
}
|
slouken@7372
|
1089 |
switch (width & 3) {
|
slouken@7372
|
1090 |
case 3:
|
slouken@7372
|
1091 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1092 |
*dst++ = map[Pixel];
|
slouken@7372
|
1093 |
++src;
|
slouken@7372
|
1094 |
case 2:
|
slouken@7372
|
1095 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1096 |
*dst++ = map[Pixel];
|
slouken@7372
|
1097 |
++src;
|
slouken@7372
|
1098 |
case 1:
|
slouken@7372
|
1099 |
RGB101010_RGB332(Pixel, *src);
|
slouken@7372
|
1100 |
*dst++ = map[Pixel];
|
slouken@7372
|
1101 |
++src;
|
slouken@7372
|
1102 |
}
|
slouken@7372
|
1103 |
#endif /* USE_DUFFS_LOOP */
|
slouken@7372
|
1104 |
src += srcskip;
|
slouken@7372
|
1105 |
dst += dstskip;
|
slouken@7372
|
1106 |
}
|
slouken@7372
|
1107 |
}
|
slouken@7372
|
1108 |
}
|
slouken@7372
|
1109 |
|
slouken@0
|
1110 |
/* Special optimized blit for RGB 8-8-8 --> RGB 5-5-5 */
|
slouken@0
|
1111 |
#define RGB888_RGB555(dst, src) { \
|
slouken@7208
|
1112 |
*(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>9)| \
|
slouken@7208
|
1113 |
(((*src)&0x0000F800)>>6)| \
|
slouken@7208
|
1114 |
(((*src)&0x000000F8)>>3)); \
|
slouken@0
|
1115 |
}
|
slouken@10616
|
1116 |
#ifndef USE_DUFFS_LOOP
|
slouken@0
|
1117 |
#define RGB888_RGB555_TWO(dst, src) { \
|
slouken@7208
|
1118 |
*(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>9)| \
|
slouken@7208
|
1119 |
(((src[HI])&0x0000F800)>>6)| \
|
slouken@7208
|
1120 |
(((src[HI])&0x000000F8)>>3))<<16)| \
|
slouken@7208
|
1121 |
(((src[LO])&0x00F80000)>>9)| \
|
slouken@7208
|
1122 |
(((src[LO])&0x0000F800)>>6)| \
|
slouken@7208
|
1123 |
(((src[LO])&0x000000F8)>>3); \
|
slouken@0
|
1124 |
}
|
slouken@10616
|
1125 |
#endif
|
slouken@1895
|
1126 |
static void
|
slouken@1895
|
1127 |
Blit_RGB888_RGB555(SDL_BlitInfo * info)
|
slouken@0
|
1128 |
{
|
slouken@0
|
1129 |
#ifndef USE_DUFFS_LOOP
|
slouken@1895
|
1130 |
int c;
|
slouken@0
|
1131 |
#endif
|
slouken@1895
|
1132 |
int width, height;
|
slouken@1895
|
1133 |
Uint32 *src;
|
slouken@1895
|
1134 |
Uint16 *dst;
|
slouken@1895
|
1135 |
int srcskip, dstskip;
|
slouken@0
|
1136 |
|
slouken@1895
|
1137 |
/* Set up some basic variables */
|
slouken@2262
|
1138 |
width = info->dst_w;
|
slouken@2262
|
1139 |
height = info->dst_h;
|
slouken@2262
|
1140 |
src = (Uint32 *) info->src;
|
slouken@2267
|
1141 |
srcskip = info->src_skip / 4;
|
slouken@2262
|
1142 |
dst = (Uint16 *) info->dst;
|
slouken@2267
|
1143 |
dstskip = info->dst_skip / 2;
|
slouken@0
|
1144 |
|
slouken@0
|
1145 |
#ifdef USE_DUFFS_LOOP
|
slouken@1895
|
1146 |
while (height--) {
|
slouken@7208
|
1147 |
/* *INDENT-OFF* */
|
slouken@7208
|
1148 |
DUFFS_LOOP(
|
slouken@7208
|
1149 |
RGB888_RGB555(dst, src);
|
slouken@7208
|
1150 |
++src;
|
slouken@7208
|
1151 |
++dst;
|
slouken@7208
|
1152 |
, width);
|
slouken@7208
|
1153 |
/* *INDENT-ON* */
|
slouken@1895
|
1154 |
src += srcskip;
|
slouken@1895
|
1155 |
dst += dstskip;
|
slouken@1895
|
1156 |
}
|
slouken@0
|
1157 |
#else
|
slouken@1895
|
1158 |
/* Memory align at 4-byte boundary, if necessary */
|
slouken@1895
|
1159 |
if ((long) dst & 0x03) {
|
slouken@1895
|
1160 |
/* Don't do anything if width is 0 */
|
slouken@1895
|
1161 |
if (width == 0) {
|
slouken@1895
|
1162 |
return;
|
slouken@1895
|
1163 |
}
|
slouken@1895
|
1164 |
--width;
|
slouken@0
|
1165 |
|
slouken@1895
|
1166 |
while (height--) {
|
slouken@1895
|
1167 |
/* Perform copy alignment */
|
slouken@1895
|
1168 |
RGB888_RGB555(dst, src);
|
slouken@1895
|
1169 |
++src;
|
slouken@1895
|
1170 |
++dst;
|
slouken@0
|
1171 |
|
slouken@1895
|
1172 |
/* Copy in 4 pixel chunks */
|
slouken@1895
|
1173 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
1174 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1175 |
src += 2;
|
slouken@1895
|
1176 |
dst += 2;
|
slouken@1895
|
1177 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1178 |
src += 2;
|
slouken@1895
|
1179 |
dst += 2;
|
slouken@1895
|
1180 |
}
|
slouken@1895
|
1181 |
/* Get any leftovers */
|
slouken@1895
|
1182 |
switch (width & 3) {
|
slouken@1895
|
1183 |
case 3:
|
slouken@1895
|
1184 |
RGB888_RGB555(dst, src);
|
slouken@1895
|
1185 |
++src;
|
slouken@1895
|
1186 |
++dst;
|
slouken@1895
|
1187 |
case 2:
|
slouken@1895
|
1188 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1189 |
src += 2;
|
slouken@1895
|
1190 |
dst += 2;
|
slouken@1895
|
1191 |
break;
|
slouken@1895
|
1192 |
case 1:
|
slouken@1895
|
1193 |
RGB888_RGB555(dst, src);
|
slouken@1895
|
1194 |
++src;
|
slouken@1895
|
1195 |
++dst;
|
slouken@1895
|
1196 |
break;
|
slouken@1895
|
1197 |
}
|
slouken@1895
|
1198 |
src += srcskip;
|
slouken@1895
|
1199 |
dst += dstskip;
|
slouken@1895
|
1200 |
}
|
slouken@1895
|
1201 |
} else {
|
slouken@1895
|
1202 |
while (height--) {
|
slouken@1895
|
1203 |
/* Copy in 4 pixel chunks */
|
slouken@1895
|
1204 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
1205 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1206 |
src += 2;
|
slouken@1895
|
1207 |
dst += 2;
|
slouken@1895
|
1208 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1209 |
src += 2;
|
slouken@1895
|
1210 |
dst += 2;
|
slouken@1895
|
1211 |
}
|
slouken@1895
|
1212 |
/* Get any leftovers */
|
slouken@1895
|
1213 |
switch (width & 3) {
|
slouken@1895
|
1214 |
case 3:
|
slouken@1895
|
1215 |
RGB888_RGB555(dst, src);
|
slouken@1895
|
1216 |
++src;
|
slouken@1895
|
1217 |
++dst;
|
slouken@1895
|
1218 |
case 2:
|
slouken@1895
|
1219 |
RGB888_RGB555_TWO(dst, src);
|
slouken@1895
|
1220 |
src += 2;
|
slouken@1895
|
1221 |
dst += 2;
|
slouken@1895
|
1222 |
break;
|
slouken@1895
|
1223 |
case 1:
|
slouken@1895
|
1224 |
RGB888_RGB555(dst, src);
|
slouken@1895
|
1225 |
++src;
|
slouken@1895
|
1226 |
++dst;
|
slouken@1895
|
1227 |
break;
|
slouken@1895
|
1228 |
}
|
slouken@1895
|
1229 |
src += srcskip;
|
slouken@1895
|
1230 |
dst += dstskip;
|
slouken@1895
|
1231 |
}
|
slouken@1895
|
1232 |
}
|
slouken@0
|
1233 |
#endif /* USE_DUFFS_LOOP */
|
slouken@0
|
1234 |
}
|
slouken@1895
|
1235 |
|
slouken@0
|
1236 |
/* Special optimized blit for RGB 8-8-8 --> RGB 5-6-5 */
|
slouken@0
|
1237 |
#define RGB888_RGB565(dst, src) { \
|
slouken@7208
|
1238 |
*(Uint16 *)(dst) = (Uint16)((((*src)&0x00F80000)>>8)| \
|
slouken@7208
|
1239 |
(((*src)&0x0000FC00)>>5)| \
|
slouken@7208
|
1240 |
(((*src)&0x000000F8)>>3)); \
|
slouken@0
|
1241 |
}
|
slouken@10616
|
1242 |
#ifndef USE_DUFFS_LOOP
|
slouken@0
|
1243 |
#define RGB888_RGB565_TWO(dst, src) { \
|
slouken@7208
|
1244 |
*(Uint32 *)(dst) = (((((src[HI])&0x00F80000)>>8)| \
|
slouken@7208
|
1245 |
(((src[HI])&0x0000FC00)>>5)| \
|
slouken@7208
|
1246 |
(((src[HI])&0x000000F8)>>3))<<16)| \
|
slouken@7208
|
1247 |
(((src[LO])&0x00F80000)>>8)| \
|
slouken@7208
|
1248 |
(((src[LO])&0x0000FC00)>>5)| \
|
slouken@7208
|
1249 |
(((src[LO])&0x000000F8)>>3); \
|
slouken@0
|
1250 |
}
|
slouken@10616
|
1251 |
#endif
|
slouken@1895
|
1252 |
static void
|
slouken@1895
|
1253 |
Blit_RGB888_RGB565(SDL_BlitInfo * info)
|
slouken@0
|
1254 |
{
|
slouken@0
|
1255 |
#ifndef USE_DUFFS_LOOP
|
slouken@1895
|
1256 |
int c;
|
slouken@0
|
1257 |
#endif
|
slouken@1895
|
1258 |
int width, height;
|
slouken@1895
|
1259 |
Uint32 *src;
|
slouken@1895
|
1260 |
Uint16 *dst;
|
slouken@1895
|
1261 |
int srcskip, dstskip;
|
slouken@0
|
1262 |
|
slouken@1895
|
1263 |
/* Set up some basic variables */
|
slouken@2262
|
1264 |
width = info->dst_w;
|
slouken@2262
|
1265 |
height = info->dst_h;
|
slouken@2262
|
1266 |
src = (Uint32 *) info->src;
|
slouken@2267
|
1267 |
srcskip = info->src_skip / 4;
|
slouken@2262
|
1268 |
dst = (Uint16 *) info->dst;
|
slouken@2267
|
1269 |
dstskip = info->dst_skip / 2;
|
slouken@0
|
1270 |
|
slouken@0
|
1271 |
#ifdef USE_DUFFS_LOOP
|
slouken@1895
|
1272 |
while (height--) {
|
slouken@7208
|
1273 |
/* *INDENT-OFF* */
|
slouken@7208
|
1274 |
DUFFS_LOOP(
|
slouken@7208
|
1275 |
RGB888_RGB565(dst, src);
|
slouken@7208
|
1276 |
++src;
|
slouken@7208
|
1277 |
++dst;
|
slouken@7208
|
1278 |
, width);
|
slouken@7208
|
1279 |
/* *INDENT-ON* */
|
slouken@1895
|
1280 |
src += srcskip;
|
slouken@1895
|
1281 |
dst += dstskip;
|
slouken@1895
|
1282 |
}
|
slouken@0
|
1283 |
#else
|
slouken@1895
|
1284 |
/* Memory align at 4-byte boundary, if necessary */
|
slouken@1895
|
1285 |
if ((long) dst & 0x03) {
|
slouken@1895
|
1286 |
/* Don't do anything if width is 0 */
|
slouken@1895
|
1287 |
if (width == 0) {
|
slouken@1895
|
1288 |
return;
|
slouken@1895
|
1289 |
}
|
slouken@1895
|
1290 |
--width;
|
slouken@0
|
1291 |
|
slouken@1895
|
1292 |
while (height--) {
|
slouken@1895
|
1293 |
/* Perform copy alignment */
|
slouken@1895
|
1294 |
RGB888_RGB565(dst, src);
|
slouken@1895
|
1295 |
++src;
|
slouken@1895
|
1296 |
++dst;
|
slouken@0
|
1297 |
|
slouken@1895
|
1298 |
/* Copy in 4 pixel chunks */
|
slouken@1895
|
1299 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
1300 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1301 |
src += 2;
|
slouken@1895
|
1302 |
dst += 2;
|
slouken@1895
|
1303 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1304 |
src += 2;
|
slouken@1895
|
1305 |
dst += 2;
|
slouken@1895
|
1306 |
}
|
slouken@1895
|
1307 |
/* Get any leftovers */
|
slouken@1895
|
1308 |
switch (width & 3) {
|
slouken@1895
|
1309 |
case 3:
|
slouken@1895
|
1310 |
RGB888_RGB565(dst, src);
|
slouken@1895
|
1311 |
++src;
|
slouken@1895
|
1312 |
++dst;
|
slouken@1895
|
1313 |
case 2:
|
slouken@1895
|
1314 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1315 |
src += 2;
|
slouken@1895
|
1316 |
dst += 2;
|
slouken@1895
|
1317 |
break;
|
slouken@1895
|
1318 |
case 1:
|
slouken@1895
|
1319 |
RGB888_RGB565(dst, src);
|
slouken@1895
|
1320 |
++src;
|
slouken@1895
|
1321 |
++dst;
|
slouken@1895
|
1322 |
break;
|
slouken@1895
|
1323 |
}
|
slouken@1895
|
1324 |
src += srcskip;
|
slouken@1895
|
1325 |
dst += dstskip;
|
slouken@1895
|
1326 |
}
|
slouken@1895
|
1327 |
} else {
|
slouken@1895
|
1328 |
while (height--) {
|
slouken@1895
|
1329 |
/* Copy in 4 pixel chunks */
|
slouken@1895
|
1330 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
1331 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1332 |
src += 2;
|
slouken@1895
|
1333 |
dst += 2;
|
slouken@1895
|
1334 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1335 |
src += 2;
|
slouken@1895
|
1336 |
dst += 2;
|
slouken@1895
|
1337 |
}
|
slouken@1895
|
1338 |
/* Get any leftovers */
|
slouken@1895
|
1339 |
switch (width & 3) {
|
slouken@1895
|
1340 |
case 3:
|
slouken@1895
|
1341 |
RGB888_RGB565(dst, src);
|
slouken@1895
|
1342 |
++src;
|
slouken@1895
|
1343 |
++dst;
|
slouken@1895
|
1344 |
case 2:
|
slouken@1895
|
1345 |
RGB888_RGB565_TWO(dst, src);
|
slouken@1895
|
1346 |
src += 2;
|
slouken@1895
|
1347 |
dst += 2;
|
slouken@1895
|
1348 |
break;
|
slouken@1895
|
1349 |
case 1:
|
slouken@1895
|
1350 |
RGB888_RGB565(dst, src);
|
slouken@1895
|
1351 |
++src;
|
slouken@1895
|
1352 |
++dst;
|
slouken@1895
|
1353 |
break;
|
slouken@1895
|
1354 |
}
|
slouken@1895
|
1355 |
src += srcskip;
|
slouken@1895
|
1356 |
dst += dstskip;
|
slouken@1895
|
1357 |
}
|
slouken@1895
|
1358 |
}
|
slouken@0
|
1359 |
#endif /* USE_DUFFS_LOOP */
|
slouken@0
|
1360 |
}
|
slouken@0
|
1361 |
|
slouken@0
|
1362 |
|
slouken@0
|
1363 |
/* Special optimized blit for RGB 5-6-5 --> 32-bit RGB surfaces */
|
icculus@1047
|
1364 |
#define RGB565_32(dst, src, map) (map[src[LO]*2] + map[src[HI]*2+1])
|
slouken@1895
|
1365 |
static void
|
slouken@1895
|
1366 |
Blit_RGB565_32(SDL_BlitInfo * info, const Uint32 * map)
|
slouken@0
|
1367 |
{
|
slouken@0
|
1368 |
#ifndef USE_DUFFS_LOOP
|
slouken@1895
|
1369 |
int c;
|
slouken@0
|
1370 |
#endif
|
slouken@1895
|
1371 |
int width, height;
|
slouken@1895
|
1372 |
Uint8 *src;
|
slouken@1895
|
1373 |
Uint32 *dst;
|
slouken@1895
|
1374 |
int srcskip, dstskip;
|
slouken@0
|
1375 |
|
slouken@1895
|
1376 |
/* Set up some basic variables */
|
slouken@2262
|
1377 |
width = info->dst_w;
|
slouken@2262
|
1378 |
height = info->dst_h;
|
slouken@2262
|
1379 |
src = (Uint8 *) info->src;
|
slouken@2267
|
1380 |
srcskip = info->src_skip;
|
slouken@2262
|
1381 |
dst = (Uint32 *) info->dst;
|
slouken@2267
|
1382 |
dstskip = info->dst_skip / 4;
|
slouken@0
|
1383 |
|
slouken@0
|
1384 |
#ifdef USE_DUFFS_LOOP
|
slouken@1895
|
1385 |
while (height--) {
|
slouken@7208
|
1386 |
/* *INDENT-OFF* */
|
slouken@7208
|
1387 |
DUFFS_LOOP(
|
slouken@7208
|
1388 |
{
|
slouken@7208
|
1389 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@7208
|
1390 |
src += 2;
|
slouken@7208
|
1391 |
},
|
slouken@7208
|
1392 |
width);
|
slouken@7208
|
1393 |
/* *INDENT-ON* */
|
slouken@1895
|
1394 |
src += srcskip;
|
slouken@1895
|
1395 |
dst += dstskip;
|
slouken@1895
|
1396 |
}
|
slouken@0
|
1397 |
#else
|
slouken@1895
|
1398 |
while (height--) {
|
slouken@1895
|
1399 |
/* Copy in 4 pixel chunks */
|
slouken@1895
|
1400 |
for (c = width / 4; c; --c) {
|
slouken@1895
|
1401 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1402 |
src += 2;
|
slouken@1895
|
1403 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1404 |
src += 2;
|
slouken@1895
|
1405 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1406 |
src += 2;
|
slouken@1895
|
1407 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1408 |
src += 2;
|
slouken@1895
|
1409 |
}
|
slouken@1895
|
1410 |
/* Get any leftovers */
|
slouken@1895
|
1411 |
switch (width & 3) {
|
slouken@1895
|
1412 |
case 3:
|
slouken@1895
|
1413 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1414 |
src += 2;
|
slouken@1895
|
1415 |
case 2:
|
slouken@1895
|
1416 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1417 |
src += 2;
|
slouken@1895
|
1418 |
case 1:
|
slouken@1895
|
1419 |
*dst++ = RGB565_32(dst, src, map);
|
slouken@1895
|
1420 |
src += 2;
|
slouken@1895
|
1421 |
break;
|
slouken@1895
|
1422 |
}
|
slouken@1895
|
1423 |
src += srcskip;
|
slouken@1895
|
1424 |
dst += dstskip;
|
slouken@1895
|
1425 |
}
|
slouken@0
|
1426 |
#endif /* USE_DUFFS_LOOP */
|
slouken@0
|
1427 |
}
|
slouken@0
|
1428 |
|
slouken@0
|
1429 |
/* Special optimized blit for RGB 5-6-5 --> ARGB 8-8-8-8 */
|
slouken@91
|
1430 |
static const Uint32 RGB565_ARGB8888_LUT[512] = {
|
slouken@1895
|
1431 |
0x00000000, 0xff000000, 0x00000008, 0xff002000,
|
slouken@1895
|
1432 |
0x00000010, 0xff004000, 0x00000018, 0xff006100,
|
slouken@1895
|
1433 |
0x00000020, 0xff008100, 0x00000029, 0xff00a100,
|
slouken@1895
|
1434 |
0x00000031, 0xff00c200, 0x00000039, 0xff00e200,
|
slouken@1895
|
1435 |
0x00000041, 0xff080000, 0x0000004a, 0xff082000,
|
slouken@1895
|
1436 |
0x00000052, 0xff084000, 0x0000005a, 0xff086100,
|
slouken@1895
|
1437 |
0x00000062, 0xff088100, 0x0000006a, 0xff08a100,
|
slouken@1895
|
1438 |
0x00000073, 0xff08c200, 0x0000007b, 0xff08e200,
|
slouken@1895
|
1439 |
0x00000083, 0xff100000, 0x0000008b, 0xff102000,
|
slouken@1895
|
1440 |
0x00000094, 0xff104000, 0x0000009c, 0xff106100,
|
slouken@1895
|
1441 |
0x000000a4, 0xff108100, 0x000000ac, 0xff10a100,
|
slouken@1895
|
1442 |
0x000000b4, 0xff10c200, 0x000000bd, 0xff10e200,
|
slouken@1895
|
1443 |
0x000000c5, 0xff180000, 0x000000cd, 0xff182000,
|
slouken@1895
|
1444 |
0x000000d5, 0xff184000, 0x000000de, 0xff186100,
|
slouken@1895
|
1445 |
0x000000e6, 0xff188100, 0x000000ee, 0xff18a100,
|
slouken@1895
|
1446 |
0x000000f6, 0xff18c200, 0x000000ff, 0xff18e200,
|
slouken@1895
|
1447 |
0x00000400, 0xff200000, 0x00000408, 0xff202000,
|
slouken@1895
|
1448 |
0x00000410, 0xff204000, 0x00000418, 0xff206100,
|
slouken@1895
|
1449 |
0x00000420, 0xff208100, 0x00000429, 0xff20a100,
|
slouken@1895
|
1450 |
0x00000431, 0xff20c200, 0x00000439, 0xff20e200,
|
slouken@1895
|
1451 |
0x00000441, 0xff290000, 0x0000044a, 0xff292000,
|
slouken@1895
|
1452 |
0x00000452, 0xff294000, 0x0000045a, 0xff296100,
|
slouken@1895
|
1453 |
0x00000462, 0xff298100, 0x0000046a, 0xff29a100,
|
slouken@1895
|
1454 |
0x00000473, 0xff29c200, 0x0000047b, 0xff29e200,
|
slouken@1895
|
1455 |
0x00000483, 0xff310000, 0x0000048b, 0xff312000,
|
slouken@1895
|
1456 |
0x00000494, 0xff314000, 0x0000049c, 0xff316100,
|
slouken@1895
|
1457 |
0x000004a4, 0xff318100, 0x000004ac, 0xff31a100,
|
slouken@1895
|
1458 |
0x000004b4, 0xff31c200, 0x000004bd, 0xff31e200,
|
slouken@1895
|
1459 |
0x000004c5, 0xff390000, 0x000004cd, 0xff392000,
|
slouken@1895
|
1460 |
0x000004d5, 0xff394000, 0x000004de, 0xff396100,
|
slouken@1895
|
1461 |
0x000004e6, 0xff398100, 0x000004ee, 0xff39a100,
|
slouken@1895
|
1462 |
0x000004f6, 0xff39c200, 0x000004ff, 0xff39e200,
|
slouken@1895
|
1463 |
0x00000800, 0xff410000, 0x00000808, 0xff412000,
|
slouken@1895
|
1464 |
0x00000810, 0xff414000, 0x00000818, 0xff416100,
|
slouken@1895
|
1465 |
0x00000820, 0xff418100, 0x00000829, 0xff41a100,
|
slouken@1895
|
1466 |
0x00000831, 0xff41c200, 0x00000839, 0xff41e200,
|
slouken@1895
|
1467 |
0x00000841, 0xff4a0000, 0x0000084a, 0xff4a2000,
|
slouken@1895
|
1468 |
0x00000852, 0xff4a4000, 0x0000085a, 0xff4a6100,
|
slouken@1895
|
1469 |
0x00000862, 0xff4a8100, 0x0000086a, 0xff4aa100,
|
slouken@1895
|
1470 |
0x00000873, 0xff4ac200, 0x0000087b, 0xff4ae200,
|
slouken@1895
|
1471 |
0x00000883, 0xff520000, 0x0000088b, 0xff522000,
|
slouken@1895
|
1472 |
0x00000894, 0xff524000, 0x0000089c, 0xff526100,
|
slouken@1895
|
1473 |
0x000008a4, 0xff528100, 0x000008ac, 0xff52a100,
|
slouken@1895
|
1474 |
0x000008b4, 0xff52c200, 0x000008bd, 0xff52e200,
|
slouken@1895
|
1475 |
0x000008c5, 0xff5a0000, 0x000008cd, 0xff5a2000,
|
slouken@1895
|
1476 |
0x000008d5, 0xff5a4000, 0x000008de, 0xff5a6100,
|
slouken@1895
|
1477 |
0x000008e6, 0xff5a8100, 0x000008ee, 0xff5aa100,
|
slouken@1895
|
1478 |
0x000008f6, 0xff5ac200, 0x000008ff, 0xff5ae200,
|
slouken@1895
|
1479 |
0x00000c00, 0xff620000, 0x00000c08, 0xff622000,
|
slouken@1895
|
1480 |
0x00000c10, 0xff624000, 0x00000c18, 0xff626100,
|
slouken@1895
|
1481 |
0x00000c20, 0xff628100, 0x00000c29, 0xff62a100,
|
slouken@1895
|
1482 |
0x00000c31, 0xff62c200, 0x00000c39, 0xff62e200,
|
slouken@1895
|
1483 |
0x00000c41, 0xff6a0000, 0x00000c4a, 0xff6a2000,
|
slouken@1895
|
1484 |
0x00000c52, 0xff6a4000, 0x00000c5a, 0xff6a6100,
|
slouken@1895
|
1485 |
0x00000c62, 0xff6a8100, 0x00000c6a, 0xff6aa100,
|
slouken@1895
|
1486 |
0x00000c73, 0xff6ac200, 0x00000c7b, 0xff6ae200,
|
slouken@1895
|
1487 |
0x00000c83, 0xff730000, 0x00000c8b, 0xff732000,
|
slouken@1895
|
1488 |
0x00000c94, 0xff734000, 0x00000c9c, 0xff736100,
|
slouken@1895
|
1489 |
0x00000ca4, 0xff738100, 0x00000cac, 0xff73a100,
|
slouken@1895
|
1490 |
0x00000cb4, 0xff73c200, 0x00000cbd, 0xff73e200,
|
slouken@1895
|
1491 |
0x00000cc5, 0xff7b0000, 0x00000ccd, 0xff7b2000,
|
slouken@1895
|
1492 |
0x00000cd5, 0xff7b4000, 0x00000cde, 0xff7b6100,
|
slouken@1895
|
1493 |
0x00000ce6, 0xff7b8100, 0x00000cee, 0xff7ba100,
|
slouken@1895
|
1494 |
0x00000cf6, 0xff7bc200, 0x00000cff, 0xff7be200,
|
slouken@1895
|
1495 |
0x00001000, 0xff830000, 0x00001008, 0xff832000,
|
slouken@1895
|
1496 |
0x00001010, 0xff834000, 0x00001018, 0xff836100,
|
slouken@1895
|
1497 |
0x00001020, 0xff838100, 0x00001029, 0xff83a100,
|
slouken@1895
|
1498 |
0x00001031, 0xff83c200, 0x00001039, 0xff83e200,
|
slouken@1895
|
1499 |
0x00001041, 0xff8b0000, 0x0000104a, 0xff8b2000,
|
slouken@1895
|
1500 |
0x00001052, 0xff8b4000, 0x0000105a, 0xff8b6100,
|
slouken@1895
|
1501 |
0x00001062, 0xff8b8100, 0x0000106a, 0xff8ba100,
|
slouken@1895
|
1502 |
0x00001073, 0xff8bc200, 0x0000107b, 0xff8be200,
|
slouken@1895
|
1503 |
0x00001083, 0xff940000, 0x0000108b, 0xff942000,
|
slouken@1895
|
1504 |
0x00001094, 0xff944000, 0x0000109c, 0xff946100,
|
slouken@1895
|
1505 |
0x000010a4, 0xff948100, 0x000010ac, 0xff94a100,
|
slouken@1895
|
1506 |
0x000010b4, 0xff94c200, 0x000010bd, 0xff94e200,
|
slouken@1895
|
1507 |
0x000010c5, 0xff9c0000, 0x000010cd, 0xff9c2000,
|
slouken@1895
|
1508 |
0x000010d5, 0xff9c4000, 0x000010de, 0xff9c6100,
|
slouken@1895
|
1509 |
0x000010e6, 0xff9c8100, 0x000010ee, 0xff9ca100,
|
slouken@1895
|
1510 |
0x000010f6, 0xff9cc200, 0x000010ff, 0xff9ce200,
|
slouken@1895
|
1511 |
0x00001400, 0xffa40000, 0x00001408, 0xffa42000,
|
slouken@1895
|
1512 |
0x00001410, 0xffa44000, 0x00001418, 0xffa46100,
|
slouken@1895
|
1513 |
0x00001420, 0xffa48100, 0x00001429, 0xffa4a100,
|
slouken@1895
|
1514 |
0x00001431, 0xffa4c200, 0x00001439, 0xffa4e200,
|
slouken@1895
|
1515 |
0x00001441, 0xffac0000, 0x0000144a, 0xffac2000,
|
slouken@1895
|
1516 |
0x00001452, 0xffac4000, 0x0000145a, 0xffac6100,
|
slouken@1895
|
1517 |
0x00001462, 0xffac8100, 0x0000146a, 0xffaca100,
|
slouken@1895
|
1518 |
0x00001473, 0xffacc200, 0x0000147b, 0xfface200,
|
slouken@1895
|
1519 |
0x00001483, 0xffb40000, 0x0000148b, 0xffb42000,
|
slouken@1895
|
1520 |
0x00001494, 0xffb44000, 0x0000149c, 0xffb46100,
|
slouken@1895
|
1521 |
0x000014a4, 0xffb48100, 0x000014ac, 0xffb4a100,
|
slouken@1895
|
1522 |
0x000014b4, 0xffb4c200, 0x000014bd, 0xffb4e200,
|
slouken@1895
|
1523 |
0x000014c5, 0xffbd0000, 0x000014cd, 0xffbd2000,
|
slouken@1895
|
1524 |
0x000014d5, 0xffbd4000, 0x000014de, 0xffbd6100,
|
slouken@1895
|
1525 |
0x000014e6, 0xffbd8100, 0x000014ee, 0xffbda100,
|
slouken@1895
|
1526 |
0x000014f6, 0xffbdc200, 0x000014ff, 0xffbde200,
|
slouken@1895
|
1527 |
0x00001800, 0xffc50000, 0x00001808, 0xffc52000,
|
slouken@1895
|
1528 |
0x00001810, 0xffc54000, 0x00001818, 0xffc56100,
|
slouken@1895
|
1529 |
0x00001820, 0xffc58100, 0x00001829, 0xffc5a100,
|
slouken@1895
|
1530 |
0x00001831, 0xffc5c200, 0x00001839, 0xffc5e200,
|
slouken@1895
|
1531 |
0x00001841, 0xffcd0000, 0x0000184a, 0xffcd2000,
|
slouken@1895
|
1532 |
0x00001852, 0xffcd4000, 0x0000185a, 0xffcd6100,
|
slouken@1895
|
1533 |
0x00001862, 0xffcd8100, 0x0000186a, 0xffcda100,
|
slouken@1895
|
1534 |
0x00001873, 0xffcdc200, 0x0000187b, 0xffcde200,
|
slouken@1895
|
1535 |
0x00001883, 0xffd50000, 0x0000188b, 0xffd52000,
|
slouken@1895
|
1536 |
0x00001894, 0xffd54000, 0x0000189c, 0xffd56100,
|
slouken@1895
|
1537 |
0x000018a4, 0xffd58100, 0x000018ac, 0xffd5a100,
|
slouken@1895
|
1538 |
0x000018b4, 0xffd5c200, 0x000018bd, 0xffd5e200,
|
slouken@1895
|
1539 |
0x000018c5, 0xffde0000, 0x000018cd, 0xffde2000,
|
slouken@1895
|
1540 |
0x000018d5, 0xffde4000, 0x000018de, 0xffde6100,
|
slouken@1895
|
1541 |
0x000018e6, 0xffde8100, 0x000018ee, 0xffdea100,
|
slouken@1895
|
1542 |
0x000018f6, 0xffdec200, 0x000018ff, 0xffdee200,
|
slouken@1895
|
1543 |
0x00001c00, 0xffe60000, 0x00001c08, 0xffe62000,
|
slouken@1895
|
1544 |
0x00001c10, 0xffe64000, 0x00001c18, 0xffe66100,
|
slouken@1895
|
1545 |
0x00001c20, 0xffe68100, 0x00001c29, 0xffe6a100,
|
slouken@1895
|
1546 |
0x00001c31, 0xffe6c200, 0x00001c39, 0xffe6e200,
|
slouken@1895
|
1547 |
0x00001c41, 0xffee0000, 0x00001c4a, 0xffee2000,
|
slouken@1895
|
1548 |
0x00001c52, 0xffee4000, 0x00001c5a, 0xffee6100,
|
slouken@1895
|
1549 |
0x00001c62, 0xffee8100, 0x00001c6a, 0xffeea100,
|
slouken@1895
|
1550 |
0x00001c73, 0xffeec200, 0x00001c7b, 0xffeee200,
|
slouken@1895
|
1551 |
0x00001c83, 0xfff60000, 0x00001c8b, 0xfff62000,
|
slouken@1895
|
1552 |
0x00001c94, 0xfff64000, 0x00001c9c, 0xfff66100,
|
slouken@1895
|
1553 |
0x00001ca4, 0xfff68100, 0x00001cac, 0xfff6a100,
|
slouken@1895
|
1554 |
0x00001cb4, 0xfff6c200, 0x00001cbd, 0xfff6e200,
|
slouken@1895
|
1555 |
0x00001cc5, 0xffff0000, 0x00001ccd, 0xffff2000,
|
slouken@1895
|
1556 |
0x00001cd5, 0xffff4000, 0x00001cde, 0xffff6100,
|
slouken@1895
|
1557 |
0x00001ce6, 0xffff8100, 0x00001cee, 0xffffa100,
|
slouken@1895
|
1558 |
0x00001cf6, 0xffffc200, 0x00001cff, 0xffffe200
|
slouken@0
|
1559 |
};
|
slouken@2735
|
1560 |
|
slouken@1895
|
1561 |
static void
|
slouken@1895
|
1562 |
Blit_RGB565_ARGB8888(SDL_BlitInfo * info)
|
slouken@0
|
1563 |
{
|
slouken@0
|
1564 |
Blit_RGB565_32(info, RGB565_ARGB8888_LUT);
|
slouken@0
|
1565 |
}
|
slouken@0
|
1566 |
|
slouken@0
|
1567 |
/* Special optimized blit for RGB 5-6-5 --> ABGR 8-8-8-8 */
|
slouken@91
|
1568 |
static const Uint32 RGB565_ABGR8888_LUT[512] = {
|
slouken@1895
|
1569 |
0xff000000, 0x00000000, 0xff080000, 0x00002000,
|
slouken@1895
|
1570 |
0xff100000, 0x00004000, 0xff180000, 0x00006100,
|
slouken@1895
|
1571 |
0xff200000, 0x00008100, 0xff290000, 0x0000a100,
|
slouken@1895
|
1572 |
0xff310000, 0x0000c200, 0xff390000, 0x0000e200,
|
slouken@1895
|
1573 |
0xff410000, 0x00000008, 0xff4a0000, 0x00002008,
|
slouken@1895
|
1574 |
0xff520000, 0x00004008, 0xff5a0000, 0x00006108,
|
slouken@1895
|
1575 |
0xff620000, 0x00008108, 0xff6a0000, 0x0000a108,
|
slouken@1895
|
1576 |
0xff730000, 0x0000c208, 0xff7b0000, 0x0000e208,
|
slouken@1895
|
1577 |
0xff830000, 0x00000010, 0xff8b0000, 0x00002010,
|
slouken@1895
|
1578 |
0xff940000, 0x00004010, 0xff9c0000, 0x00006110,
|
slouken@1895
|
1579 |
0xffa40000, 0x00008110, 0xffac0000, 0x0000a110,
|
slouken@1895
|
1580 |
0xffb40000, 0x0000c210, 0xffbd0000, 0x0000e210,
|
slouken@1895
|
1581 |
0xffc50000, 0x00000018, 0xffcd0000, 0x00002018,
|
slouken@1895
|
1582 |
0xffd50000, 0x00004018, 0xffde0000, 0x00006118,
|
slouken@1895
|
1583 |
0xffe60000, 0x00008118, 0xffee0000, 0x0000a118,
|
slouken@1895
|
1584 |
0xfff60000, 0x0000c218, 0xffff0000, 0x0000e218,
|
slouken@1895
|
1585 |
0xff000400, 0x00000020, 0xff080400, 0x00002020,
|
slouken@1895
|
1586 |
0xff100400, 0x00004020, 0xff180400, 0x00006120,
|
slouken@1895
|
1587 |
0xff200400, 0x00008120, 0xff290400, 0x0000a120,
|
slouken@1895
|
1588 |
0xff310400, 0x0000c220, 0xff390400, 0x0000e220,
|
slouken@1895
|
1589 |
0xff410400, 0x00000029, 0xff4a0400, 0x00002029,
|
slouken@1895
|
1590 |
0xff520400, 0x00004029, 0xff5a0400, 0x00006129,
|
slouken@1895
|
1591 |
0xff620400, 0x00008129, 0xff6a0400, 0x0000a129,
|
slouken@1895
|
1592 |
0xff730400, 0x0000c229, 0xff7b0400, 0x0000e229,
|
slouken@1895
|
1593 |
0xff830400, 0x00000031, 0xff8b0400, 0x00002031,
|
slouken@1895
|
1594 |
0xff940400, 0x00004031, 0xff9c0400, 0x00006131,
|
slouken@1895
|
1595 |
0xffa40400, 0x00008131, 0xffac0400, 0x0000a131,
|
slouken@1895
|
1596 |
0xffb40400, 0x0000c231, 0xffbd0400, 0x0000e231,
|
slouken@1895
|
1597 |
0xffc50400, 0x00000039, 0xffcd0400, 0x00002039,
|
slouken@1895
|
1598 |
0xffd50400, 0x00004039, 0xffde0400, 0x00006139,
|
slouken@1895
|
1599 |
0xffe60400, 0x00008139, 0xffee0400, 0x0000a139,
|
slouken@1895
|
1600 |
0xfff60400, 0x0000c239, 0xffff0400, 0x0000e239,
|
slouken@1895
|
1601 |
0xff000800, 0x00000041, 0xff080800, 0x00002041,
|
slouken@1895
|
1602 |
0xff100800, 0x00004041, 0xff180800, 0x00006141,
|
slouken@1895
|
1603 |
0xff200800, 0x00008141, 0xff290800, 0x0000a141,
|
slouken@1895
|
1604 |
0xff310800, 0x0000c241, 0xff390800, 0x0000e241,
|
slouken@1895
|
1605 |
0xff410800, 0x0000004a, 0xff4a0800, 0x0000204a,
|
slouken@1895
|
1606 |
0xff520800, 0x0000404a, 0xff5a0800, 0x0000614a,
|
slouken@1895
|
1607 |
0xff620800, 0x0000814a, 0xff6a0800, 0x0000a14a,
|
slouken@1895
|
1608 |
0xff730800, 0x0000c24a, 0xff7b0800, 0x0000e24a,
|
slouken@1895
|
1609 |
0xff830800, 0x00000052, 0xff8b0800, 0x00002052,
|
slouken@1895
|
1610 |
0xff940800, 0x00004052, 0xff9c0800, 0x00006152,
|
slouken@1895
|
1611 |
0xffa40800, 0x00008152, 0xffac0800, 0x0000a152,
|
slouken@1895
|
1612 |
0xffb40800, 0x0000c252, 0xffbd0800, 0x0000e252,
|
slouken@1895
|
1613 |
0xffc50800, 0x0000005a, 0xffcd0800, 0x0000205a,
|
slouken@1895
|
1614 |
0xffd50800, 0x0000405a, 0xffde0800, 0x0000615a,
|
slouken@1895
|
1615 |
0xffe60800, 0x0000815a, 0xffee0800, 0x0000a15a,
|
slouken@1895
|
1616 |
0xfff60800, 0x0000c25a, 0xffff0800, 0x0000e25a,
|
slouken@1895
|
1617 |
0xff000c00, 0x00000062, 0xff080c00, 0x00002062,
|
slouken@1895
|
1618 |
0xff100c00, 0x00004062, 0xff180c00, 0x00006162,
|
slouken@1895
|
1619 |
0xff200c00, 0x00008162, 0xff290c00, 0x0000a162,
|
slouken@1895
|
1620 |
0xff310c00, 0x0000c262, 0xff390c00, 0x0000e262,
|
slouken@1895
|
1621 |
0xff410c00, 0x0000006a, 0xff4a0c00, 0x0000206a,
|
slouken@1895
|
1622 |
0xff520c00, 0x0000406a, 0xff5a0c00, 0x0000616a,
|
slouken@1895
|
1623 |
0xff620c00, 0x0000816a, 0xff6a0c00, 0x0000a16a,
|
slouken@1895
|
1624 |
0xff730c00, 0x0000c26a, 0xff7b0c00, 0x0000e26a,
|
slouken@1895
|
1625 |
0xff830c00, 0x00000073, 0xff8b0c00, 0x00002073,
|
slouken@1895
|
1626 |
0xff940c00, 0x00004073, 0xff9c0c00, 0x00006173,
|
slouken@1895
|
1627 |
0xffa40c00, 0x00008173, 0xffac0c00, 0x0000a173,
|
slouken@1895
|
1628 |
0xffb40c00, 0x0000c273, 0xffbd0c00, 0x0000e273,
|
slouken@1895
|
1629 |
0xffc50c00, 0x0000007b, 0xffcd0c00, 0x0000207b,
|
slouken@1895
|
1630 |
0xffd50c00, 0x0000407b, 0xffde0c00, 0x0000617b,
|
slouken@1895
|
1631 |
0xffe60c00, 0x0000817b, 0xffee0c00, 0x0000a17b,
|
slouken@1895
|
1632 |
0xfff60c00, 0x0000c27b, 0xffff0c00, 0x0000e27b,
|
slouken@1895
|
1633 |
0xff001000, 0x00000083, 0xff081000, 0x00002083,
|
slouken@1895
|
1634 |
0xff101000, 0x00004083, 0xff181000, 0x00006183,
|
slouken@1895
|
1635 |
0xff201000, 0x00008183, 0xff291000, 0x0000a183,
|
slouken@1895
|
1636 |
0xff311000, 0x0000c283, 0xff391000, 0x0000e283,
|
slouken@1895
|
1637 |
0xff411000, 0x0000008b, 0xff4a1000, 0x0000208b,
|
slouken@1895
|
1638 |
0xff521000, 0x0000408b, 0xff5a1000, 0x0000618b,
|
slouken@1895
|
1639 |
0xff621000, 0x0000818b, 0xff6a1000, 0x0000a18b,
|
slouken@1895
|
1640 |
0xff731000, 0x0000c28b, 0xff7b1000, 0x0000e28b,
|
slouken@1895
|
1641 |
0xff831000, 0x00000094, 0xff8b1000, 0x00002094,
|
slouken@1895
|
1642 |
0xff941000, 0x00004094, 0xff9c1000, 0x00006194,
|
slouken@1895
|
1643 |
0xffa41000, 0x00008194, 0xffac1000, 0x0000a194,
|
slouken@1895
|
1644 |
0xffb41000, 0x0000c294, 0xffbd1000, 0x0000e294,
|
slouken@1895
|
1645 |
0xffc51000, 0x0000009c, 0xffcd1000, 0x0000209c,
|
slouken@1895
|
1646 |
0xffd51000, 0x0000409c, 0xffde1000, 0x0000619c,
|
slouken@1895
|
1647 |
0xffe61000, 0x0000819c, 0xffee1000, 0x0000a19c,
|
slouken@1895
|
1648 |
0xfff61000, 0x0000c29c, 0xffff1000, 0x0000e29c,
|
slouken@1895
|
1649 |
0xff001400, 0x000000a4, 0xff081400, 0x000020a4,
|
slouken@1895
|
1650 |
0xff101400, 0x000040a4, 0xff181400, 0x000061a4,
|
slouken@1895
|
1651 |
0xff201400, 0x000081a4, 0xff291400, 0x0000a1a4,
|
slouken@1895
|
1652 |
0xff311400, 0x0000c2a4, 0xff391400, 0x0000e2a4,
|
slouken@1895
|
1653 |
0xff411400, 0x000000ac, 0xff4a1400, 0x000020ac,
|
slouken@1895
|
1654 |
0xff521400, 0x000040ac, 0xff5a1400, 0x000061ac,
|
slouken@1895
|
1655 |
0xff621400, 0x000081ac, 0xff6a1400, 0x0000a1ac,
|
slouken@1895
|
1656 |
0xff731400, 0x0000c2ac, 0xff7b1400, 0x0000e2ac,
|
slouken@1895
|
1657 |
0xff831400, 0x000000b4, 0xff8b1400, 0x000020b4,
|
slouken@1895
|
1658 |
0xff941400, 0x000040b4, 0xff9c1400, 0x000061b4,
|
slouken@1895
|
1659 |
0xffa41400, 0x000081b4, 0xffac1400, 0x0000a1b4,
|
slouken@1895
|
1660 |
0xffb41400, 0x0000c2b4, 0xffbd1400, 0x0000e2b4,
|
slouken@1895
|
1661 |
0xffc51400, 0x000000bd, 0xffcd1400, 0x000020bd,
|
slouken@1895
|
1662 |
0xffd51400, 0x000040bd, 0xffde1400, 0x000061bd,
|
slouken@1895
|
1663 |
0xffe61400, 0x000081bd, 0xffee1400, 0x0000a1bd,
|
slouken@1895
|
1664 |
0xfff61400, 0x0000c2bd, 0xffff1400, 0x0000e2bd,
|
slouken@1895
|
1665 |
0xff001800, 0x000000c5, 0xff081800, 0x000020c5,
|
slouken@1895
|
1666 |
0xff101800, 0x000040c5, 0xff181800, 0x000061c5,
|
slouken@1895
|
1667 |
0xff201800, 0x000081c5, 0xff291800, 0x0000a1c5,
|
slouken@1895
|
1668 |
0xff311800, 0x0000c2c5, 0xff391800, 0x0000e2c5,
|
slouken@1895
|
1669 |
0xff411800, 0x000000cd, 0xff4a1800, 0x000020cd,
|
slouken@1895
|
1670 |
0xff521800, 0x000040cd, 0xff5a1800, 0x000061cd,
|
slouken@1895
|
1671 |
0xff621800, 0x000081cd, 0xff6a1800, 0x0000a1cd,
|
slouken@1895
|
1672 |
0xff731800, 0x0000c2cd, 0xff7b1800, 0x0000e2cd,
|
slouken@1895
|
1673 |
0xff831800, 0x000000d5, 0xff8b1800, 0x000020d5,
|
slouken@1895
|
1674 |
0xff941800, 0x000040d5, 0xff9c1800, 0x000061d5,
|
slouken@1895
|
1675 |
0xffa41800, 0x000081d5, 0xffac1800, 0x0000a1d5,
|
slouken@1895
|
1676 |
0xffb41800, 0x0000c2d5, 0xffbd1800, 0x0000e2d5,
|
slouken@1895
|
1677 |
0xffc51800, 0x000000de, 0xffcd1800, 0x000020de,
|
slouken@1895
|
1678 |
0xffd51800, 0x000040de, 0xffde1800, 0x000061de,
|
slouken@1895
|
1679 |
0xffe61800, 0x000081de, 0xffee1800, 0x0000a1de,
|
slouken@1895
|
1680 |
0xfff61800, 0x0000c2de, 0xffff1800, 0x0000e2de,
|
slouken@1895
|
1681 |
0xff001c00, 0x000000e6, 0xff081c00, 0x000020e6,
|
slouken@1895
|
1682 |
0xff101c00, 0x000040e6, 0xff181c00, 0x000061e6,
|
slouken@1895
|
1683 |
0xff201c00, 0x000081e6, 0xff291c00, 0x0000a1e6,
|
slouken@1895
|
1684 |
0xff311c00, 0x0000c2e6, 0xff391c00, 0x0000e2e6,
|
slouken@1895
|
1685 |
0xff411c00, 0x000000ee, 0xff4a1c00, 0x000020ee,
|
slouken@1895
|
1686 |
0xff521c00, 0x000040ee, 0xff5a1c00, 0x000061ee,
|
slouken@1895
|
1687 |
0xff621c00, 0x000081ee, 0xff6a1c00, 0x0000a1ee,
|
slouken@1895
|
1688 |
0xff731c00, 0x0000c2ee, 0xff7b1c00, 0x0000e2ee,
|
slouken@1895
|
1689 |
0xff831c00, 0x000000f6, 0xff8b1c00, 0x000020f6,
|
slouken@1895
|
1690 |
0xff941c00, 0x000040f6, 0xff9c1c00, 0x000061f6,
|
slouken@1895
|
1691 |
0xffa41c00, 0x000081f6, 0xffac1c00, 0x0000a1f6,
|
slouken@1895
|
1692 |
0xffb41c00, 0x0000c2f6, 0xffbd1c00, 0x0000e2f6,
|
slouken@1895
|
1693 |
0xffc51c00, 0x000000ff, 0xffcd1c00, 0x000020ff,
|
slouken@1895
|
1694 |
0xffd51c00, 0x000040ff, 0xffde1c00, 0x000061ff,
|
slouken@1895
|
1695 |
0xffe61c00, 0x000081ff, 0xffee1c00, 0x0000a1ff,
|
slouken@1895
|
1696 |
0xfff61c00, 0x0000c2ff, 0xffff1c00, 0x0000e2ff
|
slouken@0
|
1697 |
};
|
slouken@2735
|
1698 |
|
slouken@1895
|
1699 |
static void
|
slouken@1895
|
1700 |
Blit_RGB565_ABGR8888(SDL_BlitInfo * info)
|
slouken@0
|
1701 |
{
|
slouken@0
|
1702 |
Blit_RGB565_32(info, RGB565_ABGR8888_LUT);
|
slouken@0
|
1703 |
}
|
slouken@0
|
1704 |
|
slouken@0
|
1705 |
/* Special optimized blit for RGB 5-6-5 --> RGBA 8-8-8-8 */
|
slouken@91
|
1706 |
static const Uint32 RGB565_RGBA8888_LUT[512] = {
|
slouken@1895
|
1707 |
0x000000ff, 0x00000000, 0x000008ff, 0x00200000,
|
slouken@1895
|
1708 |
0x000010ff, 0x00400000, 0x000018ff, 0x00610000,
|
slouken@1895
|
1709 |
0x000020ff, 0x00810000, 0x000029ff, 0x00a10000,
|
slouken@1895
|
1710 |
0x000031ff, 0x00c20000, 0x000039ff, 0x00e20000,
|
slouken@1895
|
1711 |
0x000041ff, 0x08000000, 0x00004aff, 0x08200000,
|
slouken@1895
|
1712 |
0x000052ff, 0x08400000, 0x00005aff, 0x08610000,
|
slouken@1895
|
1713 |
0x000062ff, 0x08810000, 0x00006aff, 0x08a10000,
|
slouken@1895
|
1714 |
0x000073ff, 0x08c20000, 0x00007bff, 0x08e20000,
|
slouken@1895
|
1715 |
0x000083ff, 0x10000000, 0x00008bff, 0x10200000,
|
slouken@1895
|
1716 |
0x000094ff, 0x10400000, 0x00009cff, 0x10610000,
|
slouken@1895
|
1717 |
0x0000a4ff, 0x10810000, 0x0000acff, 0x10a10000,
|
slouken@1895
|
1718 |
0x0000b4ff, 0x10c20000, 0x0000bdff, 0x10e20000,
|
slouken@1895
|
1719 |
0x0000c5ff, 0x18000000, 0x0000cdff, 0x18200000,
|
slouken@1895
|
1720 |
0x0000d5ff, 0x18400000, 0x0000deff, 0x18610000,
|
slouken@1895
|
1721 |
0x0000e6ff, 0x18810000, 0x0000eeff, 0x18a10000,
|
slouken@1895
|
1722 |
0x0000f6ff, 0x18c20000, 0x0000ffff, 0x18e20000,
|
slouken@1895
|
1723 |
0x000400ff, 0x20000000, 0x000408ff, 0x20200000,
|
slouken@1895
|
1724 |
0x000410ff, 0x20400000, 0x000418ff, 0x20610000,
|
slouken@1895
|
1725 |
0x000420ff, 0x20810000, 0x000429ff, 0x20a10000,
|
slouken@1895
|
1726 |
0x000431ff, 0x20c20000, 0x000439ff, 0x20e20000,
|
slouken@1895
|
1727 |
0x000441ff, 0x29000000, 0x00044aff, 0x29200000,
|
slouken@1895
|
1728 |
0x000452ff, 0x29400000, 0x00045aff, 0x29610000,
|
slouken@1895
|
1729 |
0x000462ff, 0x29810000, 0x00046aff, 0x29a10000,
|
slouken@1895
|
1730 |
0x000473ff, 0x29c20000, 0x00047bff, 0x29e20000,
|
slouken@1895
|
1731 |
0x000483ff, 0x31000000, 0x00048bff, 0x31200000,
|
slouken@1895
|
1732 |
0x000494ff, 0x31400000, 0x00049cff, 0x31610000,
|
slouken@1895
|
1733 |
0x0004a4ff, 0x31810000, 0x0004acff, 0x31a10000,
|
slouken@1895
|
1734 |
0x0004b4ff, 0x31c20000, 0x0004bdff, 0x31e20000,
|
slouken@1895
|
1735 |
0x0004c5ff, 0x39000000, 0x0004cdff, 0x39200000,
|
slouken@1895
|
1736 |
0x0004d5ff, 0x39400000, 0x0004deff, 0x39610000,
|
slouken@1895
|
1737 |
0x0004e6ff, 0x39810000, 0x0004eeff, 0x39a10000,
|
slouken@1895
|
1738 |
0x0004f6ff, 0x39c20000, 0x0004ffff, 0x39e20000,
|
slouken@1895
|
1739 |
0x000800ff, 0x41000000, 0x000808ff, 0x41200000,
|
slouken@1895
|
1740 |
0x000810ff, 0x41400000, 0x000818ff, 0x41610000,
|
slouken@1895
|
1741 |
0x000820ff, 0x41810000, 0x000829ff, 0x41a10000,
|
slouken@1895
|
1742 |
0x000831ff, 0x41c20000, 0x000839ff, 0x41e20000,
|
slouken@1895
|
1743 |
0x000841ff, 0x4a000000, 0x00084aff, 0x4a200000,
|
slouken@1895
|
1744 |
0x000852ff, 0x4a400000, 0x00085aff, 0x4a610000,
|
slouken@1895
|
1745 |
0x000862ff, 0x4a810000, 0x00086aff, 0x4aa10000,
|
slouken@1895
|
1746 |
0x000873ff, 0x4ac20000, 0x00087bff, 0x4ae20000,
|
slouken@1895
|
1747 |
0x000883ff, 0x52000000, 0x00088bff, 0x52200000,
|
slouken@1895
|
1748 |
0x000894ff, 0x52400000, 0x00089cff, 0x52610000,
|
slouken@1895
|
1749 |
0x0008a4ff, 0x52810000, 0x0008acff, 0x52a10000,
|
slouken@1895
|
1750 |
0x0008b4ff, 0x52c20000, 0x0008bdff, 0x52e20000,
|
slouken@1895
|
1751 |
0x0008c5ff, 0x5a000000, 0x0008cdff, 0x5a200000,
|
slouken@1895
|
1752 |
0x0008d5ff, 0x5a400000, 0x0008deff, 0x5a610000,
|
slouken@1895
|
1753 |
0x0008e6ff, 0x5a810000, 0x0008eeff, 0x5aa10000,
|
slouken@1895
|
1754 |
0x0008f6ff, 0x5ac20000, 0x0008ffff, 0x5ae20000,
|
slouken@1895
|
1755 |
0x000c00ff, 0x62000000, 0x000c08ff, 0x62200000,
|
slouken@1895
|
1756 |
0x000c10ff, 0x62400000, 0x000c18ff, 0x62610000,
|
slouken@1895
|
1757 |
0x000c20ff, 0x62810000, 0x000c29ff, 0x62a10000,
|
slouken@1895
|
1758 |
0x000c31ff, 0x62c20000, 0x000c39ff, 0x62e20000,
|
slouken@1895
|
1759 |
0x000c41ff, 0x6a000000, 0x000c4aff, 0x6a200000,
|
slouken@1895
|
1760 |
0x000c52ff, 0x6a400000, 0x000c5aff, 0x6a610000,
|
slouken@1895
|
1761 |
0x000c62ff, 0x6a810000, 0x000c6aff, 0x6aa10000,
|
slouken@1895
|
1762 |
0x000c73ff, 0x6ac20000, 0x000c7bff, 0x6ae20000,
|
slouken@1895
|
1763 |
0x000c83ff, 0x73000000, 0x000c8bff, 0x73200000,
|
slouken@1895
|
1764 |
0x000c94ff, 0x73400000, 0x000c9cff, 0x73610000,
|
slouken@1895
|
1765 |
0x000ca4ff, 0x73810000, 0x000cacff, 0x73a10000,
|
slouken@1895
|
1766 |
0x000cb4ff, 0x73c20000, 0x000cbdff, 0x73e20000,
|
slouken@1895
|
1767 |
0x000cc5ff, 0x7b000000, 0x000ccdff, 0x7b200000,
|
slouken@1895
|
1768 |
0x000cd5ff, 0x7b400000, 0x000cdeff, 0x7b610000,
|
slouken@1895
|
1769 |
0x000ce6ff, 0x7b810000, 0x000ceeff, 0x7ba10000,
|
slouken@1895
|
1770 |
0x000cf6ff, 0x7bc20000, 0x000cffff, 0x7be20000,
|
slouken@1895
|
1771 |
0x001000ff, 0x83000000, 0x001008ff, 0x83200000,
|
slouken@1895
|
1772 |
0x001010ff, 0x83400000, 0x001018ff, 0x83610000,
|
slouken@1895
|
1773 |
0x001020ff, 0x83810000, 0x001029ff, 0x83a10000,
|
slouken@1895
|
1774 |
0x001031ff, 0x83c20000, 0x001039ff, 0x83e20000,
|
slouken@1895
|
1775 |
0x001041ff, 0x8b000000, 0x00104aff, 0x8b200000,
|
slouken@1895
|
1776 |
0x001052ff, 0x8b400000, 0x00105aff, 0x8b610000,
|
slouken@1895
|
1777 |
0x001062ff, 0x8b810000, 0x00106aff, 0x8ba10000,
|
slouken@1895
|
1778 |
0x001073ff, 0x8bc20000, 0x00107bff, 0x8be20000,
|
slouken@1895
|
1779 |
0x001083ff, 0x94000000, 0x00108bff, 0x94200000,
|
slouken@1895
|
1780 |
0x001094ff, 0x94400000, 0x00109cff, 0x94610000,
|
slouken@1895
|
1781 |
0x0010a4ff, 0x94810000, 0x0010acff, 0x94a10000,
|
slouken@1895
|
1782 |
0x0010b4ff, 0x94c20000, 0x0010bdff, 0x94e20000,
|
slouken@1895
|
1783 |
0x0010c5ff, 0x9c000000, 0x0010cdff, 0x9c200000,
|
slouken@1895
|
1784 |
0x0010d5ff, 0x9c400000, 0x0010deff, 0x9c610000,
|
slouken@1895
|
1785 |
0x0010e6ff, 0x9c810000, 0x0010eeff, 0x9ca10000,
|
slouken@1895
|
1786 |
0x0010f6ff, 0x9cc20000, 0x0010ffff, 0x9ce20000,
|
slouken@1895
|
1787 |
0x001400ff, 0xa4000000, 0x001408ff, 0xa4200000,
|
slouken@1895
|
1788 |
0x001410ff, 0xa4400000, 0x001418ff, 0xa4610000,
|
slouken@1895
|
1789 |
0x001420ff, 0xa4810000, 0x001429ff, 0xa4a10000,
|
slouken@1895
|
1790 |
0x001431ff, 0xa4c20000, 0x001439ff, 0xa4e20000,
|
slouken@1895
|
1791 |
0x001441ff, 0xac000000, 0x00144aff, 0xac200000,
|
slouken@1895
|
1792 |
0x001452ff, 0xac400000, 0x00145aff, 0xac610000,
|
slouken@1895
|
1793 |
0x001462ff, 0xac810000, 0x00146aff, 0xaca10000,
|
slouken@1895
|
1794 |
0x001473ff, 0xacc20000, 0x00147bff, 0xace20000,
|
slouken@1895
|
1795 |
0x001483ff, 0xb4000000, 0x00148bff, 0xb4200000,
|
slouken@1895
|
1796 |
0x001494ff, 0xb4400000, 0x00149cff, 0xb4610000,
|
slouken@1895
|
1797 |
0x0014a4ff, 0xb4810000, 0x0014acff, 0xb4a10000,
|
slouken@1895
|
1798 |
0x0014b4ff, 0xb4c20000, 0x0014bdff, 0xb4e20000,
|
slouken@1895
|
1799 |
0x0014c5ff, 0xbd000000, 0x0014cdff, 0xbd200000,
|
slouken@1895
|
1800 |
0x0014d5ff, 0xbd400000, 0x0014deff, 0xbd610000,
|
slouken@1895
|
1801 |
0x0014e6ff, 0xbd810000, 0x0014eeff, 0xbda10000,
|
slouken@1895
|
1802 |
0x0014f6ff, 0xbdc20000, 0x0014ffff, 0xbde20000,
|
slouken@1895
|
1803 |
0x001800ff, 0xc5000000, 0x001808ff, 0xc5200000,
|
slouken@1895
|
1804 |
0x001810ff, 0xc5400000, 0x001818ff, 0xc5610000,
|
slouken@1895
|
1805 |
0x001820ff, 0xc5810000, 0x001829ff, 0xc5a10000,
|
slouken@1895
|
1806 |
0x001831ff, 0xc5c20000, 0x001839ff, 0xc5e20000,
|
slouken@1895
|
1807 |
0x001841ff, 0xcd000000, 0x00184aff, 0xcd200000,
|
slouken@1895
|
1808 |
0x001852ff, 0xcd400000, 0x00185aff, 0xcd610000,
|
slouken@1895
|
1809 |
0x001862ff, 0xcd810000, 0x00186aff, 0xcda10000,
|
slouken@1895
|
1810 |
0x001873ff, 0xcdc20000, 0x00187bff, 0xcde20000,
|
slouken@1895
|
1811 |
0x001883ff, 0xd5000000, 0x00188bff, 0xd5200000,
|
slouken@1895
|
1812 |
0x001894ff, 0xd5400000, 0x00189cff, 0xd5610000,
|
slouken@1895
|
1813 |
0x0018a4ff, 0xd5810000, 0x0018acff, 0xd5a10000,
|
slouken@1895
|
1814 |
0x0018b4ff, 0xd5c20000, 0x0018bdff, 0xd5e20000,
|
slouken@1895
|
1815 |
0x0018c5ff, 0xde000000, 0x0018cdff, 0xde200000,
|
slouken@1895
|
1816 |
0x0018d5ff, 0xde400000, 0x0018deff, 0xde610000,
|
slouken@1895
|
1817 |
0x0018e6ff, 0xde810000, 0x0018eeff, 0xdea10000,
|
slouken@1895
|
1818 |
0x0018f6ff, 0xdec20000, 0x0018ffff, 0xdee20000,
|
slouken@1895
|
1819 |
0x001c00ff, 0xe6000000, 0x001c08ff, 0xe6200000,
|
slouken@1895
|
1820 |
0x001c10ff, 0xe6400000, 0x001c18ff, 0xe6610000,
|
slouken@1895
|
1821 |
0x001c20ff, 0xe6810000, 0x001c29ff, 0xe6a10000,
|
slouken@1895
|
1822 |
0x001c31ff, 0xe6c20000, 0x001c39ff, 0xe6e20000,
|
slouken@1895
|
1823 |
0x001c41ff, 0xee000000, 0x001c4aff, 0xee200000,
|
slouken@1895
|
1824 |
0x001c52ff, 0xee400000, 0x001c5aff, 0xee610000,
|
slouken@1895
|
1825 |
0x001c62ff, 0xee810000, 0x001c6aff, 0xeea10000,
|
slouken@1895
|
1826 |
0x001c73ff, 0xeec20000, 0x001c7bff, 0xeee20000,
|
slouken@1895
|
1827 |
0x001c83ff, 0xf6000000, 0x001c8bff, 0xf6200000,
|
slouken@1895
|
1828 |
0x001c94ff, 0xf6400000, 0x001c9cff, 0xf6610000,
|
slouken@1895
|
1829 |
0x001ca4ff, 0xf6810000, 0x001cacff, 0xf6a10000,
|
slouken@1895
|
1830 |
0x001cb4ff, 0xf6c20000, 0x001cbdff, 0xf6e20000,
|
slouken@1895
|
1831 |
0x001cc5ff, 0xff000000, 0x001ccdff, 0xff200000,
|
slouken@1895
|
1832 |
0x001cd5ff, 0xff400000, 0x001cdeff, 0xff610000,
|
slouken@1895
|
1833 |
0x001ce6ff, 0xff810000, 0x001ceeff, 0xffa10000,
|
slouken@1895
|
1834 |
0x001cf6ff, 0xffc20000, 0x001cffff, 0xffe20000,
|
slouken@0
|
1835 |
};
|
slouken@2735
|
1836 |
|
slouken@1895
|
1837 |
static void
|
slouken@1895
|
1838 |
Blit_RGB565_RGBA8888(SDL_BlitInfo * info)
|
slouken@0
|
1839 |
{
|
slouken@0
|
1840 |
Blit_RGB565_32(info, RGB565_RGBA8888_LUT);
|
slouken@0
|
1841 |
}
|
slouken@0
|
1842 |
|
slouken@0
|
1843 |
/* Special optimized blit for RGB 5-6-5 --> BGRA 8-8-8-8 */
|
slouken@91
|
1844 |
static const Uint32 RGB565_BGRA8888_LUT[512] = {
|
slouken@1895
|
1845 |
0x00000000, 0x000000ff, 0x08000000, 0x002000ff,
|
slouken@1895
|
1846 |
0x10000000, 0x004000ff, 0x18000000, 0x006100ff,
|
slouken@1895
|
1847 |
0x20000000, 0x008100ff, 0x29000000, 0x00a100ff,
|
slouken@1895
|
1848 |
0x31000000, 0x00c200ff, 0x39000000, 0x00e200ff,
|
slouken@1895
|
1849 |
0x41000000, 0x000008ff, 0x4a000000, 0x002008ff,
|
slouken@1895
|
1850 |
0x52000000, 0x004008ff, 0x5a000000, 0x006108ff,
|
slouken@1895
|
1851 |
0x62000000, 0x008108ff, 0x6a000000, 0x00a108ff,
|
slouken@1895
|
1852 |
0x73000000, 0x00c208ff, 0x7b000000, 0x00e208ff,
|
slouken@1895
|
1853 |
0x83000000, 0x000010ff, 0x8b000000, 0x002010ff,
|
slouken@1895
|
1854 |
0x94000000, 0x004010ff, 0x9c000000, 0x006110ff,
|
slouken@1895
|
1855 |
0xa4000000, 0x008110ff, 0xac000000, 0x00a110ff,
|
slouken@1895
|
1856 |
0xb4000000, 0x00c210ff, 0xbd000000, 0x00e210ff,
|
slouken@1895
|
1857 |
0xc5000000, 0x000018ff, 0xcd000000, 0x002018ff,
|
slouken@1895
|
1858 |
0xd5000000, 0x004018ff, 0xde000000, 0x006118ff,
|
slouken@1895
|
1859 |
0xe6000000, 0x008118ff, 0xee000000, 0x00a118ff,
|
slouken@1895
|
1860 |
0xf6000000, 0x00c218ff, 0xff000000, 0x00e218ff,
|
slouken@1895
|
1861 |
0x00040000, 0x000020ff, 0x08040000, 0x002020ff,
|
slouken@1895
|
1862 |
0x10040000, 0x004020ff, 0x18040000, 0x006120ff,
|
slouken@1895
|
1863 |
0x20040000, 0x008120ff, 0x29040000, 0x00a120ff,
|
slouken@1895
|
1864 |
0x31040000, 0x00c220ff, 0x39040000, 0x00e220ff,
|
slouken@1895
|
1865 |
0x41040000, 0x000029ff, 0x4a040000, 0x002029ff,
|
slouken@1895
|
1866 |
0x52040000, 0x004029ff, 0x5a040000, 0x006129ff,
|
slouken@1895
|
1867 |
0x62040000, 0x008129ff, 0x6a040000, 0x00a129ff,
|
slouken@1895
|
1868 |
0x73040000, 0x00c229ff, 0x7b040000, 0x00e229ff,
|
slouken@1895
|
1869 |
0x83040000, 0x000031ff, 0x8b040000, 0x002031ff,
|
slouken@1895
|
1870 |
0x94040000, 0x004031ff, 0x9c040000, 0x006131ff,
|
slouken@1895
|
1871 |
0xa4040000, 0x008131ff, 0xac040000, 0x00a131ff,
|
slouken@1895
|
1872 |
0xb4040000, 0x00c231ff, 0xbd040000, 0x00e231ff,
|
slouken@1895
|
1873 |
0xc5040000, 0x000039ff, 0xcd040000, 0x002039ff,
|
slouken@1895
|
1874 |
0xd5040000, 0x004039ff, 0xde040000, 0x006139ff,
|
slouken@1895
|
1875 |
0xe6040000, 0x008139ff, 0xee040000, 0x00a139ff,
|
slouken@1895
|
1876 |
0xf6040000, 0x00c239ff, 0xff040000, 0x00e239ff,
|
slouken@1895
|
1877 |
0x00080000, 0x000041ff, 0x08080000, 0x002041ff,
|
slouken@1895
|
1878 |
0x10080000, 0x004041ff, 0x18080000, 0x006141ff,
|
slouken@1895
|
1879 |
0x20080000, 0x008141ff, 0x29080000, 0x00a141ff,
|
slouken@1895
|
1880 |
0x31080000, 0x00c241ff, 0x39080000, 0x00e241ff,
|
slouken@1895
|
1881 |
0x41080000, 0x00004aff, 0x4a080000, 0x00204aff,
|
slouken@1895
|
1882 |
0x52080000, 0x00404aff, 0x5a080000, 0x00614aff,
|
slouken@1895
|
1883 |
0x62080000, 0x00814aff, 0x6a080000, 0x00a14aff,
|
slouken@1895
|
1884 |
0x73080000, 0x00c24aff, 0x7b080000, 0x00e24aff,
|
slouken@1895
|
1885 |
0x83080000, 0x000052ff, 0x8b080000, 0x002052ff,
|
slouken@1895
|
1886 |
0x94080000, 0x004052ff, 0x9c080000, 0x006152ff,
|
slouken@1895
|
1887 |
0xa4080000, 0x008152ff, 0xac080000, 0x00a152ff,
|
slouken@1895
|
1888 |
0xb4080000, 0x00c252ff, 0xbd080000, 0x00e252ff,
|
slouken@1895
|
1889 |
0xc5080000, 0x00005aff, 0xcd080000, 0x00205aff,
|
slouken@1895
|
1890 |
0xd5080000, 0x00405aff, 0xde080000, 0x00615aff,
|
slouken@1895
|
1891 |
0xe6080000, 0x00815aff, 0xee080000, 0x00a15aff,
|
slouken@1895
|
1892 |
0xf6080000, 0x00c25aff, 0xff080000, 0x00e25aff,
|
slouken@1895
|
1893 |
0x000c0000, 0x000062ff, 0x080c0000, 0x002062ff,
|
slouken@1895
|
1894 |
0x100c0000, 0x004062ff, 0x180c0000, 0x006162ff,
|
slouken@1895
|
1895 |
0x200c0000, 0x008162ff, 0x290c0000, 0x00a162ff,
|
slouken@1895
|
1896 |
0x310c0000, 0x00c262ff, 0x390c0000, 0x00e262ff,
|
slouken@1895
|
1897 |
0x410c0000, 0x00006aff, 0x4a0c0000, 0x00206aff,
|
slouken@1895
|
1898 |
0x520c0000, 0x00406aff, 0x5a0c0000, 0x00616aff,
|
slouken@1895
|
1899 |
0x620c0000, 0x00816aff, 0x6a0c0000, 0x00a16aff,
|
slouken@1895
|
1900 |
0x730c0000, 0x00c26aff, 0x7b0c0000, 0x00e26aff,
|
slouken@1895
|
1901 |
0x830c0000, 0x000073ff, 0x8b0c0000, 0x002073ff,
|
slouken@1895
|
1902 |
0x940c0000, 0x004073ff, 0x9c0c0000, 0x006173ff,
|
slouken@1895
|
1903 |
0xa40c0000, 0x008173ff, 0xac0c0000, 0x00a173ff,
|
slouken@1895
|
1904 |
0xb40c0000, 0x00c273ff, 0xbd0c0000, 0x00e273ff,
|
slouken@1895
|
1905 |
0xc50c0000, 0x00007bff, 0xcd0c0000, 0x00207bff,
|
slouken@1895
|
1906 |
0xd50c0000, 0x00407bff, 0xde0c0000, 0x00617bff,
|
slouken@1895
|
1907 |
0xe60c0000, 0x00817bff, 0xee0c0000, 0x00a17bff,
|
slouken@1895
|
1908 |
0xf60c0000, 0x00c27bff, 0xff0c0000, 0x00e27bff,
|
slouken@1895
|
1909 |
0x00100000, 0x000083ff, 0x08100000, 0x002083ff,
|
slouken@1895
|
1910 |
0x10100000, 0x004083ff, 0x18100000, 0x006183ff,
|
slouken@1895
|
1911 |
0x20100000, 0x008183ff, 0x29100000, 0x00a183ff,
|
slouken@1895
|
1912 |
0x31100000, 0x00c283ff, 0x39100000, 0x00e283ff,
|
slouken@1895
|
1913 |
0x41100000, 0x00008bff, 0x4a100000, 0x00208bff,
|
slouken@1895
|
1914 |
0x52100000, 0x00408bff, 0x5a100000, 0x00618bff,
|
slouken@1895
|
1915 |
0x62100000, 0x00818bff, 0x6a100000, 0x00a18bff,
|
slouken@1895
|
1916 |
0x73100000, 0x00c28bff, 0x7b100000, 0x00e28bff,
|
slouken@1895
|
1917 |
0x83100000, 0x000094ff, 0x8b100000, 0x002094ff,
|
slouken@1895
|
1918 |
0x94100000, 0x004094ff, 0x9c100000, 0x006194ff,
|
slouken@1895
|
1919 |
0xa4100000, 0x008194ff, 0xac100000, 0x00a194ff,
|
slouken@1895
|
1920 |
0xb4100000, 0x00c294ff, 0xbd100000, 0x00e294ff,
|
slouken@1895
|
1921 |
0xc5100000, 0x00009cff, 0xcd100000, 0x00209cff,
|
slouken@1895
|
1922 |
0xd5100000, 0x00409cff, 0xde100000, 0x00619cff,
|
slouken@1895
|
1923 |
0xe6100000, 0x00819cff, 0xee100000, 0x00a19cff,
|
slouken@1895
|
1924 |
0xf6100000, 0x00c29cff, 0xff100000, 0x00e29cff,
|
slouken@1895
|
1925 |
0x00140000, 0x0000a4ff, 0x08140000, 0x0020a4ff,
|
slouken@1895
|
1926 |
0x10140000, 0x0040a4ff, 0x18140000, 0x0061a4ff,
|
slouken@1895
|
1927 |
0x20140000, 0x0081a4ff, 0x29140000, 0x00a1a4ff,
|
slouken@1895
|
1928 |
0x31140000, 0x00c2a4ff, 0x39140000, 0x00e2a4ff,
|
slouken@1895
|
1929 |
0x41140000, 0x0000acff, 0x4a140000, 0x0020acff,
|
slouken@1895
|
1930 |
0x52140000, 0x0040acff, 0x5a140000, 0x0061acff,
|
slouken@1895
|
1931 |
0x62140000, 0x0081acff, 0x6a140000, 0x00a1acff,
|
slouken@1895
|
1932 |
0x73140000, 0x00c2acff, 0x7b140000, 0x00e2acff,
|
slouken@1895
|
1933 |
0x83140000, 0x0000b4ff, 0x8b140000, 0x0020b4ff,
|
slouken@1895
|
1934 |
0x94140000, 0x0040b4ff, 0x9c140000, 0x0061b4ff,
|
slouken@1895
|
1935 |
0xa4140000, 0x0081b4ff, 0xac140000, 0x00a1b4ff,
|
slouken@1895
|
1936 |
0xb4140000, 0x00c2b4ff, 0xbd140000, 0x00e2b4ff,
|
slouken@1895
|
1937 |
0xc5140000, 0x0000bdff, 0xcd140000, 0x0020bdff,
|
slouken@1895
|
1938 |
0xd5140000, 0x0040bdff, 0xde140000, 0x0061bdff,
|
slouken@1895
|
1939 |
0xe6140000, 0x0081bdff, 0xee140000, 0x00a1bdff,
|
slouken@1895
|
1940 |
0xf6140000, 0x00c2bdff, 0xff140000, 0x00e2bdff,
|
slouken@1895
|
1941 |
0x00180000, 0x0000c5ff, 0x08180000, 0x0020c5ff,
|
slouken@1895
|
1942 |
0x10180000, 0x0040c5ff, 0x18180000, 0x0061c5ff,
|
slouken@1895
|
1943 |
0x20180000, 0x0081c5ff, 0x29180000, 0x00a1c5ff,
|
slouken@1895
|
1944 |
0x31180000, 0x00c2c5ff, 0x39180000, 0x00e2c5ff,
|
slouken@1895
|
1945 |
0x41180000, 0x0000cdff, 0x4a180000, 0x0020cdff,
|
slouken@1895
|
1946 |
0x52180000, 0x0040cdff, 0x5a180000, 0x0061cdff,
|
slouken@1895
|
1947 |
0x62180000, 0x0081cdff, 0x6a180000, 0x00a1cdff,
|
slouken@1895
|
1948 |
0x73180000, 0x00c2cdff, 0x7b180000, 0x00e2cdff,
|
slouken@1895
|
1949 |
0x83180000, 0x0000d5ff, 0x8b180000, 0x0020d5ff,
|
slouken@1895
|
1950 |
0x94180000, 0x0040d5ff, 0x9c180000, 0x0061d5ff,
|
slouken@1895
|
1951 |
0xa4180000, 0x0081d5ff, 0xac180000, 0x00a1d5ff,
|
slouken@1895
|
1952 |
0xb4180000, 0x00c2d5ff, 0xbd180000, 0x00e2d5ff,
|
slouken@1895
|
1953 |
0xc5180000, 0x0000deff, 0xcd180000, 0x0020deff,
|
slouken@1895
|
1954 |
0xd5180000, 0x0040deff, 0xde180000, 0x0061deff,
|
slouken@1895
|
1955 |
0xe6180000, 0x0081deff, 0xee180000, 0x00a1deff,
|
slouken@1895
|
1956 |
0xf6180000, 0x00c2deff, 0xff180000, 0x00e2deff,
|
slouken@1895
|
1957 |
0x001c0000, 0x0000e6ff, 0x081c0000, 0x0020e6ff,
|
slouken@1895
|
1958 |
0x101c0000, 0x0040e6ff, 0x181c0000, 0x0061e6ff,
|
slouken@1895
|
1959 |
0x201c0000, 0x0081e6ff, 0x291c0000, 0x00a1e6ff,
|
slouken@1895
|
1960 |
0x311c0000, 0x00c2e6ff, 0x391c0000, 0x00e2e6ff,
|
slouken@1895
|
1961 |
0x411c0000, 0x0000eeff, 0x4a1c0000, 0x0020eeff,
|
slouken@1895
|
1962 |
0x521c0000, 0x0040eeff, 0x5a1c0000, 0x0061eeff,
|
slouken@1895
|
1963 |
0x621c0000, 0x0081eeff, 0x6a1c0000, 0x00a1eeff,
|
slouken@1895
|
1964 |
0x731c0000, 0x00c2eeff, 0x7b1c0000, 0x00e2eeff,
|
slouken@1895
|
1965 |
0x831c0000, 0x0000f6ff, 0x8b1c0000, 0x0020f6ff,
|
slouken@1895
|
1966 |
0x941c0000, 0x0040f6ff, 0x9c1c0000, 0x0061f6ff,
|
slouken@1895
|
1967 |
0xa41c0000, 0x0081f6ff, 0xac1c0000, 0x00a1f6ff,
|
slouken@1895
|
1968 |
0xb41c0000, 0x00c2f6ff, 0xbd1c0000, 0x00e2f6ff,
|
slouken@1895
|
1969 |
0xc51c0000, 0x0000ffff, 0xcd1c0000, 0x0020ffff,
|
slouken@1895
|
1970 |
0xd51c0000, 0x0040ffff, 0xde1c0000, 0x0061ffff,
|
slouken@1895
|
1971 |
0xe61c0000, 0x0081ffff, 0xee1c0000, 0x00a1ffff,
|
slouken@1895
|
1972 |
0xf61c0000, 0x00c2ffff, 0xff1c0000, 0x00e2ffff
|
slouken@0
|
1973 |
};
|
slouken@2735
|
1974 |
|
slouken@1895
|
1975 |
static void
|
slouken@1895
|
1976 |
Blit_RGB565_BGRA8888(SDL_BlitInfo * info)
|
slouken@0
|
1977 |
{
|
slouken@0
|
1978 |
Blit_RGB565_32(info, RGB565_BGRA8888_LUT);
|
slouken@0
|
1979 |
}
|
slouken@0
|
1980 |
|
slouken@1895
|
1981 |
static void
|
slouken@1895
|
1982 |
BlitNto1(SDL_BlitInfo * info)
|
slouken@0
|
1983 |
{
|
slouken@0
|
1984 |
#ifndef USE_DUFFS_LOOP
|
slouken@1895
|
1985 |
int c;
|
slouken@0
|
1986 |
#endif
|
slouken@1895
|
1987 |
int width, height;
|
slouken@1895
|
1988 |
Uint8 *src;
|
slouken@1895
|
1989 |
const Uint8 *map;
|
slouken@1895
|
1990 |
Uint8 *dst;
|
slouken@1895
|
1991 |
int srcskip, dstskip;
|
slouken@1895
|
1992 |
int srcbpp;
|
slouken@1895
|
1993 |
Uint32 Pixel;
|
slouken@1895
|
1994 |
int sR, sG, sB;
|
slouken@1895
|
1995 |
SDL_PixelFormat *srcfmt;
|
slouken@0
|
1996 |
|
slouken@1895
|
1997 |
/* Set up some basic variables */
|
slouken@2262
|
1998 |
width = info->dst_w;
|
slouken@2262
|
1999 |
height = info->dst_h;
|
slouken@2262
|
2000 |
src = info->src;
|
slouken@2267
|
2001 |
srcskip = info->src_skip;
|
slouken@2262
|
2002 |
dst = info->dst;
|
slouken@2267
|
2003 |
dstskip = info->dst_skip;
|
slouken@1895
|
2004 |
map = info->table;
|
slouken@2267
|
2005 |
srcfmt = info->src_fmt;
|
slouken@1895
|
2006 |
srcbpp = srcfmt->BytesPerPixel;
|
slouken@0
|
2007 |
|
slouken@1895
|
2008 |
if (map == NULL) {
|
slouken@1895
|
2009 |
while (height--) {
|
slouken@0
|
2010 |
#ifdef USE_DUFFS_LOOP
|
slouken@7208
|
2011 |
/* *INDENT-OFF* */
|
slouken@7208
|
2012 |
DUFFS_LOOP(
|
slouken@7208
|
2013 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,
|
slouken@7208
|
2014 |
sR, sG, sB);
|
slouken@7208
|
2015 |
if ( 1 ) {
|
slouken@7208
|
2016 |
/* Pack RGB into 8bit pixel */
|
slouken@7208
|
2017 |
*dst = ((sR>>5)<<(3+2))|
|
slouken@7208
|
2018 |
((sG>>5)<<(2)) |
|
slouken@7208
|
2019 |
((sB>>6)<<(0)) ;
|
slouken@7208
|
2020 |
}
|
slouken@7208
|
2021 |
dst++;
|
slouken@7208
|
2022 |
src += srcbpp;
|
slouken@7208
|
2023 |
, width);
|
slouken@7208
|
2024 |
/* *INDENT-ON* */
|
slouken@0
|
2025 |
#else
|
slouken@1895
|
2026 |
for (c = width; c; --c) {
|
slouken@1895
|
2027 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
|
slouken@1895
|
2028 |
if (1) {
|
slouken@1895
|
2029 |
/* Pack RGB into 8bit pixel */
|
slouken@1895
|
2030 |
*dst = ((sR >> 5) << (3 + 2)) |
|
slouken@1895
|
2031 |
((sG >> 5) << (2)) | ((sB >> 6) << (0));
|
slouken@1895
|
2032 |
}
|
slouken@1895
|
2033 |
dst++;
|
slouken@1895
|
2034 |
src += srcbpp;
|
slouken@1895
|
2035 |
}
|
slouken@0
|
2036 |
#endif
|
slouken@1895
|
2037 |
src += srcskip;
|
slouken@1895
|
2038 |
dst += dstskip;
|
slouken@1895
|
2039 |
}
|
slouken@1895
|
2040 |
} else {
|
slouken@1895
|
2041 |
while (height--) {
|
slouken@0
|
2042 |
#ifdef USE_DUFFS_LOOP
|
slouken@7208
|
2043 |
/* *INDENT-OFF* */
|
slouken@7208
|
2044 |
DUFFS_LOOP(
|
slouken@7208
|
2045 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,
|
slouken@7208
|
2046 |
sR, sG, sB);
|
slouken@7208
|
2047 |
if ( 1 ) {
|
slouken@7208
|
2048 |
/* Pack RGB into 8bit pixel */
|
slouken@7208
|
2049 |
*dst = map[((sR>>5)<<(3+2))|
|
slouken@7208
|
2050 |
((sG>>5)<<(2)) |
|
slouken@7208
|
2051 |
((sB>>6)<<(0)) ];
|
slouken@7208
|
2052 |
}
|
slouken@7208
|
2053 |
dst++;
|
slouken@7208
|
2054 |
src += srcbpp;
|
slouken@7208
|
2055 |
, width);
|
slouken@7208
|
2056 |
/* *INDENT-ON* */
|
slouken@0
|
2057 |
#else
|
slouken@1895
|
2058 |
for (c = width; c; --c) {
|
slouken@1895
|
2059 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
|
slouken@1895
|
2060 |
if (1) {
|
slouken@1895
|
2061 |
/* Pack RGB into 8bit pixel */
|
slouken@1895
|
2062 |
*dst = map[((sR >> 5) << (3 + 2)) |
|
slouken@1895
|
2063 |
((sG >> 5) << (2)) | ((sB >> 6) << (0))];
|
slouken@1895
|
2064 |
}
|
slouken@1895
|
2065 |
dst++;
|
slouken@1895
|
2066 |
src += srcbpp;
|
slouken@1895
|
2067 |
}
|
slouken@0
|
2068 |
#endif /* USE_DUFFS_LOOP */
|
slouken@1895
|
2069 |
src += srcskip;
|
slouken@1895
|
2070 |
dst += dstskip;
|
slouken@1895
|
2071 |
}
|
slouken@1895
|
2072 |
}
|
slouken@0
|
2073 |
}
|
icculus@1232
|
2074 |
|
icculus@1232
|
2075 |
/* blits 32 bit RGB<->RGBA with both surfaces having the same R,G,B fields */
|
slouken@1895
|
2076 |
static void
|
slouken@1895
|
2077 |
Blit4to4MaskAlpha(SDL_BlitInfo * info)
|
icculus@1232
|
2078 |
{
|
slouken@2262
|
2079 |
int width = info->dst_w;
|
slouken@2262
|
2080 |
int height = info->dst_h;
|
slouken@2262
|
2081 |
Uint32 *src = (Uint32 *) info->src;
|
slouken@2267
|
2082 |
int srcskip = info->src_skip;
|
slouken@2262
|
2083 |
Uint32 *dst = (Uint32 *) info->dst;
|
slouken@2267
|
2084 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2085 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@2267
|
2086 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
icculus@1232
|
2087 |
|
slouken@1895
|
2088 |
if (dstfmt->Amask) {
|
slouken@1895
|
2089 |
/* RGB->RGBA, SET_ALPHA */
|
slouken@2267
|
2090 |
Uint32 mask = (info->a >> dstfmt->Aloss) << dstfmt->Ashift;
|
icculus@1232
|
2091 |
|
slouken@1895
|
2092 |
while (height--) {
|
slouken@7208
|
2093 |
/* *INDENT-OFF* */
|
slouken@7208
|
2094 |
DUFFS_LOOP(
|
slouken@7208
|
2095 |
{
|
slouken@7208
|
2096 |
*dst = *src | mask;
|
slouken@7208
|
2097 |
++dst;
|
slouken@7208
|
2098 |
++src;
|
slouken@7208
|
2099 |
},
|
slouken@7208
|
2100 |
width);
|
slouken@7208
|
2101 |
/* *INDENT-ON* */
|
slouken@1895
|
2102 |
src = (Uint32 *) ((Uint8 *) src + srcskip);
|
slouken@1895
|
2103 |
dst = (Uint32 *) ((Uint8 *) dst + dstskip);
|
slouken@1895
|
2104 |
}
|
slouken@1895
|
2105 |
} else {
|
slouken@1895
|
2106 |
/* RGBA->RGB, NO_ALPHA */
|
slouken@1895
|
2107 |
Uint32 mask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;
|
icculus@1232
|
2108 |
|
slouken@1895
|
2109 |
while (height--) {
|
slouken@7208
|
2110 |
/* *INDENT-OFF* */
|
slouken@7208
|
2111 |
DUFFS_LOOP(
|
slouken@7208
|
2112 |
{
|
slouken@7208
|
2113 |
*dst = *src & mask;
|
slouken@7208
|
2114 |
++dst;
|
slouken@7208
|
2115 |
++src;
|
slouken@7208
|
2116 |
},
|
slouken@7208
|
2117 |
width);
|
slouken@7208
|
2118 |
/* *INDENT-ON* */
|
slouken@1895
|
2119 |
src = (Uint32 *) ((Uint8 *) src + srcskip);
|
slouken@1895
|
2120 |
dst = (Uint32 *) ((Uint8 *) dst + dstskip);
|
slouken@1895
|
2121 |
}
|
slouken@1895
|
2122 |
}
|
icculus@1232
|
2123 |
}
|
icculus@1232
|
2124 |
|
slouken@9583
|
2125 |
/* blits 32 bit RGBA<->RGBA with both surfaces having the same R,G,B,A fields */
|
slouken@9583
|
2126 |
static void
|
slouken@9583
|
2127 |
Blit4to4CopyAlpha(SDL_BlitInfo * info)
|
slouken@9583
|
2128 |
{
|
slouken@9583
|
2129 |
int width = info->dst_w;
|
slouken@9583
|
2130 |
int height = info->dst_h;
|
slouken@9583
|
2131 |
Uint32 *src = (Uint32 *) info->src;
|
slouken@9583
|
2132 |
int srcskip = info->src_skip;
|
slouken@9583
|
2133 |
Uint32 *dst = (Uint32 *) info->dst;
|
slouken@9583
|
2134 |
int dstskip = info->dst_skip;
|
slouken@9583
|
2135 |
|
slouken@9583
|
2136 |
/* RGBA->RGBA, COPY_ALPHA */
|
slouken@9583
|
2137 |
while (height--) {
|
slouken@9583
|
2138 |
/* *INDENT-OFF* */
|
slouken@9583
|
2139 |
DUFFS_LOOP(
|
slouken@9583
|
2140 |
{
|
slouken@9583
|
2141 |
*dst = *src;
|
slouken@9583
|
2142 |
++dst;
|
slouken@9583
|
2143 |
++src;
|
slouken@9583
|
2144 |
},
|
slouken@9583
|
2145 |
width);
|
slouken@9583
|
2146 |
/* *INDENT-ON* */
|
slouken@9583
|
2147 |
src = (Uint32 *) ((Uint8 *) src + srcskip);
|
slouken@9583
|
2148 |
dst = (Uint32 *) ((Uint8 *) dst + dstskip);
|
slouken@9583
|
2149 |
}
|
slouken@9583
|
2150 |
}
|
slouken@9583
|
2151 |
|
slouken@1895
|
2152 |
static void
|
slouken@1895
|
2153 |
BlitNtoN(SDL_BlitInfo * info)
|
slouken@0
|
2154 |
{
|
slouken@2262
|
2155 |
int width = info->dst_w;
|
slouken@2262
|
2156 |
int height = info->dst_h;
|
slouken@2262
|
2157 |
Uint8 *src = info->src;
|
slouken@2267
|
2158 |
int srcskip = info->src_skip;
|
slouken@2262
|
2159 |
Uint8 *dst = info->dst;
|
slouken@2267
|
2160 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2161 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@1895
|
2162 |
int srcbpp = srcfmt->BytesPerPixel;
|
slouken@2267
|
2163 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@1895
|
2164 |
int dstbpp = dstfmt->BytesPerPixel;
|
slouken@2267
|
2165 |
unsigned alpha = dstfmt->Amask ? info->a : 0;
|
slouken@0
|
2166 |
|
slouken@1895
|
2167 |
while (height--) {
|
slouken@7208
|
2168 |
/* *INDENT-OFF* */
|
slouken@7208
|
2169 |
DUFFS_LOOP(
|
slouken@7208
|
2170 |
{
|
slouken@1985
|
2171 |
Uint32 Pixel;
|
slouken@7208
|
2172 |
unsigned sR;
|
slouken@7208
|
2173 |
unsigned sG;
|
slouken@7208
|
2174 |
unsigned sB;
|
slouken@7208
|
2175 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel, sR, sG, sB);
|
slouken@7208
|
2176 |
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);
|
slouken@7208
|
2177 |
dst += dstbpp;
|
slouken@7208
|
2178 |
src += srcbpp;
|
slouken@7208
|
2179 |
},
|
slouken@7208
|
2180 |
width);
|
slouken@7208
|
2181 |
/* *INDENT-ON* */
|
slouken@1895
|
2182 |
src += srcskip;
|
slouken@1895
|
2183 |
dst += dstskip;
|
slouken@1895
|
2184 |
}
|
slouken@0
|
2185 |
}
|
slouken@0
|
2186 |
|
slouken@1895
|
2187 |
static void
|
slouken@1895
|
2188 |
BlitNtoNCopyAlpha(SDL_BlitInfo * info)
|
slouken@0
|
2189 |
{
|
slouken@2262
|
2190 |
int width = info->dst_w;
|
slouken@2262
|
2191 |
int height = info->dst_h;
|
slouken@2262
|
2192 |
Uint8 *src = info->src;
|
slouken@2267
|
2193 |
int srcskip = info->src_skip;
|
slouken@2262
|
2194 |
Uint8 *dst = info->dst;
|
slouken@2267
|
2195 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2196 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@1895
|
2197 |
int srcbpp = srcfmt->BytesPerPixel;
|
slouken@2267
|
2198 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@1895
|
2199 |
int dstbpp = dstfmt->BytesPerPixel;
|
slouken@1895
|
2200 |
int c;
|
slouken@0
|
2201 |
|
slouken@1895
|
2202 |
while (height--) {
|
slouken@1895
|
2203 |
for (c = width; c; --c) {
|
slouken@1895
|
2204 |
Uint32 Pixel;
|
slouken@1895
|
2205 |
unsigned sR, sG, sB, sA;
|
slouken@1895
|
2206 |
DISEMBLE_RGBA(src, srcbpp, srcfmt, Pixel, sR, sG, sB, sA);
|
slouken@1895
|
2207 |
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, sA);
|
slouken@1895
|
2208 |
dst += dstbpp;
|
slouken@1895
|
2209 |
src += srcbpp;
|
slouken@1895
|
2210 |
}
|
slouken@1895
|
2211 |
src += srcskip;
|
slouken@1895
|
2212 |
dst += dstskip;
|
slouken@1895
|
2213 |
}
|
slouken@0
|
2214 |
}
|
slouken@0
|
2215 |
|
slouken@1895
|
2216 |
static void
|
slouken@1895
|
2217 |
BlitNto1Key(SDL_BlitInfo * info)
|
slouken@0
|
2218 |
{
|
slouken@2262
|
2219 |
int width = info->dst_w;
|
slouken@2262
|
2220 |
int height = info->dst_h;
|
slouken@2262
|
2221 |
Uint8 *src = info->src;
|
slouken@2267
|
2222 |
int srcskip = info->src_skip;
|
slouken@2262
|
2223 |
Uint8 *dst = info->dst;
|
slouken@2267
|
2224 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2225 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@1895
|
2226 |
const Uint8 *palmap = info->table;
|
slouken@2267
|
2227 |
Uint32 ckey = info->colorkey;
|
slouken@1895
|
2228 |
Uint32 rgbmask = ~srcfmt->Amask;
|
slouken@1895
|
2229 |
int srcbpp;
|
slouken@1895
|
2230 |
Uint32 Pixel;
|
slouken@1895
|
2231 |
unsigned sR, sG, sB;
|
slouken@0
|
2232 |
|
slouken@1895
|
2233 |
/* Set up some basic variables */
|
slouken@1895
|
2234 |
srcbpp = srcfmt->BytesPerPixel;
|
slouken@1895
|
2235 |
ckey &= rgbmask;
|
slouken@0
|
2236 |
|
slouken@1895
|
2237 |
if (palmap == NULL) {
|
slouken@1895
|
2238 |
while (height--) {
|
slouken@7208
|
2239 |
/* *INDENT-OFF* */
|
slouken@7208
|
2240 |
DUFFS_LOOP(
|
slouken@7208
|
2241 |
{
|
slouken@7208
|
2242 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,
|
slouken@7208
|
2243 |
sR, sG, sB);
|
slouken@7208
|
2244 |
if ( (Pixel & rgbmask) != ckey ) {
|
slouken@7208
|
2245 |
/* Pack RGB into 8bit pixel */
|
slouken@7208
|
2246 |
*dst = (Uint8)(((sR>>5)<<(3+2))|
|
slouken@7208
|
2247 |
((sG>>5)<<(2)) |
|
slouken@7208
|
2248 |
((sB>>6)<<(0)));
|
slouken@7208
|
2249 |
}
|
slouken@7208
|
2250 |
dst++;
|
slouken@7208
|
2251 |
src += srcbpp;
|
slouken@7208
|
2252 |
},
|
slouken@7208
|
2253 |
width);
|
slouken@7208
|
2254 |
/* *INDENT-ON* */
|
slouken@1895
|
2255 |
src += srcskip;
|
slouken@1895
|
2256 |
dst += dstskip;
|
slouken@1895
|
2257 |
}
|
slouken@1895
|
2258 |
} else {
|
slouken@1895
|
2259 |
while (height--) {
|
slouken@7208
|
2260 |
/* *INDENT-OFF* */
|
slouken@7208
|
2261 |
DUFFS_LOOP(
|
slouken@7208
|
2262 |
{
|
slouken@7208
|
2263 |
DISEMBLE_RGB(src, srcbpp, srcfmt, Pixel,
|
slouken@7208
|
2264 |
sR, sG, sB);
|
slouken@7208
|
2265 |
if ( (Pixel & rgbmask) != ckey ) {
|
slouken@7208
|
2266 |
/* Pack RGB into 8bit pixel */
|
slouken@7208
|
2267 |
*dst = (Uint8)palmap[((sR>>5)<<(3+2))|
|
slouken@7208
|
2268 |
((sG>>5)<<(2)) |
|
slouken@7208
|
2269 |
((sB>>6)<<(0)) ];
|
slouken@7208
|
2270 |
}
|
slouken@7208
|
2271 |
dst++;
|
slouken@7208
|
2272 |
src += srcbpp;
|
slouken@7208
|
2273 |
},
|
slouken@7208
|
2274 |
width);
|
slouken@7208
|
2275 |
/* *INDENT-ON* */
|
slouken@1895
|
2276 |
src += srcskip;
|
slouken@1895
|
2277 |
dst += dstskip;
|
slouken@1895
|
2278 |
}
|
slouken@1895
|
2279 |
}
|
slouken@0
|
2280 |
}
|
slouken@0
|
2281 |
|
slouken@1895
|
2282 |
static void
|
slouken@1895
|
2283 |
Blit2to2Key(SDL_BlitInfo * info)
|
slouken@0
|
2284 |
{
|
slouken@2262
|
2285 |
int width = info->dst_w;
|
slouken@2262
|
2286 |
int height = info->dst_h;
|
slouken@2262
|
2287 |
Uint16 *srcp = (Uint16 *) info->src;
|
slouken@2267
|
2288 |
int srcskip = info->src_skip;
|
slouken@2262
|
2289 |
Uint16 *dstp = (Uint16 *) info->dst;
|
slouken@2267
|
2290 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2291 |
Uint32 ckey = info->colorkey;
|
slouken@2267
|
2292 |
Uint32 rgbmask = ~info->src_fmt->Amask;
|
slouken@0
|
2293 |
|
slouken@1895
|
2294 |
/* Set up some basic variables */
|
slouken@1895
|
2295 |
srcskip /= 2;
|
slouken@1895
|
2296 |
dstskip /= 2;
|
slouken@1895
|
2297 |
ckey &= rgbmask;
|
slouken@0
|
2298 |
|
slouken@1895
|
2299 |
while (height--) {
|
slouken@7208
|
2300 |
/* *INDENT-OFF* */
|
slouken@7208
|
2301 |
DUFFS_LOOP(
|
slouken@7208
|
2302 |
{
|
slouken@7208
|
2303 |
if ( (*srcp & rgbmask) != ckey ) {
|
slouken@7208
|
2304 |
*dstp = *srcp;
|
slouken@7208
|
2305 |
}
|
slouken@7208
|
2306 |
dstp++;
|
slouken@7208
|
2307 |
srcp++;
|
slouken@7208
|
2308 |
},
|
slouken@7208
|
2309 |
width);
|
slouken@7208
|
2310 |
/* *INDENT-ON* */
|
slouken@1895
|
2311 |
srcp += srcskip;
|
slouken@1895
|
2312 |
dstp += dstskip;
|
slouken@1895
|
2313 |
}
|
slouken@0
|
2314 |
}
|
slouken@0
|
2315 |
|
slouken@1895
|
2316 |
static void
|
slouken@1895
|
2317 |
BlitNtoNKey(SDL_BlitInfo * info)
|
slouken@0
|
2318 |
{
|
slouken@2262
|
2319 |
int width = info->dst_w;
|
slouken@2262
|
2320 |
int height = info->dst_h;
|
slouken@2262
|
2321 |
Uint8 *src = info->src;
|
slouken@2267
|
2322 |
int srcskip = info->src_skip;
|
slouken@2262
|
2323 |
Uint8 *dst = info->dst;
|
slouken@2267
|
2324 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2325 |
Uint32 ckey = info->colorkey;
|
slouken@2267
|
2326 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@2267
|
2327 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@1895
|
2328 |
int srcbpp = srcfmt->BytesPerPixel;
|
slouken@1895
|
2329 |
int dstbpp = dstfmt->BytesPerPixel;
|
slouken@2267
|
2330 |
unsigned alpha = dstfmt->Amask ? info->a : 0;
|
slouken@1895
|
2331 |
Uint32 rgbmask = ~srcfmt->Amask;
|
sylvain@12586
|
2332 |
int sfmt = srcfmt->format;
|
sylvain@12586
|
2333 |
int dfmt = dstfmt->format;
|
slouken@1543
|
2334 |
|
slouken@1895
|
2335 |
/* Set up some basic variables */
|
slouken@1895
|
2336 |
ckey &= rgbmask;
|
slouken@0
|
2337 |
|
sylvain@12586
|
2338 |
/* BPP 4, same rgb */
|
sylvain@12586
|
2339 |
if (srcbpp == 4 && dstbpp == 4 && srcfmt->Rmask == dstfmt->Rmask && srcfmt->Gmask == dstfmt->Gmask && srcfmt->Bmask == dstfmt->Bmask) {
|
slouken@12242
|
2340 |
Uint32 *src32 = (Uint32*)src;
|
slouken@12242
|
2341 |
Uint32 *dst32 = (Uint32*)dst;
|
sylvain@12599
|
2342 |
|
sylvain@12586
|
2343 |
if (dstfmt->Amask) {
|
sylvain@12586
|
2344 |
/* RGB->RGBA, SET_ALPHA */
|
sylvain@12586
|
2345 |
Uint32 mask = info->a << dstfmt->Ashift;
|
sylvain@12586
|
2346 |
while (height--) {
|
sylvain@12586
|
2347 |
/* *INDENT-OFF* */
|
sylvain@12586
|
2348 |
DUFFS_LOOP(
|
sylvain@12586
|
2349 |
{
|
sylvain@12586
|
2350 |
if ((*src32 & rgbmask) != ckey) {
|
sylvain@12586
|
2351 |
*dst32 = *src32 | mask;
|
sylvain@12586
|
2352 |
}
|
sylvain@12586
|
2353 |
++dst32;
|
sylvain@12586
|
2354 |
++src32;
|
sylvain@12586
|
2355 |
}, width);
|
sylvain@12586
|
2356 |
/* *INDENT-ON* */
|
sylvain@12586
|
2357 |
src32 = (Uint32 *) ((Uint8 *) src32 + srcskip);
|
sylvain@12586
|
2358 |
dst32 = (Uint32 *) ((Uint8 *) dst32 + dstskip);
|
sylvain@12586
|
2359 |
}
|
sylvain@12586
|
2360 |
return;
|
sylvain@12586
|
2361 |
} else {
|
sylvain@12586
|
2362 |
/* RGBA->RGB, NO_ALPHA */
|
sylvain@12586
|
2363 |
Uint32 mask = srcfmt->Rmask | srcfmt->Gmask | srcfmt->Bmask;
|
sylvain@12586
|
2364 |
while (height--) {
|
sylvain@12586
|
2365 |
/* *INDENT-OFF* */
|
sylvain@12586
|
2366 |
DUFFS_LOOP(
|
sylvain@12586
|
2367 |
{
|
sylvain@12586
|
2368 |
if ((*src32 & rgbmask) != ckey) {
|
sylvain@12586
|
2369 |
*dst32 = *src32 & mask;
|
sylvain@12586
|
2370 |
}
|
sylvain@12586
|
2371 |
++dst32;
|
sylvain@12586
|
2372 |
++src32;
|
sylvain@12586
|
2373 |
}, width);
|
sylvain@12586
|
2374 |
/* *INDENT-ON* */
|
sylvain@12586
|
2375 |
src32 = (Uint32 *) ((Uint8 *) src32 + srcskip);
|
sylvain@12586
|
2376 |
dst32 = (Uint32 *) ((Uint8 *) dst32 + dstskip);
|
sylvain@12586
|
2377 |
}
|
sylvain@12586
|
2378 |
return;
|
sylvain@12586
|
2379 |
}
|
sylvain@12586
|
2380 |
}
|
sylvain@12586
|
2381 |
|
sylvain@12601
|
2382 |
/* Any src/dst 8888, not CopyAlpha, no ARGB2101010 */
|
sylvain@12601
|
2383 |
if (srcbpp == 4 && dstbpp == 4 &&
|
sylvain@12601
|
2384 |
srcfmt->format != SDL_PIXELFORMAT_ARGB2101010 &&
|
sylvain@12601
|
2385 |
dstfmt->format != SDL_PIXELFORMAT_ARGB2101010) {
|
sylvain@12601
|
2386 |
|
sylvain@12601
|
2387 |
Uint32 *src32 = (Uint32*)src;
|
sylvain@12601
|
2388 |
Uint32 *dst32 = (Uint32*)dst;
|
sylvain@12601
|
2389 |
|
sylvain@12601
|
2390 |
if (dstfmt->Amask) {
|
sylvain@12601
|
2391 |
/* Find the appropriate permutation */
|
sylvain@12601
|
2392 |
int missing = 0, r, g, b, a;
|
sylvain@12601
|
2393 |
int Pixel = 0x03020100;
|
sylvain@12601
|
2394 |
RGB_FROM_PIXEL(Pixel, srcfmt, r, g, b);
|
sylvain@12601
|
2395 |
PIXEL_FROM_RGBA(Pixel, dstfmt, r, g, b, 255);
|
sylvain@12601
|
2396 |
r = Pixel & 0xFF;
|
sylvain@12601
|
2397 |
g = (Pixel >> 8) & 0xFF;
|
sylvain@12601
|
2398 |
b = (Pixel >> 16) & 0xFF;
|
sylvain@12601
|
2399 |
a = (Pixel >> 24) & 0xFF;
|
sylvain@12601
|
2400 |
|
sylvain@12601
|
2401 |
{
|
sylvain@12601
|
2402 |
int val;
|
sylvain@12601
|
2403 |
for (val = 0; val <= 3; val++) {
|
sylvain@12601
|
2404 |
if (r != val && g != val && b != val && a != val) {
|
sylvain@12601
|
2405 |
missing = val;
|
sylvain@12601
|
2406 |
}
|
sylvain@12601
|
2407 |
}
|
sylvain@12601
|
2408 |
}
|
sylvain@12601
|
2409 |
|
sylvain@12601
|
2410 |
if (r == 255) {
|
sylvain@12601
|
2411 |
r = missing;
|
sylvain@12601
|
2412 |
missing = 0;
|
sylvain@12601
|
2413 |
} else if (g == 255) {
|
sylvain@12601
|
2414 |
g = missing;
|
sylvain@12601
|
2415 |
missing = 1;
|
sylvain@12601
|
2416 |
} else if (b == 255) {
|
sylvain@12601
|
2417 |
b = missing;
|
sylvain@12601
|
2418 |
missing = 2;
|
sylvain@12601
|
2419 |
} else if (a == 255) {
|
sylvain@12601
|
2420 |
a = missing;
|
sylvain@12601
|
2421 |
missing = 3;
|
sylvain@12601
|
2422 |
}
|
sylvain@12601
|
2423 |
|
sylvain@12601
|
2424 |
while (height--) {
|
sylvain@12601
|
2425 |
/* *INDENT-OFF* */
|
sylvain@12601
|
2426 |
DUFFS_LOOP(
|
sylvain@12601
|
2427 |
{
|
sylvain@12601
|
2428 |
if ((*src32 & rgbmask) != ckey) {
|
sylvain@12601
|
2429 |
Uint8 *s8 = (Uint8 *)src32;
|
sylvain@12601
|
2430 |
Uint8 *d8 = (Uint8 *)dst32;
|
sylvain@12601
|
2431 |
d8[0] = s8[r];
|
sylvain@12601
|
2432 |
d8[1] = s8[g];
|
sylvain@12601
|
2433 |
d8[2] = s8[b];
|
sylvain@12601
|
2434 |
d8[3] = s8[a];
|
sylvain@12601
|
2435 |
d8[missing] = alpha;
|
sylvain@12601
|
2436 |
}
|
sylvain@12601
|
2437 |
++src32;
|
sylvain@12601
|
2438 |
++dst32;
|
sylvain@12601
|
2439 |
}, width);
|
sylvain@12601
|
2440 |
/* *INDENT-ON* */
|
sylvain@12601
|
2441 |
src32 = (Uint32 *)((Uint8 *)src32 + srcskip);
|
sylvain@12601
|
2442 |
dst32 = (Uint32 *)((Uint8 *)dst32 + dstskip);
|
sylvain@12601
|
2443 |
}
|
sylvain@12601
|
2444 |
|
sylvain@12601
|
2445 |
return;
|
sylvain@12601
|
2446 |
} else {
|
sylvain@12601
|
2447 |
/* Find the appropriate permutation */
|
sylvain@12601
|
2448 |
int missing = 0, r, g, b, a;
|
sylvain@12601
|
2449 |
int Pixel = 0x04030201; /* +1 */
|
sylvain@12601
|
2450 |
RGBA_FROM_PIXEL(Pixel, srcfmt, r, g, b, a);
|
sylvain@12601
|
2451 |
missing = a;
|
sylvain@12601
|
2452 |
PIXEL_FROM_RGB(Pixel, dstfmt, r, g, b);
|
sylvain@12601
|
2453 |
r = Pixel & 0xFF;
|
sylvain@12601
|
2454 |
g = (Pixel >> 8) & 0xFF;
|
sylvain@12601
|
2455 |
b = (Pixel >> 16) & 0xFF;
|
sylvain@12601
|
2456 |
a = (Pixel >> 24) & 0xFF;
|
sylvain@12601
|
2457 |
|
sylvain@12601
|
2458 |
if (r == 0) {
|
sylvain@12601
|
2459 |
r = missing;
|
sylvain@12601
|
2460 |
missing = 0;
|
sylvain@12601
|
2461 |
} else if (g == 0) {
|
sylvain@12601
|
2462 |
g = missing;
|
sylvain@12601
|
2463 |
missing = 1;
|
sylvain@12601
|
2464 |
} else if (b == 0) {
|
sylvain@12601
|
2465 |
b = missing;
|
sylvain@12601
|
2466 |
missing = 2;
|
sylvain@12601
|
2467 |
} else if (a == 0) {
|
sylvain@12601
|
2468 |
a = missing;
|
sylvain@12601
|
2469 |
missing = 3;
|
sylvain@12601
|
2470 |
}
|
sylvain@12601
|
2471 |
|
sylvain@12601
|
2472 |
/* -1 */
|
sylvain@12601
|
2473 |
r -= 1; g -= 1; b -= 1; a -= 1;
|
sylvain@12601
|
2474 |
|
sylvain@12601
|
2475 |
while (height--) {
|
sylvain@12601
|
2476 |
/* *INDENT-OFF* */
|
sylvain@12601
|
2477 |
DUFFS_LOOP(
|
sylvain@12601
|
2478 |
{
|
sylvain@12601
|
2479 |
if ((*src32 & rgbmask) != ckey) {
|
sylvain@12601
|
2480 |
Uint8 *s8 = (Uint8 *)src32;
|
sylvain@12601
|
2481 |
Uint8 *d8 = (Uint8 *)dst32;
|
sylvain@12601
|
2482 |
d8[0] = s8[r];
|
sylvain@12601
|
2483 |
d8[1] = s8[g];
|
sylvain@12601
|
2484 |
d8[2] = s8[b];
|
sylvain@12601
|
2485 |
d8[3] = s8[a];
|
sylvain@12601
|
2486 |
d8[missing] = 0;
|
sylvain@12601
|
2487 |
}
|
sylvain@12601
|
2488 |
++src32;
|
sylvain@12601
|
2489 |
++dst32;
|
sylvain@12601
|
2490 |
}, width);
|
sylvain@12601
|
2491 |
/* *INDENT-ON* */
|
sylvain@12601
|
2492 |
src32 = (Uint32 *)((Uint8 *)src32 + srcskip);
|
sylvain@12601
|
2493 |
dst32 = (Uint32 *)((Uint8 *)dst32 + dstskip);
|
sylvain@12601
|
2494 |
}
|
sylvain@12601
|
2495 |
return;
|
sylvain@12601
|
2496 |
}
|
sylvain@12601
|
2497 |
}
|
sylvain@12601
|
2498 |
|
sylvain@12586
|
2499 |
/* BPP 3, same rgb triplet */
|
sylvain@12586
|
2500 |
if ((sfmt == SDL_PIXELFORMAT_RGB24 && dfmt == SDL_PIXELFORMAT_RGB24) ||
|
sylvain@12586
|
2501 |
(sfmt == SDL_PIXELFORMAT_BGR24 && dfmt == SDL_PIXELFORMAT_BGR24)) {
|
sylvain@12586
|
2502 |
|
sylvain@12586
|
2503 |
Uint8 k0 = ckey & 0x000000FF;
|
sylvain@12586
|
2504 |
Uint8 k1 = (ckey & 0x0000FF00) >> 8;
|
sylvain@12586
|
2505 |
Uint8 k2 = (ckey & 0x00FF0000) >> 16;
|
sylvain@12586
|
2506 |
|
slouken@12242
|
2507 |
while (height--) {
|
slouken@12242
|
2508 |
/* *INDENT-OFF* */
|
slouken@12242
|
2509 |
DUFFS_LOOP(
|
slouken@12242
|
2510 |
{
|
sylvain@12586
|
2511 |
Uint8 s0 = src[0];
|
sylvain@12586
|
2512 |
Uint8 s1 = src[1];
|
sylvain@12586
|
2513 |
Uint8 s2 = src[2];
|
sylvain@12586
|
2514 |
|
sylvain@12586
|
2515 |
if (k0 != s0 || k1 != s1 || k2 != s2) {
|
sylvain@12586
|
2516 |
dst[0] = s0;
|
sylvain@12586
|
2517 |
dst[1] = s1;
|
sylvain@12586
|
2518 |
dst[2] = s2;
|
slouken@12274
|
2519 |
}
|
sylvain@12586
|
2520 |
src += 3;
|
sylvain@12586
|
2521 |
dst += 3;
|
slouken@12242
|
2522 |
},
|
slouken@12242
|
2523 |
width);
|
slouken@12242
|
2524 |
/* *INDENT-ON* */
|
sylvain@12586
|
2525 |
src += srcskip;
|
sylvain@12586
|
2526 |
dst += dstskip;
|
slouken@12242
|
2527 |
}
|
slouken@12242
|
2528 |
return;
|
slouken@12242
|
2529 |
}
|
slouken@12242
|
2530 |
|
sylvain@12586
|
2531 |
/* BPP 3, inversed rgb triplet */
|
sylvain@12586
|
2532 |
if ((sfmt == SDL_PIXELFORMAT_RGB24 && dfmt == SDL_PIXELFORMAT_BGR24) ||
|
sylvain@12586
|
2533 |
(sfmt == SDL_PIXELFORMAT_BGR24 && dfmt == SDL_PIXELFORMAT_RGB24)) {
|
sylvain@12586
|
2534 |
|
sylvain@12586
|
2535 |
Uint8 k0 = ckey & 0xFF;
|
sylvain@12586
|
2536 |
Uint8 k1 = (ckey >> 8) & 0xFF;
|
sylvain@12586
|
2537 |
Uint8 k2 = (ckey >> 16) & 0xFF;
|
sylvain@12586
|
2538 |
|
sylvain@12586
|
2539 |
while (height--) {
|
sylvain@12586
|
2540 |
/* *INDENT-OFF* */
|
sylvain@12586
|
2541 |
DUFFS_LOOP(
|
sylvain@12586
|
2542 |
{
|
sylvain@12586
|
2543 |
Uint8 s0 = src[0];
|
sylvain@12586
|
2544 |
Uint8 s1 = src[1];
|
sylvain@12586
|
2545 |
Uint8 s2 = src[2];
|
sylvain@12586
|
2546 |
if (k0 != s0 || k1 != s1 || k2 != s2) {
|
sylvain@12586
|
2547 |
/* Inversed RGB */
|
sylvain@12586
|
2548 |
dst[0] = s2;
|
sylvain@12586
|
2549 |
dst[1] = s1;
|
sylvain@12586
|
2550 |
dst[2] = s0;
|
sylvain@12586
|
2551 |
}
|
sylvain@12586
|
2552 |
src += 3;
|
sylvain@12586
|
2553 |
dst += 3;
|
sylvain@12586
|
2554 |
},
|
sylvain@12586
|
2555 |
width);
|
sylvain@12586
|
2556 |
/* *INDENT-ON* */
|
sylvain@12586
|
2557 |
src += srcskip;
|
sylvain@12586
|
2558 |
dst += dstskip;
|
sylvain@12586
|
2559 |
}
|
sylvain@12586
|
2560 |
return;
|
sylvain@12599
|
2561 |
}
|
sylvain@12599
|
2562 |
|
slouken@1895
|
2563 |
while (height--) {
|
slouken@7208
|
2564 |
/* *INDENT-OFF* */
|
slouken@7208
|
2565 |
DUFFS_LOOP(
|
slouken@7208
|
2566 |
{
|
slouken@1985
|
2567 |
Uint32 Pixel;
|
slouken@7208
|
2568 |
unsigned sR;
|
slouken@7208
|
2569 |
unsigned sG;
|
slouken@7208
|
2570 |
unsigned sB;
|
slouken@7208
|
2571 |
RETRIEVE_RGB_PIXEL(src, srcbpp, Pixel);
|
slouken@7208
|
2572 |
if ( (Pixel & rgbmask) != ckey ) {
|
slouken@1985
|
2573 |
RGB_FROM_PIXEL(Pixel, srcfmt, sR, sG, sB);
|
slouken@7208
|
2574 |
ASSEMBLE_RGBA(dst, dstbpp, dstfmt, sR, sG, sB, alpha);
|
slouken@7208
|
2575 |
}
|
slouken@7208
|
2576 |
dst += dstbpp;
|
slouken@7208
|
2577 |
src += srcbpp;
|
slouken@7208
|
2578 |
},
|
slouken@7208
|
2579 |
width);
|
slouken@7208
|
2580 |
/* *INDENT-ON* */
|
slouken@1895
|
2581 |
src += srcskip;
|
slouken@1895
|
2582 |
dst += dstskip;
|
slouken@1895
|
2583 |
}
|
slouken@0
|
2584 |
}
|
slouken@0
|
2585 |
|
slouken@1895
|
2586 |
static void
|
slouken@1895
|
2587 |
BlitNtoNKeyCopyAlpha(SDL_BlitInfo * info)
|
slouken@0
|
2588 |
{
|
slouken@2262
|
2589 |
int width = info->dst_w;
|
slouken@2262
|
2590 |
int height = info->dst_h;
|
slouken@2262
|
2591 |
Uint8 *src = info->src;
|
slouken@2267
|
2592 |
int srcskip = info->src_skip;
|
slouken@2262
|
2593 |
Uint8 *dst = info->dst;
|
slouken@2267
|
2594 |
int dstskip = info->dst_skip;
|
slouken@2267
|
2595 |
Uint32 ckey = info->colorkey;
|
slouken@2267
|
2596 |
SDL_PixelFormat *srcfmt = info->src_fmt;
|
slouken@2267
|
2597 |
SDL_PixelFormat *dstfmt = info->dst_fmt;
|
slouken@1895
|
2598 |
Uint32 rgbmask = ~ |