Mercurial > hg > dmlib
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 // ======================================================================= |