0
|
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 // =======================================================================
|