comparison dmblitfunc.h @ 0:32250b436bca

Initial re-import.
author Matti Hamalainen <ccr@tnsp.org>
date Fri, 28 Sep 2012 01:54:23 +0300
parents
children 62b2c3de93a8
comparison
equal deleted inserted replaced
-1:000000000000 0:32250b436bca
1 /*
2 * DMLib
3 * -- Sprite / surface blitting functions
4 * Programmed and designed by Matti 'ccr' Hamalainen
5 * (C) Copyright 2011-2012 Tecnic Software productions (TNSP)
6 */
7
8 // =======================================================================
9 // DMD_NONE
10 // =======================================================================
11
12 #define DM_SCALED_NAME dmScaledBlitSurface8to8
13 #define DM_SCALED_SRC_BYTES 1
14 #define DM_SCALED_DST_BYTES 1
15 #define DM_SCALED_SRC_TYPE Uint8
16 #define DM_SCALED_DST_TYPE Uint8
17
18 #define DM_SCALED_INNER *dp++ = sp[FP_GETH(xv)];
19
20 #include "dmscaledblit.h"
21
22 // -----------------------------------------------------------------------
23
24 #define DM_SCALED_NAME dmScaledBlitSurface8to32
25 #define DM_SCALED_SRC_BYTES 1
26 #define DM_SCALED_DST_BYTES 4
27 #define DM_SCALED_SRC_TYPE Uint8
28 #define DM_SCALED_DST_TYPE Uint32
29
30 #define DM_SCALED_VARS const Uint32 *pal;
31 #define DM_SCALED_INIT \
32 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \
33 pal = (Uint32 *) src->format->palette->colors;
34
35 #define DM_SCALED_INNER *dp++ = pal[sp[FP_GETH(xv)]];
36
37 #include "dmscaledblit.h"
38
39 // -----------------------------------------------------------------------
40
41 #define DM_SCALED_NAME dmScaledBlitSurface32to32
42 #define DM_SCALED_SRC_BYTES 4
43 #define DM_SCALED_DST_BYTES 4
44 #define DM_SCALED_SRC_TYPE Uint32
45 #define DM_SCALED_DST_TYPE Uint32
46 #define DM_SCALED_INIT
47
48 #define DM_SCALED_INNER *dp++ = sp[FP_GETH(xv)];
49
50 #include "dmscaledblit.h"
51
52
53 // =======================================================================
54 // DMD_TRANSPARENT
55 // =======================================================================
56
57 #define DM_SCALED_NAME dmScaledBlitSurface8to8Transparent
58 #define DM_SCALED_SRC_BYTES 1
59 #define DM_SCALED_DST_BYTES 1
60 #define DM_SCALED_SRC_TYPE Uint8
61 #define DM_SCALED_DST_TYPE Uint8
62
63 #define DM_SCALED_INNER \
64 *dp = sp[FP_GETH(xv)] ? sp[FP_GETH(xv)] : *dp; dp++;
65
66 #include "dmscaledblit.h"
67
68 // -----------------------------------------------------------------------
69
70 #define DM_SCALED_NAME dmScaledBlitSurface8to32Transparent
71 #define DM_SCALED_SRC_BYTES 1
72 #define DM_SCALED_DST_BYTES 4
73 #define DM_SCALED_SRC_TYPE Uint8
74 #define DM_SCALED_DST_TYPE DMRGBA32
75 #define DM_SCALED_VARS const DMRGBA32 *pal;
76 #define DM_SCALED_INIT \
77 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \
78 pal = (DMRGBA32 *) src->format->palette->colors;
79
80 #define DM_SCALED_INNER \
81 const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \
82 dp->r += ((q.r - dp->r) * q.a) >> 8; \
83 dp->g += ((q.g - dp->g) * q.a) >> 8; \
84 dp->b += ((q.b - dp->b) * q.a) >> 8; \
85 dp->a = q.a; \
86 dp++;
87
88 #include "dmscaledblit.h"
89
90
91 // -----------------------------------------------------------------------
92
93 #define DM_SCALED_NAME dmScaledBlitSurface32to32Transparent
94 #define DM_SCALED_SRC_BYTES 4
95 #define DM_SCALED_DST_BYTES 4
96 #define DM_SCALED_INIT
97
98 #ifdef DM_USE_SIMD
99 #define DM_SCALED_INNER_INIT \
100 const Uint32 qpdmask = 0x000000ff;
101
102 #define DM_SCALED_SRC_TYPE Uint32
103 #define DM_SCALED_DST_TYPE Uint32
104 #define DM_SCALED_INNER \
105 asm( \
106 "movd %2, %%mm1\n" \
107 "movq %%mm1, %%mm3\n" \
108 "movd %3, %%mm5\n" \
109 "pand %%mm5, %%mm3\n" \
110 "movq %%mm3, %%mm4\n" \
111 "psllq $8, %%mm4\n" \
112 "por %%mm4, %%mm3\n" \
113 "psllq $16, %%mm3\n" \
114 "por %%mm3, %%mm4\n" \
115 \
116 "pxor %%mm2, %%mm2\n" \
117 "punpcklbw %%mm2, %%mm4\n" \
118 \
119 "movd %1, %%mm3\n" \
120 "punpcklbw %%mm2, %%mm1\n" \
121 "punpcklbw %%mm2, %%mm3\n" \
122 "psubw %%mm3, %%mm1\n" \
123 "pmullw %%mm4, %%mm1\n" \
124 "psrlw $8, %%mm1\n" \
125 "packuswb %%mm2, %%mm1\n" \
126 "movd %%mm1, %0\n" \
127 : "=m" (*dp) \
128 : "m" (*dp), "m" (sp[FP_GETH(xv)]), "m" (qpdmask) \
129 : "memory" ); dp++;
130
131 #define DM_SCALED_FINISH asm("emms\n");
132 #else
133 #define DM_SCALED_SRC_TYPE DMRGBA32
134 #define DM_SCALED_DST_TYPE DMRGBA32
135 #define DM_SCALED_INNER \
136 const DMRGBA32 q = sp[FP_GETH(xv)]; \
137 dp->r += ((q.r - dp->r) * q.a) >> 8; \
138 dp->g += ((q.g - dp->g) * q.a) >> 8; \
139 dp->b += ((q.b - dp->b) * q.a) >> 8; \
140 dp->a = q.a; \
141 dp++;
142 #endif
143
144 #include "dmscaledblit.h"
145
146 // -----------------------------------------------------------------------
147
148 #define DM_SCALED_NAME dmScaledBlitSurface32to32TransparentX
149 #define DM_SCALED_SRC_BYTES 4
150 #define DM_SCALED_DST_BYTES 4
151 #define DM_SCALED_SRC_TYPE DMRGBA32
152 #define DM_SCALED_DST_TYPE DMRGBA32
153 #define DM_SCALED_INIT
154
155 #define DM_SCALED_INNER \
156 const DMRGBA32 q = sp[FP_GETH(xv)]; \
157 dp->r = (q.r * q.a + dp->r * dp->a) >> 9; \
158 dp->g = (q.g * q.a + dp->g * dp->a) >> 9; \
159 dp->b = (q.b * q.a + dp->b * dp->a) >> 9; \
160 dp->a = q.a ? q.a : dp->a; \
161 dp++;
162
163 #include "dmscaledblit.h"
164
165
166 // =======================================================================
167 // DMD_SATURATE
168 // =======================================================================
169
170 #define DM_SCALED_NAME dmScaledBlitSurface8to8Saturate
171 #define DM_SCALED_SRC_BYTES 1
172 #define DM_SCALED_DST_BYTES 1
173 #define DM_SCALED_SRC_TYPE Uint8
174 #define DM_SCALED_DST_TYPE Uint8
175 #define DM_SCALED_INNER *(dp++) += sp[FP_GETH(xv)];
176 #include "dmscaledblit.h"
177
178 // -----------------------------------------------------------------------
179
180 #define DM_SCALED_NAME dmScaledBlitSurface8to32Saturate
181 #define DM_SCALED_SRC_BYTES 1
182 #define DM_SCALED_DST_BYTES 4
183 #define DM_SCALED_SRC_TYPE Uint8
184 #define DM_SCALED_DST_TYPE DMRGBA32
185 #define DM_SCALED_VARS const DMRGBA32 *pal;
186 #define DM_SCALED_INIT \
187 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \
188 pal = (DMRGBA32 *) src->format->palette->colors;
189
190 #ifdef DM_USE_SIMD
191 #define DM_SCALED_INNER \
192 asm("movd %2, %%mm1\n" \
193 "movd %1, %%mm2\n" \
194 "paddusb %%mm2, %%mm1\n" \
195 "movd %%mm1, %0\n" \
196 : "=m" (*dp) \
197 : "m" (*dp), "m" (pal[sp[FP_GETH(xv)]]) \
198 : "memory" ); dp++;
199
200 #define DM_SCALED_FINISH asm("emms\n");
201 #else
202 #define DM_SCALED_INNER \
203 const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \
204 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \
205 dp->r = qr < 256 ? qr : 255; \
206 dp->g = qg < 256 ? qg : 255; \
207 dp->b = qb < 256 ? qb : 255; \
208 dp->a = q.a; \
209 dp++;
210 #endif
211
212 #include "dmscaledblit.h"
213
214 // -----------------------------------------------------------------------
215
216 #define DM_SCALED_NAME dmScaledBlitSurface32to32Saturate
217 #define DM_SCALED_SRC_BYTES 4
218 #define DM_SCALED_DST_BYTES 4
219 #define DM_SCALED_INIT
220
221 #ifdef DM_USE_SIMD
222 #define DM_SCALED_SRC_TYPE Uint32
223 #define DM_SCALED_DST_TYPE Uint32
224 #define DM_SCALED_INNER \
225 asm("movd %2, %%mm1\n" \
226 "movd %1, %%mm2\n" \
227 "paddusb %%mm2, %%mm1\n" \
228 "movd %%mm1, %0\n" \
229 : "=m" (*dp) \
230 : "m" (*dp), "m" (sp[FP_GETH(xv)]) \
231 : "memory" ); dp++;
232
233 #define DM_SCALED_FINISH asm("emms\n");
234 #else
235 #define DM_SCALED_SRC_TYPE DMRGBA32
236 #define DM_SCALED_DST_TYPE DMRGBA32
237 #define DM_SCALED_INNER \
238 const DMRGBA32 q = sp[FP_GETH(xv)]; \
239 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \
240 dp->r = qr < 256 ? qr : 255; \
241 dp->g = qg < 256 ? qg : 255; \
242 dp->b = qb < 256 ? qb : 255; \
243 dp->a = q.a; \
244 dp++;
245 #endif
246
247 #include "dmscaledblit.h"
248
249
250 // =======================================================================
251 // =======================================================================