Mercurial > hg > dmlib
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 } |