Mercurial > sdl-ios-xcode
annotate src/thread/win32/SDL_syssem.c @ 1012:f14e3059e138
Date: Mon, 13 Dec 2004 21:28:18 -0500
From: Jonathan Atkins
Subject: [SDL] SDL_SaveBMP width bugfix
this fixes the pitch versus width difference that can happen
(especially for 8bit and 24bit (with the exact RGBAmasks) surfaces)
when you use SDL_SaveBMP. The problem was the pitch was used
instead of the width, which in some cases is much wider than the
screen area you really want to save...making for ugly crud on the
saved image borders.
This code has been tested with & without pitch overhangs...and
with the right masks for 24 bit surfaces.
I tested 8,15,16,24,32-0RGB,32-RGBA(with no SDL_SRCALPHA flag).
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Tue, 14 Dec 2004 06:20:49 +0000 |
parents | b8d311d90021 |
children | c9b51268668f |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
769
b8d311d90021
Updated copyright information for 2004 (Happy New Year!)
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
3 Copyright (C) 1997-2004 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
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 | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
36
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* Semaphore functions using the Win32 API */ | |
29 | |
30 #include <stdio.h> | |
31 #include <stdlib.h> | |
32 #include <windows.h> | |
33 | |
34 #include "SDL_error.h" | |
35 #include "SDL_thread.h" | |
36 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
37 #include "win_ce_semaphore.h" |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
38 #endif |
0 | 39 |
40 | |
41 struct SDL_semaphore { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
42 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
43 SYNCHHANDLE id; |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
44 #else |
0 | 45 HANDLE id; |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
46 #endif |
0 | 47 Uint32 volatile count; |
48 }; | |
49 | |
50 | |
51 /* Create a semaphore */ | |
52 SDL_sem *SDL_CreateSemaphore(Uint32 initial_value) | |
53 { | |
54 SDL_sem *sem; | |
55 | |
56 /* Allocate sem memory */ | |
57 sem = (SDL_sem *)malloc(sizeof(*sem)); | |
58 if ( sem ) { | |
59 /* Create the semaphore, with max value 32K */ | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
60 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
61 sem->id = CreateSemaphoreCE(NULL, initial_value, 32*1024, NULL); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
62 #else |
0 | 63 sem->id = CreateSemaphore(NULL, initial_value, 32*1024, NULL); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
64 #endif |
0 | 65 sem->count = initial_value; |
66 if ( ! sem->id ) { | |
67 SDL_SetError("Couldn't create semaphore"); | |
68 free(sem); | |
69 sem = NULL; | |
70 } | |
71 } else { | |
72 SDL_OutOfMemory(); | |
73 } | |
74 return(sem); | |
75 } | |
76 | |
77 /* Free the semaphore */ | |
78 void SDL_DestroySemaphore(SDL_sem *sem) | |
79 { | |
80 if ( sem ) { | |
81 if ( sem->id ) { | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
82 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
83 CloseSynchHandle(sem->id); |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
84 #else |
0 | 85 CloseHandle(sem->id); |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
86 #endif |
0 | 87 sem->id = 0; |
88 } | |
89 free(sem); | |
90 } | |
91 } | |
92 | |
93 int SDL_SemWaitTimeout(SDL_sem *sem, Uint32 timeout) | |
94 { | |
95 int retval; | |
96 DWORD dwMilliseconds; | |
97 | |
98 if ( ! sem ) { | |
99 SDL_SetError("Passed a NULL sem"); | |
100 return -1; | |
101 } | |
102 | |
103 if ( timeout == SDL_MUTEX_MAXWAIT ) { | |
104 dwMilliseconds = INFINITE; | |
105 } else { | |
106 dwMilliseconds = (DWORD)timeout; | |
107 } | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
108 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
109 switch (WaitForSemaphoreCE(sem->id, dwMilliseconds)) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
110 #else |
0 | 111 switch (WaitForSingleObject(sem->id, dwMilliseconds)) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
112 #endif |
0 | 113 case WAIT_OBJECT_0: |
114 --sem->count; | |
115 retval = 0; | |
116 break; | |
117 case WAIT_TIMEOUT: | |
118 retval = SDL_MUTEX_TIMEDOUT; | |
119 break; | |
120 default: | |
121 SDL_SetError("WaitForSingleObject() failed"); | |
122 retval = -1; | |
123 break; | |
124 } | |
125 return retval; | |
126 } | |
127 | |
128 int SDL_SemTryWait(SDL_sem *sem) | |
129 { | |
130 return SDL_SemWaitTimeout(sem, 0); | |
131 } | |
132 | |
133 int SDL_SemWait(SDL_sem *sem) | |
134 { | |
135 return SDL_SemWaitTimeout(sem, SDL_MUTEX_MAXWAIT); | |
136 } | |
137 | |
138 /* Returns the current count of the semaphore */ | |
139 Uint32 SDL_SemValue(SDL_sem *sem) | |
140 { | |
141 if ( ! sem ) { | |
142 SDL_SetError("Passed a NULL sem"); | |
143 return 0; | |
144 } | |
145 return sem->count; | |
146 } | |
147 | |
148 int SDL_SemPost(SDL_sem *sem) | |
149 { | |
150 if ( ! sem ) { | |
151 SDL_SetError("Passed a NULL sem"); | |
152 return -1; | |
153 } | |
154 /* Increase the counter in the first place, because | |
155 * after a successful release the semaphore may | |
156 * immediately get destroyed by another thread which | |
157 * is waiting for this semaphore. | |
158 */ | |
159 ++sem->count; | |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
160 #if defined(_WIN32_WCE) && (_WIN32_WCE < 300) |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
161 if ( ReleaseSemaphoreCE(sem->id, 1, NULL) == FALSE ) { |
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
162 #else |
0 | 163 if ( ReleaseSemaphore(sem->id, 1, NULL) == FALSE ) { |
36
13ee9f4834ea
Windows CE patches contributed by Rainer Loritz
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
164 #endif |
0 | 165 --sem->count; /* restore */ |
166 SDL_SetError("ReleaseSemaphore() failed"); | |
167 return -1; | |
168 } | |
169 return 0; | |
170 } |