diff options
Diffstat (limited to 'apps/plugins/sdl/src/video/nanox/SDL_nximage.c')
-rw-r--r-- | apps/plugins/sdl/src/video/nanox/SDL_nximage.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/apps/plugins/sdl/src/video/nanox/SDL_nximage.c b/apps/plugins/sdl/src/video/nanox/SDL_nximage.c new file mode 100644 index 0000000000..23d3157cb0 --- /dev/null +++ b/apps/plugins/sdl/src/video/nanox/SDL_nximage.c | |||
@@ -0,0 +1,230 @@ | |||
1 | /* | ||
2 | SDL - Simple DirectMedia Layer | ||
3 | Copyright (C) 1997-2012 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 | } | ||