Mercurial > sdl-ios-xcode
annotate src/video/fbcon/SDL_fb3dfx.c @ 4170:092c0bc69155 SDL-1.2
Fixed bug #618
Description From Tim Angus 2008-08-30 12:23:56 (-) [reply]
As we all know SDL 1.2 doesn't handle dead keys well since one key press
potentially equals two (or more) characters. For example, on many layouts,
keying <backquote>,<space> results in <no character>,<backquote><space>. Since
the unicode member of the SDL_keysym struct only has room for one character,
only one can be returned.
On Linux, the first character is returned. On Windows however, unless the exact
number of characters generated by the keypress is 1, nothing is returned. The
following patch addresses this inconsistency.
Updated patch which includes a further fix to the handling of the numpad when
numlock is on. This further fix is courtesy Amanieu d'Antras.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Mon, 13 Apr 2009 08:42:09 +0000 |
parents | a1b03ba2fcd0 |
children |
rev | line source |
---|---|
0 | 1 /* |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
2 SDL - Simple DirectMedia Layer |
4159 | 3 Copyright (C) 1997-2009 Sam Lantinga |
0 | 4 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
5 This library is free software; you can redistribute it and/or |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
6 modify it under the terms 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:
769
diff
changeset
|
7 License as published by the Free Software Foundation; either |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
8 version 2.1 of the License, or (at your option) any later version. |
0 | 9 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
10 This library is distributed in the hope that it will be useful, |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
11 but WITHOUT ANY WARRANTY; without even the implied warranty of |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
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:
769
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:
769
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:
769
diff
changeset
|
17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA |
0 | 18 |
1312
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
19 Sam Lantinga |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
20 slouken@libsdl.org |
c9b51268668f
Updated copyright information and removed rcs id lines (problematic in branch merges)
Sam Lantinga <slouken@libsdl.org>
parents:
769
diff
changeset
|
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 #include "SDL_video.h" | |
1361
19418e4422cb
New configure-based build system. Still work in progress, but much improved
Sam Lantinga <slouken@libsdl.org>
parents:
1358
diff
changeset
|
25 #include "../SDL_blit.h" |
0 | 26 #include "SDL_fb3dfx.h" |
27 #include "3dfx_mmio.h" | |
28 | |
29 | |
30 /* Wait for vertical retrace */ | |
31 static void WaitVBL(_THIS) | |
32 { | |
33 /* find start of retrace */ | |
34 tdfx_waitidle(); | |
35 while( (tdfx_in32(TDFX_STATUS) & STATUS_RETRACE) == STATUS_RETRACE ) | |
36 ; | |
37 /* wait until we're past the start */ | |
38 while( (tdfx_in32(TDFX_STATUS) & STATUS_RETRACE) == 0 ) | |
39 ; | |
40 } | |
106
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
41 static void WaitIdle(_THIS) |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
42 { |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
43 tdfx_waitidle(); |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
44 } |
0 | 45 |
46 /* Sets video mem colorkey and accelerated blit function */ | |
47 static int SetHWColorKey(_THIS, SDL_Surface *surface, Uint32 key) | |
48 { | |
49 return(0); | |
50 } | |
51 | |
52 static int FillHWRect(_THIS, SDL_Surface *dst, SDL_Rect *rect, Uint32 color) | |
53 { | |
54 int bpp; | |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
55 Uint32 dst_base; |
0 | 56 Uint32 format; |
57 int dstX, dstY; | |
58 | |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
59 /* Don't blit to the display surface when switched away */ |
1780 | 60 if ( switched_away ) { |
61 return -2; /* no hardware access */ | |
62 } | |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
63 if ( dst == this->screen ) { |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
64 SDL_mutexP(hw_lock); |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
65 } |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
66 |
0 | 67 /* Set the destination pixel format */ |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
68 dst_base = ((char *)dst->pixels - mapped_mem); |
0 | 69 bpp = dst->format->BitsPerPixel; |
70 format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13); | |
71 | |
72 /* Calculate source and destination base coordinates */ | |
73 dstX = rect->x; | |
74 dstY = rect->y; | |
75 | |
76 /* Execute the fill command */ | |
77 tdfx_wait(6); | |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
78 tdfx_out32(DSTBASE, dst_base); |
0 | 79 tdfx_out32(DSTFORMAT, format); |
80 tdfx_out32(COLORFORE, color); | |
81 tdfx_out32(COMMAND_2D, COMMAND_2D_FILLRECT); | |
82 tdfx_out32(DSTSIZE, rect->w | (rect->h << 16)); | |
83 tdfx_out32(LAUNCH_2D, dstX | (dstY << 16)); | |
106
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
84 |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
85 FB_AddBusySurface(dst); |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
86 |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
87 if ( dst == this->screen ) { |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
88 SDL_mutexV(hw_lock); |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
89 } |
0 | 90 return(0); |
91 } | |
92 | |
93 static int HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect, | |
94 SDL_Surface *dst, SDL_Rect *dstrect) | |
95 { | |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
96 SDL_VideoDevice *this = current_video; |
0 | 97 int bpp; |
98 Uint32 src_format; | |
99 Uint32 dst_format; | |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
100 Uint32 src_base; |
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
101 Uint32 dst_base; |
0 | 102 int srcX, srcY; |
103 int dstX, dstY; | |
104 Uint32 blitop; | |
105 Uint32 use_colorkey; | |
106 | |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
107 /* Don't blit to the display surface when switched away */ |
1780 | 108 if ( switched_away ) { |
109 return -2; /* no hardware access */ | |
110 } | |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
111 if ( dst == this->screen ) { |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
112 SDL_mutexP(hw_lock); |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
113 } |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
114 |
0 | 115 /* Set the source and destination pixel format */ |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
116 src_base = ((char *)src->pixels - mapped_mem); |
0 | 117 bpp = src->format->BitsPerPixel; |
118 src_format = src->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13); | |
3989
f903dc168217
Fixed 64-bit compile issues
Sam Lantinga <slouken@libsdl.org>
parents:
1780
diff
changeset
|
119 dst_base = ((char *)dst->pixels - mapped_mem); |
0 | 120 bpp = dst->format->BitsPerPixel; |
121 dst_format = dst->pitch | ((bpp+((bpp==8) ? 0 : 8)) << 13); | |
122 | |
123 srcX = srcrect->x; | |
124 srcY = srcrect->y; | |
125 dstX = dstrect->x; | |
126 dstY = dstrect->y; | |
127 | |
128 /* Assemble the blit operation */ | |
129 blitop = COMMAND_2D_BITBLT | (0xCC << 24); | |
130 if ( srcX <= dstX ) { | |
131 blitop |= BIT(14); | |
132 srcX += (dstrect->w - 1); | |
133 dstX += (dstrect->w - 1); | |
134 } | |
135 if ( srcY <= dstY ) { | |
136 blitop |= BIT(15); | |
137 srcY += (dstrect->h - 1); | |
138 dstY += (dstrect->h - 1); | |
139 } | |
140 | |
141 /* Perform the blit! */ | |
142 if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) { | |
143 tdfx_wait(3); | |
144 tdfx_out32(SRCCOLORKEYMIN, src->format->colorkey); | |
145 tdfx_out32(SRCCOLORKEYMAX, src->format->colorkey); | |
146 tdfx_out32(ROP_2D, 0xAA00); | |
147 use_colorkey = 1; | |
148 } else { | |
149 use_colorkey = 0; | |
150 } | |
151 tdfx_wait(9); | |
152 tdfx_out32(SRCBASE, (Uint32)src_base); | |
153 tdfx_out32(SRCFORMAT, src_format); | |
154 tdfx_out32(DSTBASE, (Uint32)dst_base); | |
155 tdfx_out32(DSTFORMAT, src_format); | |
156 tdfx_out32(COMMAND_2D, blitop); | |
157 tdfx_out32(COMMANDEXTRA_2D, use_colorkey); | |
158 tdfx_out32(DSTSIZE, dstrect->w | (dstrect->h << 16)); | |
159 tdfx_out32(DSTXY, dstX | (dstY << 16)); | |
160 tdfx_out32(LAUNCH_2D, srcX | (srcY << 16)); | |
161 | |
106
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
162 FB_AddBusySurface(src); |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
163 FB_AddBusySurface(dst); |
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
164 |
109
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
165 if ( dst == this->screen ) { |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
166 SDL_mutexV(hw_lock); |
5a9c36a45db1
Fixed switching away from the SDL at the framebuffer console
Sam Lantinga <slouken@lokigames.com>
parents:
106
diff
changeset
|
167 } |
0 | 168 return(0); |
169 } | |
170 | |
171 static int CheckHWBlit(_THIS, SDL_Surface *src, SDL_Surface *dst) | |
172 { | |
173 int accelerated; | |
174 | |
175 /* Set initial acceleration on */ | |
176 src->flags |= SDL_HWACCEL; | |
177 | |
178 /* Set the surface attributes */ | |
179 if ( (src->flags & SDL_SRCALPHA) == SDL_SRCALPHA ) { | |
180 if ( ! this->info.blit_hw_A ) { | |
181 src->flags &= ~SDL_HWACCEL; | |
182 } | |
183 } | |
184 if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) { | |
185 if ( ! this->info.blit_hw_CC ) { | |
186 src->flags &= ~SDL_HWACCEL; | |
187 } | |
188 } | |
189 | |
190 /* Check to see if final surface blit is accelerated */ | |
191 accelerated = !!(src->flags & SDL_HWACCEL); | |
192 if ( accelerated ) { | |
193 src->map->hw_blit = HWAccelBlit; | |
194 } | |
195 return(accelerated); | |
196 } | |
197 | |
198 void FB_3DfxAccel(_THIS, __u32 card) | |
199 { | |
200 /* We have hardware accelerated surface functions */ | |
201 this->CheckHWBlit = CheckHWBlit; | |
202 wait_vbl = WaitVBL; | |
106
63ec24e0575f
Merged DGA video surface handling improvements, unified locking code.
Sam Lantinga <slouken@lokigames.com>
parents:
0
diff
changeset
|
203 wait_idle = WaitIdle; |
0 | 204 |
205 /* Reset the 3Dfx controller */ | |
206 tdfx_out32(BRESERROR0, 0); | |
207 tdfx_out32(BRESERROR1, 0); | |
208 | |
209 /* The 3Dfx has an accelerated color fill */ | |
210 this->info.blit_fill = 1; | |
211 this->FillHWRect = FillHWRect; | |
212 | |
213 /* The 3Dfx has accelerated normal and colorkey blits */ | |
214 this->info.blit_hw = 1; | |
215 this->info.blit_hw_CC = 1; | |
216 this->SetHWColorKey = SetHWColorKey; | |
217 } |