symbian-qemu-0.9.1-12/libsdl-trunk/src/video/nanox/SDL_nximage.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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@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@libsdl.org
       
    23     
       
    24     Hsieh-Fu Tsai
       
    25     clare@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 }