Mercurial > sdl-ios-xcode
diff src/video/nanox/SDL_nximage.c @ 30:57bf11a5efd7
Added initial support for Nano-X (thanks Hsieh-Fu!)
author | Sam Lantinga <slouken@lokigames.com> |
---|---|
date | Fri, 11 May 2001 01:13:35 +0000 |
parents | |
children | e8157fcb3114 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/video/nanox/SDL_nximage.c Fri May 11 01:13:35 2001 +0000 @@ -0,0 +1,166 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga + Copyright (C) 2001 Hsieh-Fu Tsai + + 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@devolution.com + + Hsieh-Fu Tsai + clare@setabox.com +*/ + +#include <stdlib.h> + +#include "SDL_error.h" + +#include "SDL_nximage_c.h" + +void NX_NormalUpdate (_THIS, int numrects, SDL_Rect * rects) +{ + int i, j, xinc, yinc, destinc ; + int x, y, w, h ; + unsigned char * src = NULL, * dest = NULL ; + + Dprintf ("enter NX_NormalUpdate\n") ; + + 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 ; + dest = Image_buff ; + destinc = w * xinc ; + + // apply GammaRamp table +#if (defined (NANOX_PIXEL_RGB) || defined (NANOX_PIXEL_0888) || \ + defined (NANOX_PIXEL_888)) + if (GammaRamp_R && GammaRamp_G && GammaRamp_B) { + Uint8 * ptr ; + int k ; + + for (j = h; j > 0; -- j, src += yinc) { + ptr = src - 1 ; + for (k = w; k > 0; -- k) { +#ifdef NANOX_PIXEL_RGB + ptr += 2 ; +#endif +#ifdef NANOX_PIXEL_0888 + ptr += 2 ; +#endif +#ifdef NANOX_PIXEL_888 + ++ ptr ; +#endif + (* ptr) = GammaRamp_B [(* ptr)] ; + ++ ptr ; + (* ptr) = GammaRamp_G [(* ptr)] ; + ++ ptr ; + (* ptr) = GammaRamp_R [(* ptr)] ; + } + } + src = SDL_Image + y * yinc + x * xinc ; + } +#endif // apply Gamma table + + for (j = h; j > 0; -- j, src += yinc, dest += destinc) { + memcpy (dest, src, destinc) ; + } + + 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) ; + } + } + + 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 *) malloc (size) ; + Image_buff = (unsigned char *) malloc (size) ; + if (screen -> pixels == NULL || Image_buff == NULL) { + free (screen -> pixels) ; + 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) free (SDL_Image) ; + if (Image_buff) 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 ; + + 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; + } + + 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) ; + } + + Dprintf ("leave NX_RefreshDisplay\n") ; +}