Skip to content

Latest commit

 

History

History
230 lines (193 loc) · 6.78 KB

SDL_nximage.c

File metadata and controls

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