aboutsummaryrefslogtreecommitdiffstats
path: root/distrib/sdl-1.2.15/src/video/nanox/SDL_nximage.c
diff options
context:
space:
mode:
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.c230
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") ;
+}