Home | History | Annotate | Download | only in nanox
      1 /*
      2     SDL - Simple DirectMedia Layer
      3     Copyright (C) 1997-2004 Sam Lantinga
      4     Copyright (C) 2001  Hsieh-Fu Tsai
      5     Copyright (C) 2002  Greg Haerr <greg (at) 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 (at) libsdl.org
     23 
     24     Hsieh-Fu Tsai
     25     clare (at) 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 }
    231