|
1 /* |
|
2 SDL - Simple DirectMedia Layer |
|
3 Copyright (C) 1997-2004 Sam Lantinga |
|
4 Copyright (C) 2001 Hsieh-Fu Tsai |
|
5 Copyright (C) 2002 Greg Haerr <greg@censoft.com> |
|
6 |
|
7 This library is free software; you can redistribute it and/or |
|
8 modify it under the terms of the GNU Library General Public |
|
9 License as published by the Free Software Foundation; either |
|
10 version 2 of the License, or (at your option) any later version. |
|
11 |
|
12 This library is distributed in the hope that it will be useful, |
|
13 but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
15 Library General Public License for more details. |
|
16 |
|
17 You should have received a copy of the GNU Library General Public |
|
18 License along with this library; if not, write to the Free |
|
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
20 |
|
21 Sam Lantinga |
|
22 slouken@libsdl.org |
|
23 |
|
24 Hsieh-Fu Tsai |
|
25 clare@setabox.com |
|
26 */ |
|
27 #include "SDL_config.h" |
|
28 |
|
29 #include "SDL_nximage_c.h" |
|
30 |
|
31 void NX_NormalUpdate (_THIS, int numrects, SDL_Rect * rects) |
|
32 { |
|
33 int i, j, xinc, yinc, destinc, rowinc ; |
|
34 int x, y, w, h ; |
|
35 unsigned char * src = NULL, * dest = NULL ; |
|
36 |
|
37 Dprintf ("enter NX_NormalUpdate\n") ; |
|
38 |
|
39 /* These are the values for the incoming image */ |
|
40 xinc = this -> screen -> format -> BytesPerPixel ; |
|
41 yinc = this -> screen -> pitch ; |
|
42 |
|
43 for (i = 0; i < numrects; ++ i) { |
|
44 x = rects [i].x, y = rects [i].y ; |
|
45 w = rects [i].w, h = rects [i].h ; |
|
46 src = SDL_Image + y * yinc + x * xinc ; |
|
47 #ifdef ENABLE_NANOX_DIRECT_FB |
|
48 if (Clientfb) { |
|
49 if (currently_fullscreen) |
|
50 dest = fbinfo.winpixels + (((y+OffsetY) * fbinfo.pitch) + |
|
51 ((x+OffsetX) * fbinfo.bytespp)); |
|
52 else |
|
53 dest = fbinfo.winpixels + ((y * fbinfo.pitch) + (x * fbinfo.bytespp)); |
|
54 destinc = fbinfo.pitch; |
|
55 } |
|
56 else |
|
57 #endif |
|
58 { |
|
59 dest = Image_buff ; |
|
60 destinc = w * xinc ; |
|
61 } |
|
62 rowinc = w * xinc; |
|
63 |
|
64 // apply GammaRamp table |
|
65 if ((pixel_type == MWPF_TRUECOLOR0888 || pixel_type == MWPF_TRUECOLOR888) |
|
66 && GammaRamp_R && GammaRamp_G && GammaRamp_B) { |
|
67 Uint8 * ptrsrc ; |
|
68 Uint8 * ptrdst ; |
|
69 int k ; |
|
70 |
|
71 for (j = h; j > 0; -- j, src += yinc, dest += destinc) { |
|
72 ptrsrc = src ; |
|
73 ptrdst = dest ; |
|
74 for (k = w; k > 0; -- k) { |
|
75 *ptrdst++ = GammaRamp_B [*ptrsrc++] >> 8; |
|
76 *ptrdst++ = GammaRamp_G [*ptrsrc++] >> 8; |
|
77 *ptrdst++ = GammaRamp_R [*ptrsrc++] >> 8; |
|
78 *ptrdst++ = 0; |
|
79 ++ptrsrc; |
|
80 } |
|
81 } |
|
82 } |
|
83 #if 1 /* This is needed for microwindows 0.90 or older */ |
|
84 else if (pixel_type == MWPF_TRUECOLOR0888 || pixel_type == MWPF_TRUECOLOR888) { |
|
85 Uint8 * ptrsrc ; |
|
86 Uint8 * ptrdst ; |
|
87 int k ; |
|
88 |
|
89 for (j = h; j > 0; -- j, src += yinc, dest += destinc) { |
|
90 ptrsrc = src ; |
|
91 ptrdst = dest ; |
|
92 for (k = w; k > 0; -- k) { |
|
93 *ptrdst++ = *ptrsrc++; |
|
94 *ptrdst++ = *ptrsrc++; |
|
95 *ptrdst++ = *ptrsrc++; |
|
96 *ptrdst++ = 0; |
|
97 ++ptrsrc; |
|
98 } |
|
99 } |
|
100 } |
|
101 #endif |
|
102 else |
|
103 { |
|
104 for (j = h; j > 0; -- j, src += yinc, dest += destinc) |
|
105 SDL_memcpy (dest, src, rowinc) ; |
|
106 } |
|
107 if (!Clientfb) { |
|
108 if (currently_fullscreen) { |
|
109 GrArea (FSwindow, SDL_GC, x + OffsetX, y + OffsetY, w, h, Image_buff, |
|
110 pixel_type) ; |
|
111 } else { |
|
112 GrArea (SDL_Window, SDL_GC, x, y, w, h, Image_buff, pixel_type) ; |
|
113 } |
|
114 } |
|
115 } |
|
116 GrFlush(); |
|
117 |
|
118 Dprintf ("leave NX_NormalUpdate\n") ; |
|
119 } |
|
120 |
|
121 int NX_SetupImage (_THIS, SDL_Surface * screen) |
|
122 { |
|
123 int size = screen -> h * screen -> pitch ; |
|
124 |
|
125 Dprintf ("enter NX_SetupImage\n") ; |
|
126 |
|
127 screen -> pixels = (void *) SDL_malloc (size) ; |
|
128 |
|
129 if (!Clientfb) { |
|
130 Image_buff = (unsigned char *) SDL_malloc (size) ; |
|
131 if (screen -> pixels == NULL || Image_buff == NULL) { |
|
132 SDL_free (screen -> pixels) ; |
|
133 SDL_free (Image_buff) ; |
|
134 SDL_OutOfMemory () ; |
|
135 return -1 ; |
|
136 } |
|
137 } |
|
138 |
|
139 SDL_Image = (unsigned char *) screen -> pixels ; |
|
140 |
|
141 this -> UpdateRects = NX_NormalUpdate ; |
|
142 |
|
143 Dprintf ("leave NX_SetupImage\n") ; |
|
144 return 0 ; |
|
145 } |
|
146 |
|
147 void NX_DestroyImage (_THIS, SDL_Surface * screen) |
|
148 { |
|
149 Dprintf ("enter NX_DestroyImage\n") ; |
|
150 |
|
151 if (SDL_Image) SDL_free (SDL_Image) ; |
|
152 if (Image_buff) SDL_free (Image_buff) ; |
|
153 if (screen) screen -> pixels = NULL ; |
|
154 |
|
155 Dprintf ("leave NX_DestroyImage\n") ; |
|
156 } |
|
157 |
|
158 int NX_ResizeImage (_THIS, SDL_Surface * screen, Uint32 flags) |
|
159 { |
|
160 int retval ; |
|
161 GR_SCREEN_INFO si ; |
|
162 |
|
163 Dprintf ("enter NX_ResizeImage\n") ; |
|
164 |
|
165 NX_DestroyImage (this, screen) ; |
|
166 retval = NX_SetupImage (this, screen) ; |
|
167 |
|
168 GrGetScreenInfo (& si) ; |
|
169 OffsetX = (si.cols - screen -> w) / 2 ; |
|
170 OffsetY = (si.rows - screen -> h) / 2 ; |
|
171 |
|
172 #ifdef ENABLE_NANOX_DIRECT_FB |
|
173 if (Clientfb) { |
|
174 /* Get current window position and fb pointer*/ |
|
175 if (currently_fullscreen) |
|
176 GrGetWindowFBInfo(FSwindow, &fbinfo); |
|
177 else |
|
178 GrGetWindowFBInfo(SDL_Window, &fbinfo); |
|
179 } |
|
180 #endif |
|
181 Dprintf ("leave NX_ResizeImage\n") ; |
|
182 return retval ; |
|
183 } |
|
184 |
|
185 void NX_RefreshDisplay (_THIS) |
|
186 { |
|
187 Dprintf ("enter NX_RefreshDisplay\n") ; |
|
188 |
|
189 // Don't refresh a display that doesn't have an image (like GL) |
|
190 if (! SDL_Image) { |
|
191 return; |
|
192 } |
|
193 |
|
194 #ifdef ENABLE_NANOX_DIRECT_FB |
|
195 if (Clientfb) { |
|
196 int j; |
|
197 char *src, *dest = NULL; |
|
198 int xinc, yinc, rowinc; |
|
199 |
|
200 GrGetWindowFBInfo(SDL_Window, &fbinfo); |
|
201 |
|
202 xinc = this -> screen -> format -> BytesPerPixel ; |
|
203 yinc = this -> screen -> pitch ; |
|
204 |
|
205 src = SDL_Image; |
|
206 if (currently_fullscreen) |
|
207 dest = fbinfo.winpixels + ((OffsetY * fbinfo.pitch) + |
|
208 (OffsetX * fbinfo.bytespp)); |
|
209 else |
|
210 dest = fbinfo.winpixels; |
|
211 rowinc = xinc * this -> screen -> w; |
|
212 |
|
213 for (j = this -> screen -> h; j > 0; -- j, src += yinc, dest += fbinfo.pitch) |
|
214 SDL_memcpy (dest, src, rowinc) ; |
|
215 } |
|
216 else |
|
217 #endif |
|
218 { |
|
219 if (currently_fullscreen) { |
|
220 GrArea (FSwindow, SDL_GC, OffsetX, OffsetY, this -> screen -> w, |
|
221 this -> screen -> h, SDL_Image, pixel_type) ; |
|
222 } else { |
|
223 GrArea (SDL_Window, SDL_GC, 0, 0, this -> screen -> w, |
|
224 this -> screen -> h, SDL_Image, pixel_type) ; |
|
225 } |
|
226 } |
|
227 GrFlush(); |
|
228 |
|
229 Dprintf ("leave NX_RefreshDisplay\n") ; |
|
230 } |