Mercurial > sdl-ios-xcode
annotate src/video/SDL_stretch.c @ 4223:63fd67e17705 SDL-1.2
Fixed bug #727
Lorenzo Desole 2009-04-19 07:36:10 PDT
I am one of the developers of a multimedia application (My Media System MMS),
which uses SDL.
MMS is normally running in fullscreen mode but it switches it off before
launching external applications (mplayer, xine, etc.).
The problem with fullscreen is that when the latter is switched off either via
SDL_WM_ToggleFullScreen() or SDL_SetVideoMode(), SDL compares the current
screen sizes with the ones saved when the video system was initted, and if they
don't match, it calls XF86VidModeSwitchToMode() to switch to the old modeline.
This makes it impossible for external programs and for MMS itself to use RandR
to change the screen size, because next time fullscreen mode is turned off, it
bombs out with the following error:
X Error of failed request: BadValue (integer parameter out of range for
operation)
Major opcode of failed request: 136 (XFree86-VidModeExtension)
Minor opcode of failed request: 10 (XF86VidModeSwitchToMode)
[...]
Obviously this happens only if the new screen resolution is smaller than the
original one and XF86VidModeSwitchToMode() can't succeed.
I couldn't find any way to inform SDL that the screen resolution it uses as
reference is no longer valid.
This can be fixed by adding "save_mode(this)" to
./src/video/x11/SDL_x11modes.c, API X11_EnterFullScreen(_THIS), like this:
int X11_EnterFullScreen(_THIS)
{
int okay;
+ save_mode(this);
I can't rule out possible side effects, but I don't see any.
While I admit this is a minor issue for the general users, it is a major
showstopper for our program where the ability to change screen resolution and
refresh rate according to the movie being played, is very important.
Thanks in advance.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 21 Sep 2009 11:14:36 +0000 |
parents | a1b03ba2fcd0 |
children | 9b464226e541 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
6 modify it under the terms of the GNU Lesser General Public |
0 | 7 License as published by the Free Software Foundation; either |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
13 Lesser General Public License for more details. |
0 | 14 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
15 You should have received a copy of the GNU Lesser General Public |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
16 License along with this library; if not, write to the Free Software |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
1234
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
22 #include "SDL_config.h" |
0 | 23 |
24 /* This a stretch blit implementation based on ideas given to me by | |
25 Tomasz Cejner - thanks! :) | |
26 | |
27 April 27, 2000 - Sam Lantinga | |
28 */ | |
29 | |
30 #include "SDL_video.h" | |
31 #include "SDL_blit.h" | |
32 | |
33 /* This isn't ready for general consumption yet - it should be folded | |
34 into the general blitting mechanism. | |
35 */ | |
36 | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
37 #if ((defined(_MFC_VER) && defined(_M_IX86)/* && !defined(_WIN32_WCE) still needed? */) || \ |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
38 defined(__WATCOMC__) || \ |
1402
d910939febfa
Use consistent identifiers for the various platforms we support.
Sam Lantinga <slouken@libsdl.org>
parents:
1361
diff
changeset
|
39 (defined(__GNUC__) && defined(__i386__))) && SDL_ASSEMBLY_ROUTINES |
0 | 40 #define USE_ASM_STRETCH |
41 #endif | |
42 | |
43 #ifdef USE_ASM_STRETCH | |
44 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
45 #ifdef HAVE_MPROTECT |
4108 | 46 #include <sys/types.h> |
47 #include <sys/mman.h> | |
48 #endif | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
49 #ifdef __GNUC__ |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
50 #define PAGE_ALIGNED __attribute__((__aligned__(4096))) |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
51 #else |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
52 #define PAGE_ALIGNED |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
53 #endif |
4108 | 54 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
55 #if defined(_M_IX86) || defined(i386) |
0 | 56 #define PREFIX16 0x66 |
57 #define STORE_BYTE 0xAA | |
58 #define STORE_WORD 0xAB | |
59 #define LOAD_BYTE 0xAC | |
60 #define LOAD_WORD 0xAD | |
61 #define RETURN 0xC3 | |
62 #else | |
63 #error Need assembly opcodes for this architecture | |
64 #endif | |
65 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
66 static unsigned char copy_row[4096] PAGE_ALIGNED; |
0 | 67 |
68 static int generate_rowbytes(int src_w, int dst_w, int bpp) | |
69 { | |
70 static struct { | |
71 int bpp; | |
72 int src_w; | |
73 int dst_w; | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
74 int status; |
0 | 75 } last; |
76 | |
77 int i; | |
78 int pos, inc; | |
79 unsigned char *eip; | |
80 unsigned char load, store; | |
81 | |
82 /* See if we need to regenerate the copy buffer */ | |
83 if ( (src_w == last.src_w) && | |
1164
10b3fb28c86b
Date: Mon, 31 Oct 2005 14:23:34 +0100
Ryan C. Gordon <icculus@icculus.org>
parents:
894
diff
changeset
|
84 (dst_w == last.dst_w) && (bpp == last.bpp) ) { |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
85 return(last.status); |
0 | 86 } |
87 last.bpp = bpp; | |
88 last.src_w = src_w; | |
89 last.dst_w = dst_w; | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
90 last.status = -1; |
0 | 91 |
92 switch (bpp) { | |
93 case 1: | |
94 load = LOAD_BYTE; | |
95 store = STORE_BYTE; | |
96 break; | |
97 case 2: | |
98 case 4: | |
99 load = LOAD_WORD; | |
100 store = STORE_WORD; | |
101 break; | |
102 default: | |
103 SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp); | |
104 return(-1); | |
105 } | |
106 pos = 0x10000; | |
107 inc = (src_w << 16) / dst_w; | |
108 eip = copy_row; | |
109 for ( i=0; i<dst_w; ++i ) { | |
110 while ( pos >= 0x10000L ) { | |
111 if ( bpp == 2 ) { | |
112 *eip++ = PREFIX16; | |
113 } | |
114 *eip++ = load; | |
115 pos -= 0x10000L; | |
116 } | |
117 if ( bpp == 2 ) { | |
118 *eip++ = PREFIX16; | |
119 } | |
120 *eip++ = store; | |
121 pos += inc; | |
122 } | |
123 *eip++ = RETURN; | |
124 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
125 /* Verify that we didn't overflow (too late!!!) */ |
0 | 126 if ( eip > (copy_row+sizeof(copy_row)) ) { |
127 SDL_SetError("Copy buffer overflow"); | |
128 return(-1); | |
129 } | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
130 #ifdef HAVE_MPROTECT |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
131 /* Make the code executable */ |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
132 if ( mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_WRITE|PROT_EXEC) < 0 ) { |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
133 SDL_SetError("Couldn't make copy buffer executable"); |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
134 return(-1); |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
135 } |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
136 #endif |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
137 last.status = 0; |
0 | 138 return(0); |
139 } | |
140 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
141 #endif /* USE_ASM_STRETCH */ |
0 | 142 |
143 #define DEFINE_COPY_ROW(name, type) \ | |
144 void name(type *src, int src_w, type *dst, int dst_w) \ | |
145 { \ | |
146 int i; \ | |
147 int pos, inc; \ | |
148 type pixel = 0; \ | |
149 \ | |
150 pos = 0x10000; \ | |
151 inc = (src_w << 16) / dst_w; \ | |
152 for ( i=dst_w; i>0; --i ) { \ | |
153 while ( pos >= 0x10000L ) { \ | |
154 pixel = *src++; \ | |
155 pos -= 0x10000L; \ | |
156 } \ | |
157 *dst++ = pixel; \ | |
158 pos += inc; \ | |
159 } \ | |
160 } | |
161 DEFINE_COPY_ROW(copy_row1, Uint8) | |
162 DEFINE_COPY_ROW(copy_row2, Uint16) | |
163 DEFINE_COPY_ROW(copy_row4, Uint32) | |
164 | |
165 /* The ASM code doesn't handle 24-bpp stretch blits */ | |
166 void copy_row3(Uint8 *src, int src_w, Uint8 *dst, int dst_w) | |
167 { | |
168 int i; | |
169 int pos, inc; | |
1849
b5a4ac87b98c
Fixed uninitialized variable warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
170 Uint8 pixel[3] = { 0, 0, 0 }; |
0 | 171 |
172 pos = 0x10000; | |
173 inc = (src_w << 16) / dst_w; | |
174 for ( i=dst_w; i>0; --i ) { | |
175 while ( pos >= 0x10000L ) { | |
176 pixel[0] = *src++; | |
177 pixel[1] = *src++; | |
178 pixel[2] = *src++; | |
179 pos -= 0x10000L; | |
180 } | |
181 *dst++ = pixel[0]; | |
182 *dst++ = pixel[1]; | |
183 *dst++ = pixel[2]; | |
184 pos += inc; | |
185 } | |
186 } | |
187 | |
188 /* Perform a stretch blit between two surfaces of the same format. | |
189 NOTE: This function is not safe to call from multiple threads! | |
190 */ | |
191 int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, | |
192 SDL_Surface *dst, SDL_Rect *dstrect) | |
193 { | |
894
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
194 int src_locked; |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
195 int dst_locked; |
0 | 196 int pos, inc; |
197 int dst_width; | |
198 int dst_maxrow; | |
199 int src_row, dst_row; | |
200 Uint8 *srcp = NULL; | |
201 Uint8 *dstp; | |
202 SDL_Rect full_src; | |
203 SDL_Rect full_dst; | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
204 #ifdef USE_ASM_STRETCH |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
205 SDL_bool use_asm = SDL_TRUE; |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
206 #ifdef __GNUC__ |
0 | 207 int u1, u2; |
208 #endif | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
209 #endif /* USE_ASM_STRETCH */ |
0 | 210 const int bpp = dst->format->BytesPerPixel; |
211 | |
212 if ( src->format->BitsPerPixel != dst->format->BitsPerPixel ) { | |
213 SDL_SetError("Only works with same format surfaces"); | |
214 return(-1); | |
215 } | |
216 | |
217 /* Verify the blit rectangles */ | |
218 if ( srcrect ) { | |
219 if ( (srcrect->x < 0) || (srcrect->y < 0) || | |
220 ((srcrect->x+srcrect->w) > src->w) || | |
221 ((srcrect->y+srcrect->h) > src->h) ) { | |
222 SDL_SetError("Invalid source blit rectangle"); | |
223 return(-1); | |
224 } | |
225 } else { | |
226 full_src.x = 0; | |
227 full_src.y = 0; | |
228 full_src.w = src->w; | |
229 full_src.h = src->h; | |
230 srcrect = &full_src; | |
231 } | |
232 if ( dstrect ) { | |
233 if ( (dstrect->x < 0) || (dstrect->y < 0) || | |
234 ((dstrect->x+dstrect->w) > dst->w) || | |
235 ((dstrect->y+dstrect->h) > dst->h) ) { | |
236 SDL_SetError("Invalid destination blit rectangle"); | |
237 return(-1); | |
238 } | |
239 } else { | |
240 full_dst.x = 0; | |
241 full_dst.y = 0; | |
242 full_dst.w = dst->w; | |
243 full_dst.h = dst->h; | |
244 dstrect = &full_dst; | |
245 } | |
246 | |
894
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
247 /* Lock the destination if it's in hardware */ |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
248 dst_locked = 0; |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
249 if ( SDL_MUSTLOCK(dst) ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
250 if ( SDL_LockSurface(dst) < 0 ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
251 SDL_SetError("Unable to lock destination surface"); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
252 return(-1); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
253 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
254 dst_locked = 1; |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
255 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
256 /* Lock the source if it's in hardware */ |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
257 src_locked = 0; |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
258 if ( SDL_MUSTLOCK(src) ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
259 if ( SDL_LockSurface(src) < 0 ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
260 if ( dst_locked ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
261 SDL_UnlockSurface(dst); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
262 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
263 SDL_SetError("Unable to lock source surface"); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
264 return(-1); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
265 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
266 src_locked = 1; |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
267 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
268 |
0 | 269 /* Set up the data... */ |
270 pos = 0x10000; | |
271 inc = (srcrect->h << 16) / dstrect->h; | |
272 src_row = srcrect->y; | |
273 dst_row = dstrect->y; | |
274 dst_width = dstrect->w*bpp; | |
275 | |
276 #ifdef USE_ASM_STRETCH | |
277 /* Write the opcodes for this stretch */ | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
278 if ( (bpp == 3) || |
0 | 279 (generate_rowbytes(srcrect->w, dstrect->w, bpp) < 0) ) { |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
280 use_asm = SDL_FALSE; |
0 | 281 } |
282 #endif | |
283 | |
284 /* Perform the stretch blit */ | |
285 for ( dst_maxrow = dst_row+dstrect->h; dst_row<dst_maxrow; ++dst_row ) { | |
286 dstp = (Uint8 *)dst->pixels + (dst_row*dst->pitch) | |
287 + (dstrect->x*bpp); | |
288 while ( pos >= 0x10000L ) { | |
289 srcp = (Uint8 *)src->pixels + (src_row*src->pitch) | |
290 + (srcrect->x*bpp); | |
291 ++src_row; | |
292 pos -= 0x10000L; | |
293 } | |
294 #ifdef USE_ASM_STRETCH | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
295 if (use_asm) { |
0 | 296 #ifdef __GNUC__ |
627
8b9ac38381d0
Fixed compile problem in SDL_stretch.c with gcc 3.3
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
297 __asm__ __volatile__ ( |
1228
f4a3a4129d04
From Mike Frysinger and/or Gentoo:
Ryan C. Gordon <icculus@icculus.org>
parents:
1164
diff
changeset
|
298 "call *%4" |
0 | 299 : "=&D" (u1), "=&S" (u2) |
1234
73676c1f56ee
For sanity's sake, removed the '&' when passing copy_row array to asm.
Ryan C. Gordon <icculus@icculus.org>
parents:
1233
diff
changeset
|
300 : "0" (dstp), "1" (srcp), "r" (copy_row) |
0 | 301 : "memory" ); |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
302 #elif defined(_MSC_VER) || defined(__WATCOMC__) |
1234
73676c1f56ee
For sanity's sake, removed the '&' when passing copy_row array to asm.
Ryan C. Gordon <icculus@icculus.org>
parents:
1233
diff
changeset
|
303 { void *code = copy_row; |
0 | 304 __asm { |
305 push edi | |
306 push esi | |
307 | |
308 mov edi, dstp | |
309 mov esi, srcp | |
310 call dword ptr code | |
311 | |
312 pop esi | |
313 pop edi | |
314 } | |
315 } | |
316 #else | |
317 #error Need inline assembly for this compiler | |
318 #endif | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
319 } else |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
320 #endif |
0 | 321 switch (bpp) { |
322 case 1: | |
323 copy_row1(srcp, srcrect->w, dstp, dstrect->w); | |
324 break; | |
325 case 2: | |
326 copy_row2((Uint16 *)srcp, srcrect->w, | |
327 (Uint16 *)dstp, dstrect->w); | |
328 break; | |
329 case 3: | |
330 copy_row3(srcp, srcrect->w, dstp, dstrect->w); | |
331 break; | |
332 case 4: | |
333 copy_row4((Uint32 *)srcp, srcrect->w, | |
334 (Uint32 *)dstp, dstrect->w); | |
335 break; | |
336 } | |
337 pos += inc; | |
338 } | |
894
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
339 |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
340 /* We need to unlock the surfaces if they're locked */ |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
341 if ( dst_locked ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
342 SDL_UnlockSurface(dst); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
343 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
344 if ( src_locked ) { |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
345 SDL_UnlockSurface(src); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
346 } |
0 | 347 return(0); |
348 } | |
349 |