slouken@2898
|
1 |
/*
|
slouken@2898
|
2 |
SDL - Simple DirectMedia Layer
|
slouken@2898
|
3 |
Copyright (C) 1997-2009 Sam Lantinga
|
slouken@2898
|
4 |
|
slouken@2898
|
5 |
This library is free software; you can redistribute it and/or
|
slouken@2898
|
6 |
modify it under the terms of the GNU Lesser General Public
|
slouken@2898
|
7 |
License as published by the Free Software Foundation; either
|
slouken@2898
|
8 |
version 2.1 of the License, or (at your option) any later version.
|
slouken@2898
|
9 |
|
slouken@2898
|
10 |
This library is distributed in the hope that it will be useful,
|
slouken@2898
|
11 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
slouken@2898
|
12 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
slouken@2898
|
13 |
Lesser General Public License for more details.
|
slouken@2898
|
14 |
|
slouken@2898
|
15 |
You should have received a copy of the GNU Lesser General Public
|
slouken@2898
|
16 |
License along with this library; if not, write to the Free Software
|
slouken@2898
|
17 |
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
slouken@2898
|
18 |
|
slouken@2898
|
19 |
Sam Lantinga
|
slouken@2898
|
20 |
slouken@libsdl.org
|
slouken@2898
|
21 |
*/
|
slouken@2898
|
22 |
#include "SDL_config.h"
|
slouken@2898
|
23 |
|
slouken@2898
|
24 |
#include "SDL_blit.h"
|
slouken@2898
|
25 |
|
slouken@2898
|
26 |
/* This code assumes that r, g, b, a are the source color,
|
slouken@2898
|
27 |
* and in the blend and add case, the RGB values are premultiplied by a.
|
slouken@2898
|
28 |
*/
|
slouken@2898
|
29 |
|
slouken@2898
|
30 |
#define DRAW_MUL(_a, _b) (((unsigned)(_a)*(_b))/255)
|
slouken@2898
|
31 |
|
slouken@2898
|
32 |
#define DRAW_SETPIXEL(setpixel) \
|
slouken@2898
|
33 |
do { \
|
slouken@2898
|
34 |
unsigned sr = r, sg = g, sb = b, sa = a; \
|
slouken@2898
|
35 |
setpixel; \
|
slouken@2898
|
36 |
} while (0)
|
slouken@2898
|
37 |
|
slouken@2898
|
38 |
#define DRAW_SETPIXEL_BLEND(getpixel, setpixel) \
|
slouken@2898
|
39 |
do { \
|
slouken@2898
|
40 |
unsigned sr, sg, sb, sa; sa; \
|
slouken@2898
|
41 |
getpixel; \
|
slouken@2898
|
42 |
sr = DRAW_MUL(inva, sr) + r; \
|
slouken@2898
|
43 |
sg = DRAW_MUL(inva, sg) + g; \
|
slouken@2898
|
44 |
sb = DRAW_MUL(inva, sb) + b; \
|
slouken@2898
|
45 |
setpixel; \
|
slouken@2898
|
46 |
} while (0)
|
slouken@2898
|
47 |
|
slouken@2898
|
48 |
#define DRAW_SETPIXEL_ADD(getpixel, setpixel) \
|
slouken@2898
|
49 |
do { \
|
slouken@2898
|
50 |
unsigned sr, sg, sb, sa; sa; \
|
slouken@2898
|
51 |
getpixel; \
|
slouken@2898
|
52 |
sr += r; if (sr > 0xff) sr = 0xff; \
|
slouken@2898
|
53 |
sg += g; if (sg > 0xff) sg = 0xff; \
|
slouken@2898
|
54 |
sb += b; if (sb > 0xff) sb = 0xff; \
|
slouken@2898
|
55 |
setpixel; \
|
slouken@2898
|
56 |
} while (0)
|
slouken@2898
|
57 |
|
slouken@2898
|
58 |
#define DRAW_SETPIXEL_MOD(getpixel, setpixel) \
|
slouken@2898
|
59 |
do { \
|
slouken@2898
|
60 |
unsigned sr, sg, sb, sa; sa; \
|
slouken@2898
|
61 |
getpixel; \
|
slouken@2898
|
62 |
sr = DRAW_MUL(sr, r); \
|
slouken@2898
|
63 |
sg = DRAW_MUL(sg, g); \
|
slouken@2898
|
64 |
sb = DRAW_MUL(sb, b); \
|
slouken@2898
|
65 |
setpixel; \
|
slouken@2898
|
66 |
} while (0)
|
slouken@2898
|
67 |
|
slouken@2898
|
68 |
#define DRAW_SETPIXELXY(x, y, type, bpp, op) \
|
slouken@2898
|
69 |
do { \
|
slouken@2898
|
70 |
type *pixel = (type *)(dst->pixels + y * dst->pitch + x * bpp); \
|
slouken@2898
|
71 |
op; \
|
slouken@2898
|
72 |
} while (0)
|
slouken@2898
|
73 |
|
slouken@2898
|
74 |
/*
|
slouken@2898
|
75 |
* Define draw operators for RGB555
|
slouken@2898
|
76 |
*/
|
slouken@2898
|
77 |
|
slouken@2898
|
78 |
#define DRAW_SETPIXEL_RGB555 \
|
slouken@2898
|
79 |
DRAW_SETPIXEL(RGB555_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
80 |
|
slouken@2898
|
81 |
#define DRAW_SETPIXEL_BLEND_RGB555 \
|
slouken@2898
|
82 |
DRAW_SETPIXEL_BLEND(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
|
slouken@2898
|
83 |
RGB555_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
84 |
|
slouken@2898
|
85 |
#define DRAW_SETPIXEL_ADD_RGB555 \
|
slouken@2898
|
86 |
DRAW_SETPIXEL_ADD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
|
slouken@2898
|
87 |
RGB555_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
88 |
|
slouken@2898
|
89 |
#define DRAW_SETPIXEL_MOD_RGB555 \
|
slouken@2898
|
90 |
DRAW_SETPIXEL_MOD(RGB_FROM_RGB555(*pixel, sr, sg, sb), \
|
slouken@2898
|
91 |
RGB555_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
92 |
|
slouken@2898
|
93 |
#define DRAW_SETPIXELXY_RGB555(x, y) \
|
slouken@2898
|
94 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB555)
|
slouken@2898
|
95 |
|
slouken@2898
|
96 |
#define DRAW_SETPIXELXY_BLEND_RGB555(x, y) \
|
slouken@2898
|
97 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB555)
|
slouken@2898
|
98 |
|
slouken@2898
|
99 |
#define DRAW_SETPIXELXY_ADD_RGB555(x, y) \
|
slouken@2898
|
100 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB555)
|
slouken@2898
|
101 |
|
slouken@2898
|
102 |
#define DRAW_SETPIXELXY_MOD_RGB555(x, y) \
|
slouken@2898
|
103 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB555)
|
slouken@2898
|
104 |
|
slouken@2898
|
105 |
/*
|
slouken@2898
|
106 |
* Define draw operators for RGB565
|
slouken@2898
|
107 |
*/
|
slouken@2898
|
108 |
|
slouken@2898
|
109 |
#define DRAW_SETPIXEL_RGB565 \
|
slouken@2898
|
110 |
DRAW_SETPIXEL(RGB565_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
111 |
|
slouken@2898
|
112 |
#define DRAW_SETPIXEL_BLEND_RGB565 \
|
slouken@2898
|
113 |
DRAW_SETPIXEL_BLEND(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
|
slouken@2898
|
114 |
RGB565_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
115 |
|
slouken@2898
|
116 |
#define DRAW_SETPIXEL_ADD_RGB565 \
|
slouken@2898
|
117 |
DRAW_SETPIXEL_ADD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
|
slouken@2898
|
118 |
RGB565_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
119 |
|
slouken@2898
|
120 |
#define DRAW_SETPIXEL_MOD_RGB565 \
|
slouken@2898
|
121 |
DRAW_SETPIXEL_MOD(RGB_FROM_RGB565(*pixel, sr, sg, sb), \
|
slouken@2898
|
122 |
RGB565_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
123 |
|
slouken@2898
|
124 |
#define DRAW_SETPIXELXY_RGB565(x, y) \
|
slouken@2898
|
125 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB565)
|
slouken@2898
|
126 |
|
slouken@2898
|
127 |
#define DRAW_SETPIXELXY_BLEND_RGB565(x, y) \
|
slouken@2898
|
128 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB565)
|
slouken@2898
|
129 |
|
slouken@2898
|
130 |
#define DRAW_SETPIXELXY_ADD_RGB565(x, y) \
|
slouken@2898
|
131 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB565)
|
slouken@2898
|
132 |
|
slouken@2898
|
133 |
#define DRAW_SETPIXELXY_MOD_RGB565(x, y) \
|
slouken@2898
|
134 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB565)
|
slouken@2898
|
135 |
|
slouken@2898
|
136 |
/*
|
slouken@2898
|
137 |
* Define draw operators for RGB888
|
slouken@2898
|
138 |
*/
|
slouken@2898
|
139 |
|
slouken@2898
|
140 |
#define DRAW_SETPIXEL_RGB888 \
|
slouken@2898
|
141 |
DRAW_SETPIXEL(RGB888_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
142 |
|
slouken@2898
|
143 |
#define DRAW_SETPIXEL_BLEND_RGB888 \
|
slouken@2898
|
144 |
DRAW_SETPIXEL_BLEND(RGB_FROM_RGB888(*pixel, sr, sg, sb), \
|
slouken@2898
|
145 |
RGB888_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
146 |
|
slouken@2898
|
147 |
#define DRAW_SETPIXEL_ADD_RGB888 \
|
slouken@2898
|
148 |
DRAW_SETPIXEL_ADD(RGB_FROM_RGB888(*pixel, sr, sg, sb), \
|
slouken@2898
|
149 |
RGB888_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
150 |
|
slouken@2898
|
151 |
#define DRAW_SETPIXEL_MOD_RGB888 \
|
slouken@2898
|
152 |
DRAW_SETPIXEL_MOD(RGB_FROM_RGB888(*pixel, sr, sg, sb), \
|
slouken@2898
|
153 |
RGB888_FROM_RGB(*pixel, sr, sg, sb))
|
slouken@2898
|
154 |
|
slouken@2898
|
155 |
#define DRAW_SETPIXELXY_RGB888(x, y) \
|
slouken@2898
|
156 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGB888)
|
slouken@2898
|
157 |
|
slouken@2898
|
158 |
#define DRAW_SETPIXELXY_BLEND_RGB888(x, y) \
|
slouken@2898
|
159 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB888)
|
slouken@2898
|
160 |
|
slouken@2898
|
161 |
#define DRAW_SETPIXELXY_ADD_RGB888(x, y) \
|
slouken@2898
|
162 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGB888)
|
slouken@2898
|
163 |
|
slouken@2898
|
164 |
#define DRAW_SETPIXELXY_MOD_RGB888(x, y) \
|
slouken@2898
|
165 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGB888)
|
slouken@2898
|
166 |
|
slouken@2898
|
167 |
/*
|
slouken@2899
|
168 |
* Define draw operators for ARGB8888
|
slouken@2899
|
169 |
*/
|
slouken@2899
|
170 |
|
slouken@2899
|
171 |
#define DRAW_SETPIXEL_ARGB8888 \
|
slouken@2899
|
172 |
DRAW_SETPIXEL(ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
|
slouken@2899
|
173 |
|
slouken@2899
|
174 |
#define DRAW_SETPIXEL_BLEND_ARGB8888 \
|
slouken@2899
|
175 |
DRAW_SETPIXEL_BLEND(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
|
slouken@2899
|
176 |
ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
|
slouken@2899
|
177 |
|
slouken@2899
|
178 |
#define DRAW_SETPIXEL_ADD_ARGB8888 \
|
slouken@2899
|
179 |
DRAW_SETPIXEL_ADD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
|
slouken@2899
|
180 |
ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
|
slouken@2899
|
181 |
|
slouken@2899
|
182 |
#define DRAW_SETPIXEL_MOD_ARGB8888 \
|
slouken@2899
|
183 |
DRAW_SETPIXEL_MOD(RGBA_FROM_ARGB8888(*pixel, sr, sg, sb, sa), \
|
slouken@2899
|
184 |
ARGB8888_FROM_RGBA(*pixel, sr, sg, sb, sa))
|
slouken@2899
|
185 |
|
slouken@2899
|
186 |
#define DRAW_SETPIXELXY_ARGB8888(x, y) \
|
slouken@2899
|
187 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ARGB8888)
|
slouken@2899
|
188 |
|
slouken@2899
|
189 |
#define DRAW_SETPIXELXY_BLEND_ARGB8888(x, y) \
|
slouken@2899
|
190 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_ARGB8888)
|
slouken@2899
|
191 |
|
slouken@2899
|
192 |
#define DRAW_SETPIXELXY_ADD_ARGB8888(x, y) \
|
slouken@2899
|
193 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_ARGB8888)
|
slouken@2899
|
194 |
|
slouken@2899
|
195 |
#define DRAW_SETPIXELXY_MOD_ARGB8888(x, y) \
|
slouken@2899
|
196 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_ARGB8888)
|
slouken@2899
|
197 |
|
slouken@2899
|
198 |
/*
|
slouken@2898
|
199 |
* Define draw operators for general RGB
|
slouken@2898
|
200 |
*/
|
slouken@2898
|
201 |
|
slouken@2898
|
202 |
#define DRAW_SETPIXEL_RGB \
|
slouken@2898
|
203 |
DRAW_SETPIXEL(PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
|
slouken@2898
|
204 |
|
slouken@2898
|
205 |
#define DRAW_SETPIXEL_BLEND_RGB \
|
slouken@2898
|
206 |
DRAW_SETPIXEL_BLEND(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
|
slouken@2898
|
207 |
PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
|
slouken@2898
|
208 |
|
slouken@2898
|
209 |
#define DRAW_SETPIXEL_ADD_RGB \
|
slouken@2898
|
210 |
DRAW_SETPIXEL_ADD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
|
slouken@2898
|
211 |
PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
|
slouken@2898
|
212 |
|
slouken@2898
|
213 |
#define DRAW_SETPIXEL_MOD_RGB \
|
slouken@2898
|
214 |
DRAW_SETPIXEL_MOD(RGB_FROM_PIXEL(*pixel, fmt, sr, sg, sb), \
|
slouken@2898
|
215 |
PIXEL_FROM_RGB(*pixel, fmt, sr, sg, sb))
|
slouken@2898
|
216 |
|
slouken@2898
|
217 |
#define DRAW_SETPIXELXY2_RGB(x, y) \
|
slouken@2898
|
218 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_RGB)
|
slouken@2898
|
219 |
|
slouken@2898
|
220 |
#define DRAW_SETPIXELXY4_RGB(x, y) \
|
slouken@2898
|
221 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGB)
|
slouken@2898
|
222 |
|
slouken@2898
|
223 |
#define DRAW_SETPIXELXY2_BLEND_RGB(x, y) \
|
slouken@2898
|
224 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_BLEND_RGB)
|
slouken@2898
|
225 |
|
slouken@2898
|
226 |
#define DRAW_SETPIXELXY4_BLEND_RGB(x, y) \
|
slouken@2898
|
227 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGB)
|
slouken@2898
|
228 |
|
slouken@2898
|
229 |
#define DRAW_SETPIXELXY2_ADD_RGB(x, y) \
|
slouken@2898
|
230 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_ADD_RGB)
|
slouken@2898
|
231 |
|
slouken@2898
|
232 |
#define DRAW_SETPIXELXY4_ADD_RGB(x, y) \
|
slouken@2898
|
233 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGB)
|
slouken@2898
|
234 |
|
slouken@2898
|
235 |
#define DRAW_SETPIXELXY2_MOD_RGB(x, y) \
|
slouken@2898
|
236 |
DRAW_SETPIXELXY(x, y, Uint16, 2, DRAW_SETPIXEL_MOD_RGB)
|
slouken@2898
|
237 |
|
slouken@2898
|
238 |
#define DRAW_SETPIXELXY4_MOD_RGB(x, y) \
|
slouken@2898
|
239 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGB)
|
slouken@2898
|
240 |
|
slouken@2898
|
241 |
|
slouken@2898
|
242 |
/*
|
slouken@2898
|
243 |
* Define draw operators for general RGBA
|
slouken@2898
|
244 |
*/
|
slouken@2898
|
245 |
|
slouken@2898
|
246 |
#define DRAW_SETPIXEL_RGBA \
|
slouken@2898
|
247 |
DRAW_SETPIXEL(PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
|
slouken@2898
|
248 |
|
slouken@2898
|
249 |
#define DRAW_SETPIXEL_BLEND_RGBA \
|
slouken@2898
|
250 |
DRAW_SETPIXEL_BLEND(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
|
slouken@2898
|
251 |
PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
|
slouken@2898
|
252 |
|
slouken@2898
|
253 |
#define DRAW_SETPIXEL_ADD_RGBA \
|
slouken@2898
|
254 |
DRAW_SETPIXEL_ADD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
|
slouken@2898
|
255 |
PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
|
slouken@2898
|
256 |
|
slouken@2898
|
257 |
#define DRAW_SETPIXEL_MOD_RGBA \
|
slouken@2898
|
258 |
DRAW_SETPIXEL_MOD(RGBA_FROM_PIXEL(*pixel, fmt, sr, sg, sb, sa), \
|
slouken@2898
|
259 |
PIXEL_FROM_RGBA(*pixel, fmt, sr, sg, sb, sa))
|
slouken@2898
|
260 |
|
slouken@2898
|
261 |
#define DRAW_SETPIXELXY4_RGBA(x, y) \
|
slouken@2898
|
262 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_RGBA)
|
slouken@2898
|
263 |
|
slouken@2898
|
264 |
#define DRAW_SETPIXELXY4_BLEND_RGBA(x, y) \
|
slouken@2898
|
265 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_BLEND_RGBA)
|
slouken@2898
|
266 |
|
slouken@2898
|
267 |
#define DRAW_SETPIXELXY4_ADD_RGBA(x, y) \
|
slouken@2898
|
268 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_ADD_RGBA)
|
slouken@2898
|
269 |
|
slouken@2898
|
270 |
#define DRAW_SETPIXELXY4_MOD_RGBA(x, y) \
|
slouken@2898
|
271 |
DRAW_SETPIXELXY(x, y, Uint32, 4, DRAW_SETPIXEL_MOD_RGBA)
|
slouken@2898
|
272 |
|
slouken@2898
|
273 |
/*
|
slouken@2898
|
274 |
* Define line drawing macro
|
slouken@2898
|
275 |
*/
|
slouken@2898
|
276 |
|
slouken@2898
|
277 |
#define ABS(_x) ((_x) < 0 ? -(_x) : (_x))
|
slouken@2898
|
278 |
|
slouken@2898
|
279 |
#define SWAP(_x, _y) do { int tmp; tmp = _x; _x = _y; _y = tmp; } while (0)
|
slouken@2898
|
280 |
|
slouken@2898
|
281 |
#define BRESENHAM(x0, y0, x1, y1, op) \
|
slouken@2898
|
282 |
{ \
|
slouken@2898
|
283 |
int deltax, deltay, steep, error, xstep, ystep, x, y; \
|
slouken@2898
|
284 |
\
|
slouken@2898
|
285 |
deltax = ABS(x1 - x0); \
|
slouken@2898
|
286 |
deltay = ABS(y1 - y0); \
|
slouken@2898
|
287 |
steep = (deltay > deltax); \
|
slouken@2898
|
288 |
if (steep) { \
|
slouken@2898
|
289 |
SWAP(x0, y0); \
|
slouken@2898
|
290 |
SWAP(x1, y1); \
|
slouken@2898
|
291 |
SWAP(deltax, deltay); \
|
slouken@2898
|
292 |
} \
|
slouken@2898
|
293 |
error = (x1 - x0) / 2; \
|
slouken@2898
|
294 |
y = y0; \
|
slouken@2898
|
295 |
if (x0 > x1) { \
|
slouken@2898
|
296 |
xstep = -1; \
|
slouken@2898
|
297 |
} else { \
|
slouken@2898
|
298 |
xstep = 1; \
|
slouken@2898
|
299 |
} \
|
slouken@2898
|
300 |
if (y0 < y1) { \
|
slouken@2898
|
301 |
ystep = 1; \
|
slouken@2898
|
302 |
} else { \
|
slouken@2898
|
303 |
ystep = -1; \
|
slouken@2898
|
304 |
} \
|
slouken@2898
|
305 |
if (!steep) { \
|
slouken@2898
|
306 |
for (x = x0; x != x1; x += xstep) { \
|
slouken@2898
|
307 |
op(x, y); \
|
slouken@2898
|
308 |
error -= deltay; \
|
slouken@2898
|
309 |
if (error < 0) { \
|
slouken@2898
|
310 |
y += ystep; \
|
slouken@2898
|
311 |
error += deltax; \
|
slouken@2898
|
312 |
} \
|
slouken@2898
|
313 |
} \
|
slouken@2898
|
314 |
} else { \
|
slouken@2898
|
315 |
for (x = x0; x != x1; x += xstep) { \
|
slouken@2898
|
316 |
op(y, x); \
|
slouken@2898
|
317 |
error -= deltay; \
|
slouken@2898
|
318 |
if (error < 0) { \
|
slouken@2898
|
319 |
y += ystep; \
|
slouken@2898
|
320 |
error += deltax; \
|
slouken@2898
|
321 |
} \
|
slouken@2898
|
322 |
} \
|
slouken@2898
|
323 |
} \
|
slouken@2898
|
324 |
}
|
slouken@2898
|
325 |
|
slouken@2898
|
326 |
/*
|
slouken@2898
|
327 |
* Define blend fill macro
|
slouken@2898
|
328 |
*/
|
slouken@2898
|
329 |
|
slouken@2898
|
330 |
#define BLENDRECT(type, op) \
|
slouken@2898
|
331 |
do { \
|
slouken@2898
|
332 |
int w; \
|
slouken@2898
|
333 |
int width = dstrect->w; \
|
slouken@2898
|
334 |
int height = dstrect->h; \
|
slouken@2898
|
335 |
int pitch = (dst->pitch / dst->format->BytesPerPixel); \
|
slouken@2898
|
336 |
int skip = pitch - width; \
|
slouken@2898
|
337 |
type *pixel = (type *)dst->pixels + dstrect->y * pitch + dstrect->x; \
|
slouken@2898
|
338 |
while (height--) { \
|
slouken@2898
|
339 |
{ int n = (width+3)/4; \
|
slouken@2898
|
340 |
switch (width & 3) { \
|
slouken@2898
|
341 |
case 0: do { op; pixel++; \
|
slouken@2898
|
342 |
case 3: op; pixel++; \
|
slouken@2898
|
343 |
case 2: op; pixel++; \
|
slouken@2898
|
344 |
case 1: op; pixel++; \
|
slouken@2898
|
345 |
} while ( --n > 0 ); \
|
slouken@2898
|
346 |
} \
|
slouken@2898
|
347 |
} \
|
slouken@2898
|
348 |
pixel += skip; \
|
slouken@2898
|
349 |
} \
|
slouken@2898
|
350 |
} while (0)
|
slouken@2898
|
351 |
|
slouken@2898
|
352 |
/*
|
slouken@2898
|
353 |
* Define blend line macro
|
slouken@2898
|
354 |
*/
|
slouken@2898
|
355 |
|
slouken@2898
|
356 |
/* vi: set ts=4 sw=4 expandtab: */
|