Mercurial > sdl-ios-xcode
annotate src/video/SDL_stretch.c @ 4393:9afe12fb4c41 SDL-1.2
Fixed bug #901
Tim Angus 2009-12-11 11:45:46 PST
Disable mouse event generation when state is not SDL_APPMOUSEFOCUS
If a Windows SDL application is minimised by using alt-tab, SDL_APPMOUSEFOCUS
is lost as part of the minimisation. Unfortunately, the directx driver doesn't
pay any attention to this state when generating mouse button events, so
clicking on the Desktop can cause mouse clicks in the SDL application, while
it's still minimised. The attached patch fixes this. It looks much more
complicated than it actually is due to indentation; here it is ignoring
whitespace:
tma@abraxas:~/sources/SDL-1.2-svn$ svn diff -x -b
Index: src/video/windx5/SDL_dx5events.c
===================================================================
--- src/video/windx5/SDL_dx5events.c (revision 5376)
+++ src/video/windx5/SDL_dx5events.c (working copy)
@@ -374,10 +374,9 @@
if ( !(SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) {
mouse_lost = 1;
ClipCursor(NULL);
- }
-
+ } else {
/* If the mouse was lost, regain some sense of mouse state */
- if ( mouse_lost && (SDL_GetAppState() & SDL_APPMOUSEFOCUS) ) {
+ if ( mouse_lost ) {
POINT mouse_pos;
Uint8 old_state;
Uint8 new_state;
@@ -548,6 +547,7 @@
if ( xrel || yrel ) {
post_mouse_motion(1, xrel, yrel);
}
+ }
}
/* The main Win32 event handler */
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 14 Dec 2009 22:41:31 +0000 |
parents | ab2dfac9d5c1 |
children | abb56f7699ea |
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 |
4356
ab2dfac9d5c1
There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct value after the first scanline. Ugh.
Sam Lantinga <slouken@libsdl.org>
parents:
4355
diff
changeset
|
40 /* There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct |
ab2dfac9d5c1
There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct value after the first scanline. Ugh.
Sam Lantinga <slouken@libsdl.org>
parents:
4355
diff
changeset
|
41 * value after the first scanline. FIXME? */ |
ab2dfac9d5c1
There's a bug with gcc 4.4.1 and -O2 where srcp doesn't get the correct value after the first scanline. Ugh.
Sam Lantinga <slouken@libsdl.org>
parents:
4355
diff
changeset
|
42 /*#define USE_ASM_STRETCH*/ |
0 | 43 #endif |
44 | |
45 #ifdef USE_ASM_STRETCH | |
46 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
47 #ifdef HAVE_MPROTECT |
4108 | 48 #include <sys/types.h> |
49 #include <sys/mman.h> | |
50 #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
|
51 #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
|
52 #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
|
53 #else |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
54 #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
|
55 #endif |
4108 | 56 |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
57 #if defined(_M_IX86) || defined(i386) |
0 | 58 #define PREFIX16 0x66 |
59 #define STORE_BYTE 0xAA | |
60 #define STORE_WORD 0xAB | |
61 #define LOAD_BYTE 0xAC | |
62 #define LOAD_WORD 0xAD | |
63 #define RETURN 0xC3 | |
64 #else | |
65 #error Need assembly opcodes for this architecture | |
66 #endif | |
67 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
68 static unsigned char copy_row[4096] PAGE_ALIGNED; |
0 | 69 |
70 static int generate_rowbytes(int src_w, int dst_w, int bpp) | |
71 { | |
72 static struct { | |
73 int bpp; | |
74 int src_w; | |
75 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
|
76 int status; |
0 | 77 } last; |
78 | |
79 int i; | |
80 int pos, inc; | |
81 unsigned char *eip; | |
82 unsigned char load, store; | |
83 | |
84 /* See if we need to regenerate the copy buffer */ | |
85 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
|
86 (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
|
87 return(last.status); |
0 | 88 } |
89 last.bpp = bpp; | |
90 last.src_w = src_w; | |
91 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
|
92 last.status = -1; |
0 | 93 |
94 switch (bpp) { | |
95 case 1: | |
96 load = LOAD_BYTE; | |
97 store = STORE_BYTE; | |
98 break; | |
99 case 2: | |
100 case 4: | |
101 load = LOAD_WORD; | |
102 store = STORE_WORD; | |
103 break; | |
104 default: | |
105 SDL_SetError("ASM stretch of %d bytes isn't supported\n", bpp); | |
106 return(-1); | |
107 } | |
4355 | 108 #ifdef HAVE_MPROTECT |
109 /* Make the code writeable */ | |
110 if ( mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_WRITE) < 0 ) { | |
111 SDL_SetError("Couldn't make copy buffer writeable"); | |
112 return(-1); | |
113 } | |
114 #endif | |
0 | 115 pos = 0x10000; |
116 inc = (src_w << 16) / dst_w; | |
117 eip = copy_row; | |
118 for ( i=0; i<dst_w; ++i ) { | |
119 while ( pos >= 0x10000L ) { | |
120 if ( bpp == 2 ) { | |
121 *eip++ = PREFIX16; | |
122 } | |
123 *eip++ = load; | |
124 pos -= 0x10000L; | |
125 } | |
126 if ( bpp == 2 ) { | |
127 *eip++ = PREFIX16; | |
128 } | |
129 *eip++ = store; | |
130 pos += inc; | |
131 } | |
132 *eip++ = RETURN; | |
133 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
134 /* Verify that we didn't overflow (too late!!!) */ |
0 | 135 if ( eip > (copy_row+sizeof(copy_row)) ) { |
136 SDL_SetError("Copy buffer overflow"); | |
137 return(-1); | |
138 } | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
139 #ifdef HAVE_MPROTECT |
4355 | 140 /* Make the code executable but not writeable */ |
141 if ( mprotect(copy_row, sizeof(copy_row), PROT_READ|PROT_EXEC) < 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
|
142 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
|
143 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
|
144 } |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
145 #endif |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
146 last.status = 0; |
0 | 147 return(0); |
148 } | |
149 | |
4109
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
150 #endif /* USE_ASM_STRETCH */ |
0 | 151 |
152 #define DEFINE_COPY_ROW(name, type) \ | |
153 void name(type *src, int src_w, type *dst, int dst_w) \ | |
154 { \ | |
155 int i; \ | |
156 int pos, inc; \ | |
157 type pixel = 0; \ | |
158 \ | |
159 pos = 0x10000; \ | |
160 inc = (src_w << 16) / dst_w; \ | |
161 for ( i=dst_w; i>0; --i ) { \ | |
162 while ( pos >= 0x10000L ) { \ | |
163 pixel = *src++; \ | |
164 pos -= 0x10000L; \ | |
165 } \ | |
166 *dst++ = pixel; \ | |
167 pos += inc; \ | |
168 } \ | |
169 } | |
170 DEFINE_COPY_ROW(copy_row1, Uint8) | |
171 DEFINE_COPY_ROW(copy_row2, Uint16) | |
172 DEFINE_COPY_ROW(copy_row4, Uint32) | |
173 | |
174 /* The ASM code doesn't handle 24-bpp stretch blits */ | |
175 void copy_row3(Uint8 *src, int src_w, Uint8 *dst, int dst_w) | |
176 { | |
177 int i; | |
178 int pos, inc; | |
1849
b5a4ac87b98c
Fixed uninitialized variable warnings
Sam Lantinga <slouken@libsdl.org>
parents:
1442
diff
changeset
|
179 Uint8 pixel[3] = { 0, 0, 0 }; |
0 | 180 |
181 pos = 0x10000; | |
182 inc = (src_w << 16) / dst_w; | |
183 for ( i=dst_w; i>0; --i ) { | |
184 while ( pos >= 0x10000L ) { | |
185 pixel[0] = *src++; | |
186 pixel[1] = *src++; | |
187 pixel[2] = *src++; | |
188 pos -= 0x10000L; | |
189 } | |
190 *dst++ = pixel[0]; | |
191 *dst++ = pixel[1]; | |
192 *dst++ = pixel[2]; | |
193 pos += inc; | |
194 } | |
195 } | |
196 | |
197 /* Perform a stretch blit between two surfaces of the same format. | |
198 NOTE: This function is not safe to call from multiple threads! | |
199 */ | |
200 int SDL_SoftStretch(SDL_Surface *src, SDL_Rect *srcrect, | |
201 SDL_Surface *dst, SDL_Rect *dstrect) | |
202 { | |
894
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
203 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
|
204 int dst_locked; |
0 | 205 int pos, inc; |
206 int dst_width; | |
207 int dst_maxrow; | |
208 int src_row, dst_row; | |
209 Uint8 *srcp = NULL; | |
210 Uint8 *dstp; | |
211 SDL_Rect full_src; | |
212 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
|
213 #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
|
214 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
|
215 #ifdef __GNUC__ |
0 | 216 int u1, u2; |
217 #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
|
218 #endif /* USE_ASM_STRETCH */ |
0 | 219 const int bpp = dst->format->BytesPerPixel; |
220 | |
221 if ( src->format->BitsPerPixel != dst->format->BitsPerPixel ) { | |
222 SDL_SetError("Only works with same format surfaces"); | |
223 return(-1); | |
224 } | |
225 | |
226 /* Verify the blit rectangles */ | |
227 if ( srcrect ) { | |
228 if ( (srcrect->x < 0) || (srcrect->y < 0) || | |
229 ((srcrect->x+srcrect->w) > src->w) || | |
230 ((srcrect->y+srcrect->h) > src->h) ) { | |
231 SDL_SetError("Invalid source blit rectangle"); | |
232 return(-1); | |
233 } | |
234 } else { | |
235 full_src.x = 0; | |
236 full_src.y = 0; | |
237 full_src.w = src->w; | |
238 full_src.h = src->h; | |
239 srcrect = &full_src; | |
240 } | |
241 if ( dstrect ) { | |
242 if ( (dstrect->x < 0) || (dstrect->y < 0) || | |
243 ((dstrect->x+dstrect->w) > dst->w) || | |
244 ((dstrect->y+dstrect->h) > dst->h) ) { | |
245 SDL_SetError("Invalid destination blit rectangle"); | |
246 return(-1); | |
247 } | |
248 } else { | |
249 full_dst.x = 0; | |
250 full_dst.y = 0; | |
251 full_dst.w = dst->w; | |
252 full_dst.h = dst->h; | |
253 dstrect = &full_dst; | |
254 } | |
255 | |
894
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 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
|
257 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
|
258 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
|
259 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
|
260 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
|
261 return(-1); |
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 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
|
264 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
265 /* 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
|
266 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
|
267 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
|
268 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
|
269 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
|
270 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
|
271 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
272 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
|
273 return(-1); |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
274 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
275 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
|
276 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
277 |
0 | 278 /* Set up the data... */ |
279 pos = 0x10000; | |
280 inc = (srcrect->h << 16) / dstrect->h; | |
281 src_row = srcrect->y; | |
282 dst_row = dstrect->y; | |
283 dst_width = dstrect->w*bpp; | |
284 | |
285 #ifdef USE_ASM_STRETCH | |
286 /* 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
|
287 if ( (bpp == 3) || |
0 | 288 (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
|
289 use_asm = SDL_FALSE; |
0 | 290 } |
291 #endif | |
292 | |
293 /* Perform the stretch blit */ | |
294 for ( dst_maxrow = dst_row+dstrect->h; dst_row<dst_maxrow; ++dst_row ) { | |
295 dstp = (Uint8 *)dst->pixels + (dst_row*dst->pitch) | |
296 + (dstrect->x*bpp); | |
297 while ( pos >= 0x10000L ) { | |
298 srcp = (Uint8 *)src->pixels + (src_row*src->pitch) | |
299 + (srcrect->x*bpp); | |
300 ++src_row; | |
301 pos -= 0x10000L; | |
302 } | |
303 #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
|
304 if (use_asm) { |
0 | 305 #ifdef __GNUC__ |
627
8b9ac38381d0
Fixed compile problem in SDL_stretch.c with gcc 3.3
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
306 __asm__ __volatile__ ( |
1228
f4a3a4129d04
From Mike Frysinger and/or Gentoo:
Ryan C. Gordon <icculus@icculus.org>
parents:
1164
diff
changeset
|
307 "call *%4" |
0 | 308 : "=&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
|
309 : "0" (dstp), "1" (srcp), "r" (copy_row) |
0 | 310 : "memory" ); |
1442
e3242177fe4a
Updated OS/2 build, yay!
Sam Lantinga <slouken@libsdl.org>
parents:
1402
diff
changeset
|
311 #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
|
312 { void *code = copy_row; |
0 | 313 __asm { |
314 push edi | |
315 push esi | |
316 | |
317 mov edi, dstp | |
318 mov esi, srcp | |
319 call dword ptr code | |
320 | |
321 pop esi | |
322 pop edi | |
323 } | |
324 } | |
325 #else | |
326 #error Need inline assembly for this compiler | |
327 #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
|
328 } else |
cd2ab40f1219
Made the mprotect() fix for SDL_SoftStretch() more general for hardened linux, etc.
Sam Lantinga <slouken@libsdl.org>
parents:
4108
diff
changeset
|
329 #endif |
0 | 330 switch (bpp) { |
331 case 1: | |
332 copy_row1(srcp, srcrect->w, dstp, dstrect->w); | |
333 break; | |
334 case 2: | |
335 copy_row2((Uint16 *)srcp, srcrect->w, | |
336 (Uint16 *)dstp, dstrect->w); | |
337 break; | |
338 case 3: | |
339 copy_row3(srcp, srcrect->w, dstp, dstrect->w); | |
340 break; | |
341 case 4: | |
342 copy_row4((Uint32 *)srcp, srcrect->w, | |
343 (Uint32 *)dstp, dstrect->w); | |
344 break; | |
345 } | |
346 pos += inc; | |
347 } | |
894
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
348 |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
349 /* 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
|
350 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
|
351 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
|
352 } |
1d1a823904d8
Don't crash if the stretch routines are used on hardware surfaces
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
353 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
|
354 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
|
355 } |
0 | 356 return(0); |
357 } | |
358 |