Mercurial > hg > dmlib
annotate dmblitfunc.h @ 81:ba1987562a73
Fix 8to8 saturated scaled blit function.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Tue, 02 Oct 2012 09:44:18 +0300 |
parents | 49cc9a173427 |
children | c257d73cf790 |
rev | line source |
---|---|
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 #define DM_SCALED_INNER *dp++ = sp[FP_GETH(xv)]; | |
48 | |
49 #include "dmscaledblit.h" | |
50 | |
51 | |
52 // ======================================================================= | |
53 // DMD_TRANSPARENT | |
54 // ======================================================================= | |
55 | |
56 #define DM_SCALED_NAME dmScaledBlitSurface8to8Transparent | |
57 #define DM_SCALED_SRC_BYTES 1 | |
58 #define DM_SCALED_DST_BYTES 1 | |
59 #define DM_SCALED_SRC_TYPE Uint8 | |
60 #define DM_SCALED_DST_TYPE Uint8 | |
61 | |
62 #define DM_SCALED_INNER \ | |
63 *dp = sp[FP_GETH(xv)] ? sp[FP_GETH(xv)] : *dp; dp++; | |
64 | |
65 #include "dmscaledblit.h" | |
66 | |
67 // ----------------------------------------------------------------------- | |
68 | |
69 #define DM_SCALED_NAME dmScaledBlitSurface8to32Transparent | |
70 #define DM_SCALED_SRC_BYTES 1 | |
71 #define DM_SCALED_DST_BYTES 4 | |
72 #define DM_SCALED_SRC_TYPE Uint8 | |
73 #define DM_SCALED_DST_TYPE DMRGBA32 | |
74 #define DM_SCALED_VARS const DMRGBA32 *pal; | |
75 #define DM_SCALED_INIT \ | |
76 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ | |
77 pal = (DMRGBA32 *) src->format->palette->colors; | |
78 | |
79 #define DM_SCALED_INNER \ | |
80 const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \ | |
81 dp->r += ((q.r - dp->r) * q.a) >> 8; \ | |
82 dp->g += ((q.g - dp->g) * q.a) >> 8; \ | |
83 dp->b += ((q.b - dp->b) * q.a) >> 8; \ | |
84 dp->a = q.a; \ | |
85 dp++; | |
86 | |
87 #include "dmscaledblit.h" | |
88 | |
89 | |
90 // ----------------------------------------------------------------------- | |
91 | |
92 #define DM_SCALED_NAME dmScaledBlitSurface32to32Transparent | |
93 #define DM_SCALED_SRC_BYTES 4 | |
94 #define DM_SCALED_DST_BYTES 4 | |
95 | |
96 #ifdef DM_USE_SIMD | |
21 | 97 #define DM_SCALED_VARS \ |
98 const Uint32 qpdmask = 0xff000000; \ | |
12
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
99 const Uint64 qpdrm = 0xff00ff00ff00ffULL; |
0 | 100 |
101 #define DM_SCALED_SRC_TYPE Uint32 | |
102 #define DM_SCALED_DST_TYPE Uint32 | |
103 #define DM_SCALED_INNER \ | |
104 asm( \ | |
105 "movd %2, %%mm1\n" \ | |
12
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
106 \ |
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
107 "movd %3, %%mm2\n" \ |
13
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
108 "movq %%mm1, %%mm5\n" \ |
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
109 "pand %%mm2, %%mm5\n" \ |
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
110 "psrlw $8, %%mm5\n" \ |
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
111 "punpcklwd %%mm5, %%mm5\n" \ |
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
112 "punpckhwd %%mm5, %%mm5\n" \ |
0 | 113 \ |
13
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
114 "pxor %%mm2, %%mm2\n" \ |
0 | 115 "movd %1, %%mm3\n" \ |
116 "punpcklbw %%mm2, %%mm1\n" \ | |
13
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
117 "punpcklbw %%mm2, %%mm3\n" \ |
12
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
118 \ |
0 | 119 "psubw %%mm3, %%mm1\n" \ |
12
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
120 "pmullw %%mm5, %%mm1\n" \ |
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
121 "psraw $8, %%mm1\n" \ |
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
122 "paddw %%mm3, %%mm1\n" \ |
13
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
123 "pand %4, %%mm1\n" \ |
0 | 124 "packuswb %%mm2, %%mm1\n" \ |
125 "movd %%mm1, %0\n" \ | |
126 : "=m" (*dp) \ | |
12
35b0c83af3ca
MMX-version of scaled 32-bit RGBA alpha blending blit works now.
Matti Hamalainen <ccr@tnsp.org>
parents:
10
diff
changeset
|
127 : "m" (*dp), "m" (sp[FP_GETH(xv)]), "m" (qpdmask), "m" (qpdrm) \ |
17
a60fe802636a
Add register clobbers to SIMD inline asm.
Matti Hamalainen <ccr@tnsp.org>
parents:
14
diff
changeset
|
128 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; |
0 | 129 |
130 #define DM_SCALED_FINISH asm("emms\n"); | |
13
07bace8425d9
Optimize the scaled RGBA alpha blit MMX version further.
Matti Hamalainen <ccr@tnsp.org>
parents:
12
diff
changeset
|
131 |
0 | 132 #else |
21 | 133 |
0 | 134 #define DM_SCALED_SRC_TYPE DMRGBA32 |
135 #define DM_SCALED_DST_TYPE DMRGBA32 | |
136 #define DM_SCALED_INNER \ | |
137 const DMRGBA32 q = sp[FP_GETH(xv)]; \ | |
138 dp->r += ((q.r - dp->r) * q.a) >> 8; \ | |
139 dp->g += ((q.g - dp->g) * q.a) >> 8; \ | |
140 dp->b += ((q.b - dp->b) * q.a) >> 8; \ | |
141 dp->a = q.a; \ | |
142 dp++; | |
143 #endif | |
144 | |
145 #include "dmscaledblit.h" | |
146 | |
147 // ----------------------------------------------------------------------- | |
148 | |
149 #define DM_SCALED_NAME dmScaledBlitSurface32to32TransparentX | |
150 #define DM_SCALED_SRC_BYTES 4 | |
151 #define DM_SCALED_DST_BYTES 4 | |
152 #define DM_SCALED_SRC_TYPE DMRGBA32 | |
153 #define DM_SCALED_DST_TYPE DMRGBA32 | |
154 #define DM_SCALED_INIT | |
155 | |
156 #define DM_SCALED_INNER \ | |
157 const DMRGBA32 q = sp[FP_GETH(xv)]; \ | |
14
a40c266a71a2
Bitshift less in dmScaledBlitSurface32to32TransparentX()
Matti Hamalainen <ccr@tnsp.org>
parents:
13
diff
changeset
|
158 dp->r = (q.r * q.a + dp->r * dp->a) >> 8; \ |
a40c266a71a2
Bitshift less in dmScaledBlitSurface32to32TransparentX()
Matti Hamalainen <ccr@tnsp.org>
parents:
13
diff
changeset
|
159 dp->g = (q.g * q.a + dp->g * dp->a) >> 8; \ |
a40c266a71a2
Bitshift less in dmScaledBlitSurface32to32TransparentX()
Matti Hamalainen <ccr@tnsp.org>
parents:
13
diff
changeset
|
160 dp->b = (q.b * q.a + dp->b * dp->a) >> 8; \ |
0 | 161 dp->a = q.a ? q.a : dp->a; \ |
162 dp++; | |
163 | |
164 #include "dmscaledblit.h" | |
165 | |
166 | |
18
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
167 // ----------------------------------------------------------------------- |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
168 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
169 #define DM_SCALED_NAME dmScaledBlitSurface32to32TransparentGA |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
170 #define DM_SCALED_SRC_BYTES 4 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
171 #define DM_SCALED_DST_BYTES 4 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
172 #define DM_SCALED_ARGS , Uint32 alpha |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
173 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
174 #ifdef DM_USE_SIMD |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
175 #define DM_SCALED_VARS \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
176 const Uint64 qpdrm = 0xff00ff00ff00ffULL; |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
177 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
178 #define DM_SCALED_SRC_TYPE Uint32 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
179 #define DM_SCALED_DST_TYPE Uint32 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
180 #define DM_SCALED_INNER_INIT \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
181 asm( \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
182 "movd %0, %%mm4\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
183 "punpcklwd %%mm4, %%mm4\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
184 "punpckldq %%mm4, %%mm4\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
185 : \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
186 : "m" (alpha) \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
187 : "%mm4" ); |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
188 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
189 #define DM_SCALED_INNER \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
190 asm( \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
191 "movd %2, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
192 "pxor %%mm2, %%mm2\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
193 "movd %1, %%mm3\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
194 "punpcklbw %%mm2, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
195 "punpcklbw %%mm2, %%mm3\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
196 \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
197 "psubw %%mm3, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
198 "pmullw %%mm4, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
199 "psraw $8, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
200 "paddw %%mm3, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
201 "pand %3, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
202 "packuswb %%mm2, %%mm1\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
203 "movd %%mm1, %0\n" \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
204 : "=m" (*dp) \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
205 : "m" (*dp), "m" (sp[FP_GETH(xv)]), "m" (qpdrm) \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
206 : "memory", "%mm1", "%mm2", "%mm3", "%mm4" ); dp++; |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
207 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
208 #define DM_SCALED_FINISH asm("emms\n"); |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
209 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
210 #else |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
211 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
212 #define DM_SCALED_SRC_TYPE DMRGBA32 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
213 #define DM_SCALED_DST_TYPE DMRGBA32 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
214 #define DM_SCALED_INNER \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
215 const DMRGBA32 q = sp[FP_GETH(xv)]; \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
216 dp->r += ((q.r - dp->r) * alpha) >> 8; \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
217 dp->g += ((q.g - dp->g) * alpha) >> 8; \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
218 dp->b += ((q.b - dp->b) * alpha) >> 8; \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
219 dp->a = alpha; \ |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
220 dp++; |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
221 #endif |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
222 |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
223 #include "dmscaledblit.h" |
022eee2e7de6
Add dmScaledBlitSurface32to32TransparentGA().
Matti Hamalainen <ccr@tnsp.org>
parents:
17
diff
changeset
|
224 |
0 | 225 // ======================================================================= |
226 // DMD_SATURATE | |
227 // ======================================================================= | |
228 | |
229 #define DM_SCALED_NAME dmScaledBlitSurface8to8Saturate | |
230 #define DM_SCALED_SRC_BYTES 1 | |
231 #define DM_SCALED_DST_BYTES 1 | |
232 #define DM_SCALED_SRC_TYPE Uint8 | |
233 #define DM_SCALED_DST_TYPE Uint8 | |
81
ba1987562a73
Fix 8to8 saturated scaled blit function.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
234 #define DM_SCALED_INNER \ |
ba1987562a73
Fix 8to8 saturated scaled blit function.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
235 const Uint8 q = sp[FP_GETH(xv)] + *dp; \ |
ba1987562a73
Fix 8to8 saturated scaled blit function.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
236 *(dp++) = q < 256 ? q : 255; |
ba1987562a73
Fix 8to8 saturated scaled blit function.
Matti Hamalainen <ccr@tnsp.org>
parents:
21
diff
changeset
|
237 |
0 | 238 #include "dmscaledblit.h" |
239 | |
240 // ----------------------------------------------------------------------- | |
241 | |
242 #define DM_SCALED_NAME dmScaledBlitSurface8to32Saturate | |
243 #define DM_SCALED_SRC_BYTES 1 | |
244 #define DM_SCALED_DST_BYTES 4 | |
245 #define DM_SCALED_SRC_TYPE Uint8 | |
246 #define DM_SCALED_DST_TYPE DMRGBA32 | |
247 #define DM_SCALED_VARS const DMRGBA32 *pal; | |
248 #define DM_SCALED_INIT \ | |
249 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ | |
250 pal = (DMRGBA32 *) src->format->palette->colors; | |
251 | |
252 #ifdef DM_USE_SIMD | |
253 #define DM_SCALED_INNER \ | |
254 asm("movd %2, %%mm1\n" \ | |
255 "movd %1, %%mm2\n" \ | |
256 "paddusb %%mm2, %%mm1\n" \ | |
257 "movd %%mm1, %0\n" \ | |
258 : "=m" (*dp) \ | |
259 : "m" (*dp), "m" (pal[sp[FP_GETH(xv)]]) \ | |
17
a60fe802636a
Add register clobbers to SIMD inline asm.
Matti Hamalainen <ccr@tnsp.org>
parents:
14
diff
changeset
|
260 : "memory", "%mm1", "%mm2" ); dp++; |
0 | 261 |
262 #define DM_SCALED_FINISH asm("emms\n"); | |
263 #else | |
264 #define DM_SCALED_INNER \ | |
265 const DMRGBA32 q = pal[sp[FP_GETH(xv)]]; \ | |
266 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ | |
267 dp->r = qr < 256 ? qr : 255; \ | |
268 dp->g = qg < 256 ? qg : 255; \ | |
269 dp->b = qb < 256 ? qb : 255; \ | |
270 dp->a = q.a; \ | |
271 dp++; | |
272 #endif | |
273 | |
274 #include "dmscaledblit.h" | |
275 | |
276 // ----------------------------------------------------------------------- | |
277 | |
278 #define DM_SCALED_NAME dmScaledBlitSurface32to32Saturate | |
279 #define DM_SCALED_SRC_BYTES 4 | |
280 #define DM_SCALED_DST_BYTES 4 | |
281 #define DM_SCALED_INIT | |
282 | |
283 #ifdef DM_USE_SIMD | |
284 #define DM_SCALED_SRC_TYPE Uint32 | |
285 #define DM_SCALED_DST_TYPE Uint32 | |
286 #define DM_SCALED_INNER \ | |
287 asm("movd %2, %%mm1\n" \ | |
288 "movd %1, %%mm2\n" \ | |
289 "paddusb %%mm2, %%mm1\n" \ | |
290 "movd %%mm1, %0\n" \ | |
291 : "=m" (*dp) \ | |
292 : "m" (*dp), "m" (sp[FP_GETH(xv)]) \ | |
17
a60fe802636a
Add register clobbers to SIMD inline asm.
Matti Hamalainen <ccr@tnsp.org>
parents:
14
diff
changeset
|
293 : "memory", "%mm1", "%mm2" ); dp++; |
0 | 294 |
295 #define DM_SCALED_FINISH asm("emms\n"); | |
296 #else | |
297 #define DM_SCALED_SRC_TYPE DMRGBA32 | |
298 #define DM_SCALED_DST_TYPE DMRGBA32 | |
299 #define DM_SCALED_INNER \ | |
300 const DMRGBA32 q = sp[FP_GETH(xv)]; \ | |
301 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ | |
302 dp->r = qr < 256 ? qr : 255; \ | |
303 dp->g = qg < 256 ? qg : 255; \ | |
304 dp->b = qb < 256 ? qb : 255; \ | |
305 dp->a = q.a; \ | |
306 dp++; | |
307 #endif | |
308 | |
309 #include "dmscaledblit.h" | |
310 | |
311 | |
312 // ======================================================================= | |
313 // ======================================================================= |