⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sdl_nximage.c

📁 SDL库 在进行视频显示程序spcaview安装时必须的库文件
💻 C
字号:
/*    SDL - Simple DirectMedia Layer    Copyright (C) 1997-2004 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") ;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -