e14743d1 |
1 | /* |
2 | SDL - Simple DirectMedia Layer |
3 | Copyright (C) 1997-2009 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 | } |