comparison dmblit.c @ 95:0430f484641b

Add unscaled blitting functions.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 02 Oct 2012 18:51:16 +0300
parents 265ce3091d88
children e74ad60b1e85
comparison
equal deleted inserted replaced
94:4bbfc0274b29 95:0430f484641b
13 int v0, v1, voffs, vadd; 13 int v0, v1, voffs, vadd;
14 DMFixedPoint32 vdelta; 14 DMFixedPoint32 vdelta;
15 } DMQValue; 15 } DMQValue;
16 16
17 17
18 int dmClipCoord(DMQValue *pv, int v0, int v1, int v2, int clipMin, int clipMax) 18 int dmScaledClipCoord(DMQValue *pv, int v0, int v1, int v2, int clipMin, int clipMax)
19 { 19 {
20 DMFixedPoint32 a, b; 20 DMFixedPoint32 a, b;
21 21
22 // Basic bounds check 22 // Basic bounds check
23 if (v1 < 1 || v2 < 1 || v0 + v2 < clipMin || v0 >= clipMax) 23 if (v1 < 1 || v2 < 1 || v0 + v2 < clipMin || v0 >= clipMax)
67 67
68 return 0; 68 return 0;
69 } 69 }
70 70
71 71
72 int dmUnscaledClipCoord(DMQValue *pv, int v0, int v1, int clipMin, int clipMax)
73 {
74 // Basic bounds check
75 if (v1 < 1 || v0 + v1 < clipMin || v0 >= clipMax)
76 return -1;
77
78 // Perform clipping
79 if (v0 + v1 >= clipMax)
80 {
81 pv->vadd = v0;
82 pv->v1 = clipMax;
83 }
84 else
85 {
86 pv->vadd = clipMax - v1;
87 pv->v1 = v0 + v1;
88 }
89
90 if (v0 < clipMin)
91 {
92 pv->voffs = clipMin - v0;
93 pv->v0 = clipMin;
94 pv->vadd -= v0 + clipMin;
95 }
96 else
97 {
98 pv->voffs = 0;
99 pv->v0 = v0;
100 }
101
102 return 0;
103 }
104
105
72 #include "dmblitfunc.h" 106 #include "dmblitfunc.h"
73 107
74 108
75 static const DMScaledBlitFunc dmScaledBlitTable[DMD_NMODES][DMD_NBITDEPTHS][DMD_NBITDEPTHS] = 109 static const DMScaledBlitFunc dmScaledBlitTable[DMD_NMODES][DMD_NBITDEPTHS][DMD_NBITDEPTHS] =
76 { 110 {
107 }, 141 },
108 #endif 142 #endif
109 }; 143 };
110 144
111 static const int ndmScaledBlitTable = sizeof(dmScaledBlitTable) / sizeof(dmScaledBlitTable[0]); 145 static const int ndmScaledBlitTable = sizeof(dmScaledBlitTable) / sizeof(dmScaledBlitTable[0]);
146
112 147
113 DMScaledBlitFunc dmGetScaledBlitFunc(SDL_PixelFormat *src, SDL_PixelFormat *dst, int mode) 148 DMScaledBlitFunc dmGetScaledBlitFunc(SDL_PixelFormat *src, SDL_PixelFormat *dst, int mode)
114 { 149 {
115 int isrc, idst; 150 int isrc, idst;
116 if (src == NULL || dst == NULL || mode < 0 || mode >= ndmScaledBlitTable) 151 if (src == NULL || dst == NULL || mode < 0 || mode >= ndmScaledBlitTable)
132 if (bfunc == NULL) 167 if (bfunc == NULL)
133 return -15; 168 return -15;
134 169
135 return bfunc(src, x0, y0, dwidth, dheight, dst); 170 return bfunc(src, x0, y0, dwidth, dheight, dst);
136 } 171 }
172
173
174 static const DMUnscaledBlitFunc dmUnscaledBlitTable[DMD_NMODES][DMD_NBITDEPTHS][DMD_NBITDEPTHS] =
175 {
176 // DMD_NONE
177 {
178 { dmUnscaledBlitSurface8to8 , dmUnscaledBlitSurface8to32 },
179 { NULL , dmUnscaledBlitSurface32to32 },
180 },
181 // DMD_TRANSPARENT
182 {
183 { dmUnscaledBlitSurface8to8Transparent, dmUnscaledBlitSurface8to32Transparent },
184 { NULL , dmUnscaledBlitSurface32to32Transparent },
185 },
186 // DMD_SATURATE
187 {
188 { dmUnscaledBlitSurface8to8Saturate , dmUnscaledBlitSurface8to32Saturate },
189 { NULL , dmUnscaledBlitSurface32to32Saturate },
190 },
191 #if 0
192 // DMD_NONE | DMD_ANTIALIAS
193 {
194 { dmUnscaledBlitSurface8to8Antialias , dmUnscaledBlitSurface8to32Antialias },
195 { NULL , dmUnscaledBlitSurface32to32Antialias },
196 },
197 // DMD_TRANSPARENT | DMD_ANTIALIAS
198 {
199 { dmUnscaledBlitSurface8to8AATransp , dmUnscaledBlitSurface8to32AATransparent },
200 { NULL , dmUnscaledBlitSurface32to32AATransparent },
201 },
202 // DMD_SATURATE | DMD_ANTIALIAS
203 {
204 { dmUnscaledBlitSurface8to8AASaturate , dmUnscaledBlitSurface8to32AASaturate },
205 { NULL , dmUnscaledBlitSurface32to32AASaturate },
206 },
207 #endif
208 };
209
210 static const int ndmUnscaledBlitTable = sizeof(dmUnscaledBlitTable) / sizeof(dmUnscaledBlitTable[0]);
211
212
213
214 DMUnscaledBlitFunc dmGetUnscaledBlitFunc(SDL_PixelFormat *src, SDL_PixelFormat *dst, int mode)
215 {
216 int isrc, idst;
217 if (src == NULL || dst == NULL || mode < 0 || mode >= ndmUnscaledBlitTable)
218 return NULL;
219
220 isrc = dmBitsPerPixel2Index(src->BitsPerPixel);
221 idst = dmBitsPerPixel2Index(dst->BitsPerPixel);
222 if (isrc < 0 || idst < 0)
223 return NULL;
224
225 return dmUnscaledBlitTable[mode][isrc][idst];
226 }
227
228
229 int dmUnscaledBlitSurfaceAny(SDL_Surface *src, const int x0, const int y0, SDL_Surface *dst, int mode)
230 {
231 DMUnscaledBlitFunc bfunc = dmGetUnscaledBlitFunc(src->format, dst->format, mode);
232
233 if (bfunc == NULL)
234 return -15;
235
236 return bfunc(src, x0, y0, dst);
237 }