Mercurial > sdl-ios-xcode
annotate src/video/SDL_blit.h @ 2256:e893d24ad8db
Getting ready to add slow blitters. Everyone will love me. :)
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Thu, 16 Aug 2007 22:56:18 +0000 |
parents | 292bee385630 |
children | 340942cfda48 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
3 Copyright (C) 1997-2006 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1162
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
163
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1312
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 #ifndef _SDL_blit_h | |
25 #define _SDL_blit_h | |
26 | |
2249
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
27 #ifdef __MMX__ |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
28 #include <mmintrin.h> |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
29 #endif |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
30 #ifdef __SSE__ |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
31 #include <xmmintrin.h> |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
32 #endif |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
33 |
2250
e1d228456537
Fixed a few compiler warnings.
Sam Lantinga <slouken@libsdl.org>
parents:
2249
diff
changeset
|
34 #include "SDL_cpuinfo.h" |
0 | 35 #include "SDL_endian.h" |
36 | |
37 /* The structure passed to the low level blit functions */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
38 typedef struct |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
39 { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
40 Uint8 *s_pixels; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
41 int s_width; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
42 int s_height; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
43 int s_skip; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
44 Uint8 *d_pixels; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
45 int d_width; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
46 int d_height; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
47 int d_skip; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
48 void *aux_data; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
49 SDL_PixelFormat *src; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
50 Uint8 *table; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
51 SDL_PixelFormat *dst; |
0 | 52 } SDL_BlitInfo; |
53 | |
54 /* The type definition for the low level blit functions */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
55 typedef void (*SDL_loblit) (SDL_BlitInfo * info); |
0 | 56 |
57 /* This is the private info structure for software accelerated blits */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
58 struct private_swaccel |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
59 { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
60 SDL_loblit blit; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
61 void *aux_data; |
0 | 62 }; |
63 | |
64 /* Blit mapping definition */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
65 typedef struct SDL_BlitMap |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
66 { |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
67 SDL_Surface *dst; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
68 int identity; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
69 Uint8 *table; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
70 SDL_blit sw_blit; |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
71 struct private_swaccel *sw_data; |
0 | 72 |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
73 /* the version count matches the destination; mismatch indicates |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
74 an invalid mapping */ |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
75 unsigned int format_version; |
0 | 76 } SDL_BlitMap; |
77 | |
2247
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
78 #define SDL_BLIT_ANY 0x00000000 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
79 #define SDL_BLIT_MMX 0x00000001 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
80 #define SDL_BLIT_SSE 0x00000002 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
81 #define SDL_BLIT_ALTIVEC_PREFETCH 0x00000004 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
82 #define SDL_BLIT_ALTIVEC_NOPREFETCH 0x00000008 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
83 |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
84 typedef struct SDL_BlitEntry |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
85 { |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
86 Uint32 features; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
87 SDL_loblit blit; |
93994f65c74c
Removed hermes since it's LGPL and not compatible with a commercial license.
Sam Lantinga <slouken@libsdl.org>
parents:
1895
diff
changeset
|
88 } SDL_BlitEntry; |
0 | 89 |
90 /* Functions found in SDL_blit.c */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
91 extern int SDL_CalculateBlit(SDL_Surface * surface); |
0 | 92 |
93 /* Functions found in SDL_blit_{0,1,N,A}.c */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
94 extern SDL_loblit SDL_CalculateBlit0(SDL_Surface * surface, int complex); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
95 extern SDL_loblit SDL_CalculateBlit1(SDL_Surface * surface, int complex); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
96 extern SDL_loblit SDL_CalculateBlitN(SDL_Surface * surface, int complex); |
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
97 extern SDL_loblit SDL_CalculateAlphaBlit(SDL_Surface * surface, int complex); |
0 | 98 |
99 /* | |
100 * Useful macros for blitting routines | |
101 */ | |
102 | |
2249
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
103 #if defined(__GNUC__) |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
104 #define DECLARE_ALIGNED(t,v,a) t __attribute__((aligned(a))) v |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
105 #elif defined(_MSC_VER) |
2251
292bee385630
SSE and MMX intrinsics work with Visual Studio now...
Sam Lantinga <slouken@libsdl.org>
parents:
2250
diff
changeset
|
106 #define DECLARE_ALIGNED(t,v,a) __declspec(align(a)) t v |
2249
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
107 #else |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
108 #define DECLARE_ALIGNED(t,v,a) t v |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
109 #endif |
5a58b57b6724
Added SSE and MMX optimization for SDL_FillRect()
Sam Lantinga <slouken@libsdl.org>
parents:
2247
diff
changeset
|
110 |
0 | 111 #define FORMAT_EQUAL(A, B) \ |
112 ((A)->BitsPerPixel == (B)->BitsPerPixel \ | |
113 && ((A)->Rmask == (B)->Rmask) && ((A)->Amask == (B)->Amask)) | |
114 | |
115 /* Load pixel of the specified format from a buffer and get its R-G-B values */ | |
116 /* FIXME: rescale values to 0..255 here? */ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
117 #define RGB_FROM_PIXEL(Pixel, fmt, r, g, b) \ |
0 | 118 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
119 r = (((Pixel&fmt->Rmask)>>fmt->Rshift)<<fmt->Rloss); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
120 g = (((Pixel&fmt->Gmask)>>fmt->Gshift)<<fmt->Gloss); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
121 b = (((Pixel&fmt->Bmask)>>fmt->Bshift)<<fmt->Bloss); \ |
0 | 122 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
123 #define RGB_FROM_RGB565(Pixel, r, g, b) \ |
0 | 124 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
125 r = (((Pixel&0xF800)>>11)<<3); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
126 g = (((Pixel&0x07E0)>>5)<<2); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
127 b = ((Pixel&0x001F)<<3); \ |
0 | 128 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
129 #define RGB_FROM_RGB555(Pixel, r, g, b) \ |
0 | 130 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
131 r = (((Pixel&0x7C00)>>10)<<3); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
132 g = (((Pixel&0x03E0)>>5)<<3); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
133 b = ((Pixel&0x001F)<<3); \ |
0 | 134 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
135 #define RGB_FROM_RGB888(Pixel, r, g, b) \ |
0 | 136 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
137 r = ((Pixel&0xFF0000)>>16); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
138 g = ((Pixel&0xFF00)>>8); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
139 b = (Pixel&0xFF); \ |
0 | 140 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
141 #define RETRIEVE_RGB_PIXEL(buf, bpp, Pixel) \ |
0 | 142 do { \ |
143 switch (bpp) { \ | |
144 case 2: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
145 Pixel = *((Uint16 *)(buf)); \ |
0 | 146 break; \ |
147 \ | |
148 case 3: { \ | |
149 Uint8 *B = (Uint8 *)(buf); \ | |
150 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
151 Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \ |
0 | 152 } else { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
153 Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \ |
0 | 154 } \ |
155 } \ | |
156 break; \ | |
157 \ | |
158 case 4: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
159 Pixel = *((Uint32 *)(buf)); \ |
0 | 160 break; \ |
161 \ | |
162 default: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
163 Pixel = 0; /* appease gcc */ \ |
0 | 164 break; \ |
165 } \ | |
166 } while(0) | |
167 | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
168 #define DISEMBLE_RGB(buf, bpp, fmt, Pixel, r, g, b) \ |
0 | 169 do { \ |
170 switch (bpp) { \ | |
171 case 2: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
172 Pixel = *((Uint16 *)(buf)); \ |
0 | 173 break; \ |
174 \ | |
175 case 3: { \ | |
176 Uint8 *B = (Uint8 *)buf; \ | |
177 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
178 Pixel = B[0] + (B[1] << 8) + (B[2] << 16); \ |
0 | 179 } else { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
180 Pixel = (B[0] << 16) + (B[1] << 8) + B[2]; \ |
0 | 181 } \ |
182 } \ | |
183 break; \ | |
184 \ | |
185 case 4: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
186 Pixel = *((Uint32 *)(buf)); \ |
0 | 187 break; \ |
188 \ | |
189 default: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
190 Pixel = 0; /* prevent gcc from complaining */ \ |
0 | 191 break; \ |
192 } \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
193 RGB_FROM_PIXEL(Pixel, fmt, r, g, b); \ |
0 | 194 } while(0) |
195 | |
196 /* Assemble R-G-B values into a specified pixel format and store them */ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
197 #define PIXEL_FROM_RGB(Pixel, fmt, r, g, b) \ |
0 | 198 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
199 Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \ |
0 | 200 ((g>>fmt->Gloss)<<fmt->Gshift)| \ |
201 ((b>>fmt->Bloss)<<fmt->Bshift); \ | |
202 } | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
203 #define RGB565_FROM_RGB(Pixel, r, g, b) \ |
0 | 204 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
205 Pixel = ((r>>3)<<11)|((g>>2)<<5)|(b>>3); \ |
0 | 206 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
207 #define RGB555_FROM_RGB(Pixel, r, g, b) \ |
0 | 208 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
209 Pixel = ((r>>3)<<10)|((g>>3)<<5)|(b>>3); \ |
0 | 210 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
211 #define RGB888_FROM_RGB(Pixel, r, g, b) \ |
0 | 212 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
213 Pixel = (r<<16)|(g<<8)|b; \ |
0 | 214 } |
215 #define ASSEMBLE_RGB(buf, bpp, fmt, r, g, b) \ | |
216 { \ | |
217 switch (bpp) { \ | |
218 case 2: { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
219 Uint16 Pixel; \ |
0 | 220 \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
221 PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
222 *((Uint16 *)(buf)) = Pixel; \ |
0 | 223 } \ |
224 break; \ | |
225 \ | |
226 case 3: { \ | |
227 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
228 *((buf)+fmt->Rshift/8) = r; \ | |
229 *((buf)+fmt->Gshift/8) = g; \ | |
230 *((buf)+fmt->Bshift/8) = b; \ | |
231 } else { \ | |
232 *((buf)+2-fmt->Rshift/8) = r; \ | |
233 *((buf)+2-fmt->Gshift/8) = g; \ | |
234 *((buf)+2-fmt->Bshift/8) = b; \ | |
235 } \ | |
236 } \ | |
237 break; \ | |
238 \ | |
239 case 4: { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
240 Uint32 Pixel; \ |
0 | 241 \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
242 PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
243 *((Uint32 *)(buf)) = Pixel; \ |
0 | 244 } \ |
245 break; \ | |
246 } \ | |
247 } | |
248 #define ASSEMBLE_RGB_AMASK(buf, bpp, fmt, r, g, b, Amask) \ | |
249 { \ | |
250 switch (bpp) { \ | |
251 case 2: { \ | |
252 Uint16 *bufp; \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
253 Uint16 Pixel; \ |
0 | 254 \ |
255 bufp = (Uint16 *)buf; \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
256 PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
257 *bufp = Pixel | (*bufp & Amask); \ |
0 | 258 } \ |
259 break; \ | |
260 \ | |
261 case 3: { \ | |
262 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
263 *((buf)+fmt->Rshift/8) = r; \ | |
264 *((buf)+fmt->Gshift/8) = g; \ | |
265 *((buf)+fmt->Bshift/8) = b; \ | |
266 } else { \ | |
267 *((buf)+2-fmt->Rshift/8) = r; \ | |
268 *((buf)+2-fmt->Gshift/8) = g; \ | |
269 *((buf)+2-fmt->Bshift/8) = b; \ | |
270 } \ | |
271 } \ | |
272 break; \ | |
273 \ | |
274 case 4: { \ | |
275 Uint32 *bufp; \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
276 Uint32 Pixel; \ |
0 | 277 \ |
278 bufp = (Uint32 *)buf; \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
279 PIXEL_FROM_RGB(Pixel, fmt, r, g, b); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
280 *bufp = Pixel | (*bufp & Amask); \ |
0 | 281 } \ |
282 break; \ | |
283 } \ | |
284 } | |
285 | |
286 /* FIXME: Should we rescale alpha into 0..255 here? */ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
287 #define RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a) \ |
0 | 288 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
289 r = ((Pixel&fmt->Rmask)>>fmt->Rshift)<<fmt->Rloss; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
290 g = ((Pixel&fmt->Gmask)>>fmt->Gshift)<<fmt->Gloss; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
291 b = ((Pixel&fmt->Bmask)>>fmt->Bshift)<<fmt->Bloss; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
292 a = ((Pixel&fmt->Amask)>>fmt->Ashift)<<fmt->Aloss; \ |
0 | 293 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
294 #define RGBA_FROM_8888(Pixel, fmt, r, g, b, a) \ |
0 | 295 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
296 r = (Pixel&fmt->Rmask)>>fmt->Rshift; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
297 g = (Pixel&fmt->Gmask)>>fmt->Gshift; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
298 b = (Pixel&fmt->Bmask)>>fmt->Bshift; \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
299 a = (Pixel&fmt->Amask)>>fmt->Ashift; \ |
0 | 300 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
301 #define RGBA_FROM_RGBA8888(Pixel, r, g, b, a) \ |
0 | 302 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
303 r = (Pixel>>24); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
304 g = ((Pixel>>16)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
305 b = ((Pixel>>8)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
306 a = (Pixel&0xFF); \ |
0 | 307 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
308 #define RGBA_FROM_ARGB8888(Pixel, r, g, b, a) \ |
0 | 309 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
310 r = ((Pixel>>16)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
311 g = ((Pixel>>8)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
312 b = (Pixel&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
313 a = (Pixel>>24); \ |
0 | 314 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
315 #define RGBA_FROM_ABGR8888(Pixel, r, g, b, a) \ |
0 | 316 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
317 r = (Pixel&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
318 g = ((Pixel>>8)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
319 b = ((Pixel>>16)&0xFF); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
320 a = (Pixel>>24); \ |
0 | 321 } |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
322 #define DISEMBLE_RGBA(buf, bpp, fmt, Pixel, r, g, b, a) \ |
0 | 323 do { \ |
324 switch (bpp) { \ | |
325 case 2: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
326 Pixel = *((Uint16 *)(buf)); \ |
0 | 327 break; \ |
328 \ | |
329 case 3: {/* FIXME: broken code (no alpha) */ \ | |
330 Uint8 *b = (Uint8 *)buf; \ | |
331 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
332 Pixel = b[0] + (b[1] << 8) + (b[2] << 16); \ |
0 | 333 } else { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
334 Pixel = (b[0] << 16) + (b[1] << 8) + b[2]; \ |
0 | 335 } \ |
336 } \ | |
337 break; \ | |
338 \ | |
339 case 4: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
340 Pixel = *((Uint32 *)(buf)); \ |
0 | 341 break; \ |
342 \ | |
343 default: \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
344 Pixel = 0; /* stop gcc complaints */ \ |
0 | 345 break; \ |
346 } \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
347 RGBA_FROM_PIXEL(Pixel, fmt, r, g, b, a); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
348 Pixel &= ~fmt->Amask; \ |
0 | 349 } while(0) |
350 | |
351 /* FIXME: this isn't correct, especially for Alpha (maximum != 255) */ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
352 #define PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a) \ |
0 | 353 { \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
354 Pixel = ((r>>fmt->Rloss)<<fmt->Rshift)| \ |
0 | 355 ((g>>fmt->Gloss)<<fmt->Gshift)| \ |
356 ((b>>fmt->Bloss)<<fmt->Bshift)| \ | |
535
917cc5c56176
Fixed alpha blending bug (thanks Glenn!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
357 ((a>>fmt->Aloss)<<fmt->Ashift); \ |
0 | 358 } |
359 #define ASSEMBLE_RGBA(buf, bpp, fmt, r, g, b, a) \ | |
360 { \ | |
361 switch (bpp) { \ | |
362 case 2: { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
363 Uint16 Pixel; \ |
0 | 364 \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
365 PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
366 *((Uint16 *)(buf)) = Pixel; \ |
0 | 367 } \ |
368 break; \ | |
369 \ | |
370 case 3: { /* FIXME: broken code (no alpha) */ \ | |
371 if(SDL_BYTEORDER == SDL_LIL_ENDIAN) { \ | |
372 *((buf)+fmt->Rshift/8) = r; \ | |
373 *((buf)+fmt->Gshift/8) = g; \ | |
374 *((buf)+fmt->Bshift/8) = b; \ | |
375 } else { \ | |
376 *((buf)+2-fmt->Rshift/8) = r; \ | |
377 *((buf)+2-fmt->Gshift/8) = g; \ | |
378 *((buf)+2-fmt->Bshift/8) = b; \ | |
379 } \ | |
380 } \ | |
381 break; \ | |
382 \ | |
383 case 4: { \ | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
384 Uint32 Pixel; \ |
0 | 385 \ |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
386 PIXEL_FROM_RGBA(Pixel, fmt, r, g, b, a); \ |
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
387 *((Uint32 *)(buf)) = Pixel; \ |
0 | 388 } \ |
389 break; \ | |
390 } \ | |
391 } | |
392 | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
393 /* Blend the RGB values of two Pixels based on a source alpha value */ |
0 | 394 #define ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB) \ |
395 do { \ | |
396 dR = (((sR-dR)*(A))>>8)+dR; \ | |
397 dG = (((sG-dG)*(A))>>8)+dG; \ | |
398 dB = (((sB-dB)*(A))>>8)+dB; \ | |
399 } while(0) | |
400 | |
1162
2651158f59b8
Enable altivec blitters on PowerPC Linux, and some fixes for recent
Ryan C. Gordon <icculus@icculus.org>
parents:
1047
diff
changeset
|
401 /* Blend the RGB values of two Pixels based on a source alpha value */ |
1047
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
402 #define ACCURATE_ALPHA_BLEND(sR, sG, sB, sA, dR, dG, dB) \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
403 do { \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
404 unsigned tR, tG, tB, tA; \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
405 tA = 255 - sA; \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
406 tR = 1 + (sR * sA) + (dR * tA); \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
407 dR = (tR + (tR >> 8)) >> 8; \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
408 tG = 1 + (sG * sA) + (dG * tA); \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
409 dG = (tG + (tG >> 8)) >> 8; \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
410 tB = 1 + (sB * sA) + (dB * tA); \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
411 dB = (tB + (tB >> 8)) >> 8; \ |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
412 } while(0) |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
413 |
ffaaf7ecf685
Altivec-optimized blitters!
Ryan C. Gordon <icculus@icculus.org>
parents:
769
diff
changeset
|
414 |
0 | 415 /* This is a very useful loop for optimizing blitters */ |
553
417f8709e648
There's a bug in the VC7 optimizer relating to the duff loop optimization
Sam Lantinga <slouken@libsdl.org>
parents:
535
diff
changeset
|
416 #if defined(_MSC_VER) && (_MSC_VER == 1300) |
417f8709e648
There's a bug in the VC7 optimizer relating to the duff loop optimization
Sam Lantinga <slouken@libsdl.org>
parents:
535
diff
changeset
|
417 /* There's a bug in the Visual C++ 7 optimizer when compiling this code */ |
417f8709e648
There's a bug in the VC7 optimizer relating to the duff loop optimization
Sam Lantinga <slouken@libsdl.org>
parents:
535
diff
changeset
|
418 #else |
0 | 419 #define USE_DUFFS_LOOP |
553
417f8709e648
There's a bug in the VC7 optimizer relating to the duff loop optimization
Sam Lantinga <slouken@libsdl.org>
parents:
535
diff
changeset
|
420 #endif |
0 | 421 #ifdef USE_DUFFS_LOOP |
422 | |
423 /* 8-times unrolled loop */ | |
424 #define DUFFS_LOOP8(pixel_copy_increment, width) \ | |
425 { int n = (width+7)/8; \ | |
91
e85e03f195b4
From: "Markus F.X.J. Oberhumer"
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
426 switch (width & 7) { \ |
0 | 427 case 0: do { pixel_copy_increment; \ |
428 case 7: pixel_copy_increment; \ | |
429 case 6: pixel_copy_increment; \ | |
430 case 5: pixel_copy_increment; \ | |
431 case 4: pixel_copy_increment; \ | |
432 case 3: pixel_copy_increment; \ | |
433 case 2: pixel_copy_increment; \ | |
434 case 1: pixel_copy_increment; \ | |
435 } while ( --n > 0 ); \ | |
436 } \ | |
437 } | |
438 | |
439 /* 4-times unrolled loop */ | |
440 #define DUFFS_LOOP4(pixel_copy_increment, width) \ | |
441 { int n = (width+3)/4; \ | |
91
e85e03f195b4
From: "Markus F.X.J. Oberhumer"
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
442 switch (width & 3) { \ |
0 | 443 case 0: do { pixel_copy_increment; \ |
444 case 3: pixel_copy_increment; \ | |
445 case 2: pixel_copy_increment; \ | |
446 case 1: pixel_copy_increment; \ | |
447 } while ( --n > 0 ); \ | |
448 } \ | |
449 } | |
450 | |
689
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
451 /* 2 - times unrolled loop */ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
452 #define DUFFS_LOOP_DOUBLE2(pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
453 double_pixel_copy_increment, width) \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
454 { int n, w = width; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
455 if( w & 1 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
456 pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
457 w--; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
458 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
459 if ( w > 0 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
460 n = ( w + 2) / 4; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
461 switch( w & 2 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
462 case 0: do { double_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
463 case 2: double_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
464 } while ( --n > 0 ); \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
465 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
466 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
467 } |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
468 |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
469 /* 2 - times unrolled loop 4 pixels */ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
470 #define DUFFS_LOOP_QUATRO2(pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
471 double_pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
472 quatro_pixel_copy_increment, width) \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
473 { int n, w = width; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
474 if(w & 1) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
475 pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
476 w--; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
477 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
478 if(w & 2) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
479 double_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
480 w -= 2; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
481 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
482 if ( w > 0 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
483 n = ( w + 7 ) / 8; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
484 switch( w & 4 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
485 case 0: do { quatro_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
486 case 4: quatro_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
487 } while ( --n > 0 ); \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
488 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
489 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
490 } |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
491 |
0 | 492 /* Use the 8-times version of the loop by default */ |
493 #define DUFFS_LOOP(pixel_copy_increment, width) \ | |
494 DUFFS_LOOP8(pixel_copy_increment, width) | |
495 | |
496 #else | |
497 | |
498 /* Don't use Duff's device to unroll loops */ | |
689
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
499 #define DUFFS_LOOP_DOUBLE2(pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
500 double_pixel_copy_increment, width) \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
501 { int n = width; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
502 if( n & 1 ) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
503 pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
504 n--; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
505 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
506 n=n>>1; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
507 for(; n > 0; --n) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
508 double_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
509 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
510 } |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
511 |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
512 /* Don't use Duff's device to unroll loops */ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
513 #define DUFFS_LOOP_QUATRO2(pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
514 double_pixel_copy_increment, \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
515 quatro_pixel_copy_increment, width) \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
516 { int n = width; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
517 if(n & 1) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
518 pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
519 n--; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
520 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
521 if(n & 2) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
522 double_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
523 n -= 2; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
524 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
525 n=n>>2; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
526 for(; n > 0; --n) { \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
527 quatro_pixel_copy_increment; \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
528 } \ |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
529 } |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
530 |
5bb080d35049
Date: Tue, 19 Aug 2003 17:57:00 +0200
Sam Lantinga <slouken@libsdl.org>
parents:
553
diff
changeset
|
531 /* Don't use Duff's device to unroll loops */ |
0 | 532 #define DUFFS_LOOP(pixel_copy_increment, width) \ |
533 { int n; \ | |
534 for ( n=width; n > 0; --n ) { \ | |
535 pixel_copy_increment; \ | |
536 } \ | |
537 } | |
538 #define DUFFS_LOOP8(pixel_copy_increment, width) \ | |
539 DUFFS_LOOP(pixel_copy_increment, width) | |
540 #define DUFFS_LOOP4(pixel_copy_increment, width) \ | |
541 DUFFS_LOOP(pixel_copy_increment, width) | |
542 | |
543 #endif /* USE_DUFFS_LOOP */ | |
544 | |
545 /* Prevent Visual C++ 6.0 from printing out stupid warnings */ | |
546 #if defined(_MSC_VER) && (_MSC_VER >= 600) | |
547 #pragma warning(disable: 4550) | |
548 #endif | |
549 | |
550 #endif /* _SDL_blit_h */ | |
1895
c121d94672cb
SDL 1.2 is moving to a branch, and SDL 1.3 is becoming the head.
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
551 /* vi: set ts=4 sw=4 expandtab: */ |