diff options
Diffstat (limited to 'distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c')
-rw-r--r-- | distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c b/distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c new file mode 100644 index 0000000..23d3157 --- /dev/null +++ b/distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c @@ -0,0 +1,230 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2012 Sam Lantinga + Copyright (C) 2001 Hsieh-Fu Tsai + Copyright (C) 2002 Greg Haerr <greg@censoft.com> + + 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 + slouken@libsdl.org + + Hsieh-Fu Tsai + clare@setabox.com +*/ +#include "SDL_config.h" + +#include "SDL_nximage_c.h" + +void NX_NormalUpdate (_THIS, int numrects, SDL_Rect * rects) +{ + int i, j, xinc, yinc, destinc, rowinc ; + int x, y, w, h ; + unsigned char * src = NULL, * dest = NULL ; + + Dprintf ("enter NX_NormalUpdate\n") ; + + /* These are the values for the incoming image */ + 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 ; +#ifdef ENABLE_NANOX_DIRECT_FB + 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 +#endif + { + dest = Image_buff ; + destinc = w * xinc ; + } + rowinc = w * xinc; + + // apply GammaRamp table + if ((pixel_type == MWPF_TRUECOLOR0888 || pixel_type == MWPF_TRUECOLOR888) + && GammaRamp_R && GammaRamp_G && GammaRamp_B) { + Uint8 * ptrsrc ; + Uint8 * ptrdst ; + int k ; + + for (j = h; j > 0; -- j, src += yinc, dest += destinc) { + ptrsrc = src ; + ptrdst = dest ; + for (k = w; k > 0; -- k) { + *ptrdst++ = GammaRamp_B [*ptrsrc++] >> 8; + *ptrdst++ = GammaRamp_G [*ptrsrc++] >> 8; + *ptrdst++ = GammaRamp_R [*ptrsrc++] >> 8; + *ptrdst++ = 0; + ++ptrsrc; + } + } + } +#if 1 /* This is needed for microwindows 0.90 or older */ + else if (pixel_type == MWPF_TRUECOLOR0888 || pixel_type == MWPF_TRUECOLOR888) { + Uint8 * ptrsrc ; + Uint8 * ptrdst ; + int k ; + + 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) + SDL_memcpy (dest, src, rowinc) ; + } + if (!Clientfb) { + 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) ; + } + } + } + GrFlush(); + + Dprintf ("leave NX_NormalUpdate\n") ; +} + +int NX_SetupImage (_THIS, SDL_Surface * screen) +{ + int size = screen -> h * screen -> pitch ; + + Dprintf ("enter NX_SetupImage\n") ; + + screen -> pixels = (void *) SDL_malloc (size) ; + + if (!Clientfb) { + Image_buff = (unsigned char *) SDL_malloc (size) ; + if (screen -> pixels == NULL || Image_buff == NULL) { + SDL_free (screen -> pixels) ; + SDL_free (Image_buff) ; + SDL_OutOfMemory () ; + return -1 ; + } + } + + 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") ; + + if (SDL_Image) SDL_free (SDL_Image) ; + if (Image_buff) SDL_free (Image_buff) ; + 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 ; + +#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 + 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; + } + +#ifdef ENABLE_NANOX_DIRECT_FB + if (Clientfb) { + int j; + char *src, *dest = NULL; + int xinc, yinc, rowinc; + + GrGetWindowFBInfo(SDL_Window, &fbinfo); + + xinc = this -> screen -> format -> BytesPerPixel ; + yinc = this -> screen -> pitch ; + + src = SDL_Image; + if (currently_fullscreen) + dest = fbinfo.winpixels + ((OffsetY * fbinfo.pitch) + + (OffsetX * fbinfo.bytespp)); + else + dest = fbinfo.winpixels; + rowinc = xinc * this -> screen -> w; + + for (j = this -> screen -> h; j > 0; -- j, src += yinc, dest += fbinfo.pitch) + SDL_memcpy (dest, src, rowinc) ; + } + else +#endif + { + if (currently_fullscreen) { + GrArea (FSwindow, SDL_GC, OffsetX, OffsetY, this -> screen -> w, + this -> screen -> h, SDL_Image, pixel_type) ; + } else { + GrArea (SDL_Window, SDL_GC, 0, 0, this -> screen -> w, + this -> screen -> h, SDL_Image, pixel_type) ; + } + } + GrFlush(); + + Dprintf ("leave NX_RefreshDisplay\n") ; +} |