SDL_nxvideo.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     Copyright (C) 2001  Hsieh-Fu Tsai
  5.     This library is free software; you can redistribute it and/or
  6.     modify it under the terms of the GNU Library General Public
  7.     License as published by the Free Software Foundation; either
  8.     version 2 of the License, or (at your option) any later version.
  9.     This library is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  12.     Library General Public License for more details.
  13.     You should have received a copy of the GNU Library General Public
  14.     License along with this library; if not, write to the Free
  15.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  16.     Sam Lantinga
  17.     slouken@libsdl.org
  18.     
  19.     Hsieh-Fu Tsai
  20.     clare@setabox.com
  21. */
  22. #include <stdlib.h>
  23. #include "SDL_video.h"
  24. #include "SDL_pixels_c.h"
  25. #include "SDL_events_c.h"
  26. #include "SDL_thread.h"
  27. #define MWINCLUDECOLORS
  28. #include "SDL_nxvideo.h"
  29. #include "SDL_nxmodes_c.h"
  30. #include "SDL_nxwm_c.h"
  31. #include "SDL_nxmouse_c.h"
  32. #include "SDL_nximage_c.h"
  33. #include "SDL_nxevents_c.h"
  34. // Initialization/Query functions
  35. static int NX_VideoInit (_THIS, SDL_PixelFormat * vformat) ;
  36. static SDL_Surface * NX_SetVideoMode (_THIS, SDL_Surface * current, int width, int height, int bpp, Uint32 flags) ;
  37. static int NX_SetColors (_THIS, int firstcolor, int ncolors, SDL_Color * colors) ;
  38. static void NX_VideoQuit (_THIS) ;
  39. static void NX_DestroyWindow (_THIS, SDL_Surface * screen) ;
  40. static int NX_ToggleFullScreen (_THIS, int on) ;
  41. static void NX_UpdateMouse (_THIS) ;
  42. static int NX_SetGammaRamp (_THIS, Uint16 * ramp) ;
  43. static int NX_GetGammaRamp (_THIS, Uint16 * ramp) ;
  44. // Microwin driver bootstrap functions
  45. static int NX_Available ()
  46. {
  47.     Dprintf ("enter NX_Availablen") ;
  48.     if (GrOpen () < 0) return 0 ;
  49.         GrClose () ;
  50.     
  51.     Dprintf ("leave NX_Availablen") ;
  52.     return 1 ;
  53. }
  54. static void NX_DeleteDevice (SDL_VideoDevice * device)
  55. {
  56.     Dprintf ("enter NX_DeleteDevicen") ;
  57.     if (device) {
  58.         if (device -> hidden) free (device -> hidden) ;
  59.         if (device -> gl_data) free (device -> gl_data) ;
  60.             free (device) ;
  61.     }
  62.     Dprintf ("leave NX_DeleteDevicen") ;
  63. }
  64.     
  65. static SDL_VideoDevice * NX_CreateDevice (int devindex)
  66. {
  67.     SDL_VideoDevice * device ;
  68.     Dprintf ("enter NX_CreateDevicen") ;
  69.     // Initialize all variables that we clean on shutdown
  70.     device = (SDL_VideoDevice *) malloc (sizeof (SDL_VideoDevice)) ;
  71.     if (device) {
  72.         memset (device, 0, (sizeof * device)) ;
  73.         device -> hidden = (struct SDL_PrivateVideoData *)
  74.                 malloc ((sizeof * device -> hidden)) ;
  75.         device -> gl_data = NULL ;
  76.     }
  77.     if ((device == NULL) || (device -> hidden == NULL)) {
  78.         SDL_OutOfMemory () ;
  79.         NX_DeleteDevice (device) ;
  80.         return 0 ;
  81.     }
  82.     memset (device -> hidden, 0, (sizeof * device -> hidden)) ;
  83.     // Set the function pointers
  84.     device -> VideoInit = NX_VideoInit ;
  85.     device -> ListModes = NX_ListModes ;
  86.     device -> SetVideoMode = NX_SetVideoMode ;
  87.     device -> ToggleFullScreen = NX_ToggleFullScreen ;
  88.     device -> UpdateMouse = NX_UpdateMouse ;
  89.     device -> CreateYUVOverlay = NULL ;
  90.     device -> SetColors = NX_SetColors ;
  91.     device -> UpdateRects = NULL ;
  92.     device -> VideoQuit = NX_VideoQuit;
  93.     device -> AllocHWSurface = NULL ;
  94.     device -> CheckHWBlit = NULL ;
  95.     device -> FillHWRect = NULL ;
  96.     device -> SetHWColorKey = NULL ;
  97.     device -> SetHWAlpha = NULL ;
  98.     device -> LockHWSurface = NULL ;
  99.     device -> UnlockHWSurface = NULL ;
  100.     device -> FlipHWSurface = NULL ;
  101.     device -> FreeHWSurface = NULL ;
  102.     device -> SetGamma = NULL ;
  103.     device -> GetGamma = NULL ;
  104.     device -> SetGammaRamp = NX_SetGammaRamp ;
  105.     device -> GetGammaRamp = NX_GetGammaRamp ;
  106. #ifdef HAVE_OPENGL
  107.     device -> GL_LoadLibrary = NULL ;
  108.     device -> GL_GetProcAddress = NULL ;
  109.     device -> GL_GetAttribute = NULL ;
  110.     device -> GL_MakeCurrent = NULL ;
  111.     device -> GL_SwapBuffers = NULL ;
  112. #endif
  113.     device -> SetIcon = NULL ;
  114.     device -> SetCaption = NX_SetCaption;
  115.     device -> IconifyWindow = NULL ;
  116.     device -> GrabInput = NULL ;
  117.     device -> GetWMInfo = NX_GetWMInfo ;
  118.     device -> FreeWMCursor =  NX_FreeWMCursor ;
  119.     device -> CreateWMCursor = NX_CreateWMCursor ;
  120.     device -> ShowWMCursor = NX_ShowWMCursor ;
  121.     device -> WarpWMCursor = NX_WarpWMCursor ;
  122.     device -> CheckMouseMode = NULL ;
  123.     device -> InitOSKeymap = NX_InitOSKeymap ;
  124.     device -> PumpEvents = NX_PumpEvents ;
  125.     device -> free = NX_DeleteDevice ;
  126.     Dprintf ("leave NX_CreateDevicen") ;
  127.     return device ;
  128. }
  129. VideoBootStrap NX_bootstrap = {
  130.     "nanox", "nanox", NX_Available, NX_CreateDevice
  131. } ;
  132. static void create_aux_windows (_THIS)
  133. {
  134.     GR_WM_PROPERTIES props ;
  135.     Dprintf ("enter create_aux_windowsn") ;
  136.     // Don't create any extra windows if we are being managed
  137.     if (SDL_windowid) {
  138.         FSwindow = 0 ;
  139.         return ;
  140.     }
  141.     
  142.     if (FSwindow && FSwindow != GR_ROOT_WINDOW_ID) {
  143.         GrDestroyWindow (FSwindow) ;
  144.     }
  145.     
  146.     FSwindow = GrNewWindow (GR_ROOT_WINDOW_ID, 0, 0, 1, 1, 0, BLACK, BLACK) ;
  147.     props.flags = GR_WM_FLAGS_PROPS ;
  148.     props.props = GR_WM_PROPS_NODECORATE ;
  149.     GrSetWMProperties (FSwindow, & props) ;
  150.     GrSelectEvents (FSwindow, (GR_EVENT_MASK_EXPOSURE         |
  151.         GR_EVENT_MASK_BUTTON_DOWN  | GR_EVENT_MASK_BUTTON_UP  |
  152.         GR_EVENT_MASK_FOCUS_IN     | GR_EVENT_MASK_FOCUS_OUT  |
  153.         GR_EVENT_MASK_KEY_DOWN     | GR_EVENT_MASK_KEY_UP     |
  154.         GR_EVENT_MASK_MOUSE_ENTER  | GR_EVENT_MASK_MOUSE_EXIT |
  155.         GR_EVENT_MASK_MOUSE_MOTION | GR_EVENT_MASK_UPDATE     |
  156.         GR_EVENT_MASK_CLOSE_REQ)) ;
  157.     Dprintf ("leave create_aux_windowsn") ;
  158. }
  159. int NX_VideoInit (_THIS, SDL_PixelFormat * vformat)
  160. {
  161.     GR_SCREEN_INFO si ;
  162.     Dprintf ("enter NX_VideoInitn") ;
  163.     
  164.     if (GrOpen () < 0) {
  165.         SDL_SetError ("GrOpen() fail") ;
  166.         return -1 ;
  167.     }
  168.     // use share memory to speed up
  169. #ifdef NANOX_SHARE_MEMORY
  170.     GrReqShmCmds (0xFFFF);
  171. #endif
  172.     SDL_Window = 0 ;
  173.     FSwindow = 0 ;
  174.     GammaRamp_R = NULL ;
  175.     GammaRamp_G = NULL ;
  176.     GammaRamp_B = NULL ;    
  177.     GrGetScreenInfo (& si) ;
  178.     SDL_Visual.bpp = si.bpp ;
  179.     // GetVideoMode
  180.     SDL_modelist = (SDL_Rect **) malloc (sizeof (SDL_Rect *) * 2) ;
  181.     if (SDL_modelist) {
  182.         SDL_modelist [0] = (SDL_Rect *) malloc (sizeof(SDL_Rect)) ;
  183.         if (SDL_modelist [0]) {
  184.             SDL_modelist [0] -> x = 0 ;
  185.             SDL_modelist [0] -> y = 0 ;
  186.             SDL_modelist [0] -> w = si.cols ;
  187.             SDL_modelist [0] -> h = si.rows ;
  188.         }
  189.         SDL_modelist [1] = NULL ;
  190.     }
  191. #ifdef NANOX_PIXEL_RGB
  192.     pixel_type = MWPF_RGB ;
  193.     SDL_Visual.red_mask   = 0x000000FF ;
  194.     SDL_Visual.green_mask = 0x0000FF00 ;
  195.     SDL_Visual.blue_mask  = 0x00FF0000 ;
  196. #endif
  197. #ifdef NANOX_PIXEL_0888
  198.     pixel_type = MWPF_TRUECOLOR0888 ;
  199.     SDL_Visual.red_mask   = 0x00FF0000 ;
  200.     SDL_Visual.green_mask = 0x0000FF00 ;
  201.     SDL_Visual.blue_mask  = 0x000000FF ;
  202. #endif
  203. #ifdef NANOX_PIXEL_888
  204.     pixel_type = MWPF_TRUECOLOR888 ;
  205.     SDL_Visual.red_mask   = 0xFF0000 ;
  206.     SDL_Visual.green_mask = 0x00FF00 ;
  207.     SDL_Visual.blue_mask  = 0x0000FF ;
  208. #endif
  209. #ifdef NANOX_PIXEL_565
  210.     pixel_type = MWPF_TRUECOLOR565 ;
  211.     SDL_Visual.red_mask   = 0xF800 ;
  212.     SDL_Visual.green_mask = 0x07E0 ;
  213.     SDL_Visual.blue_mask  = 0x001F ;
  214. #endif
  215. #ifdef NANOX_PIXEL_555
  216.     pixel_type = MWPF_TRUECOLOR555 ;
  217.     SDL_Visual.red_mask   = 0x7C00 ;
  218.     SDL_Visual.green_mask = 0x03E0 ;
  219.     SDL_Visual.blue_mask  = 0x001F ;
  220. #endif
  221. #ifdef NANOX_PIXEL_332
  222.     pixel_type = MWPF_TRUECOLOR332 ;
  223. #endif
  224. #ifdef NANOX_PIXEL_PAL
  225.     pixel_type = MWPF_PALETTE ;
  226. #endif
  227.     vformat -> BitsPerPixel = SDL_Visual.bpp ;
  228.     if (vformat -> BitsPerPixel > 8) {
  229.         vformat -> Rmask = SDL_Visual.red_mask ;
  230.         vformat -> Gmask = SDL_Visual.green_mask ;
  231.         vformat -> Bmask = SDL_Visual.blue_mask ;
  232.     }
  233.     // See if we have been passed a window to use
  234.     SDL_windowid = getenv ("SDL_WINDOWID") ;
  235.     
  236.     // Create the fullscreen (and managed windows : no implement)
  237.     create_aux_windows (this) ;
  238.     Dprintf ("leave NX_VideoInitn") ;
  239.     return 0 ;
  240. }
  241. void NX_VideoQuit (_THIS)
  242. {
  243.     Dprintf ("enter NX_VideoQuitn") ;
  244.     // Start shutting down the windows
  245.     NX_DestroyImage (this, this -> screen) ;
  246.     NX_DestroyWindow (this, this -> screen) ;
  247.     if (FSwindow && FSwindow != GR_ROOT_WINDOW_ID) {
  248.         GrDestroyWindow (FSwindow) ;
  249.     }
  250.     NX_FreeVideoModes (this) ;
  251.     free (GammaRamp_R) ;
  252.     free (GammaRamp_G) ;
  253.     free (GammaRamp_B) ;
  254.     GrClose () ;
  255.     Dprintf ("leave NX_VideoQuitn") ;
  256. }
  257. static void NX_DestroyWindow (_THIS, SDL_Surface * screen)
  258. {
  259.     Dprintf ("enter NX_DestroyWindown") ;
  260.     if (! SDL_windowid) {
  261.         if (screen && (screen -> flags & SDL_FULLSCREEN)) {
  262.             screen -> flags &= ~ SDL_FULLSCREEN ;
  263.             NX_LeaveFullScreen (this) ;
  264.         }
  265.         // Destroy the output window
  266.         if (SDL_Window && SDL_Window != GR_ROOT_WINDOW_ID) {
  267.             GrDestroyWindow (SDL_Window) ;
  268.         }
  269.     }
  270.     
  271.     // Free the graphics context
  272.     if (! SDL_GC) {
  273.         GrDestroyGC (SDL_GC) ;
  274.         SDL_GC = 0;
  275.     }
  276.     Dprintf ("leave NX_DestroyWindown") ;
  277. }
  278. static int NX_CreateWindow (_THIS, SDL_Surface * screen,
  279.                 int w, int h, int bpp, Uint32 flags)
  280. {
  281.     Dprintf ("enter NX_CreateWindown") ;
  282.     // If a window is already present, destroy it and start fresh
  283.     if (SDL_Window && SDL_Window != GR_ROOT_WINDOW_ID) {
  284.         NX_DestroyWindow (this, screen) ;
  285.     }
  286.     // See if we have been given a window id
  287.     if (SDL_windowid) {
  288.         SDL_Window = strtol (SDL_windowid, NULL, 0) ;
  289.     } else {
  290.         SDL_Window = 0 ;
  291.     }
  292.     
  293.     if ( ! SDL_ReallocFormat (screen, bpp, SDL_Visual.red_mask, 
  294.         SDL_Visual.green_mask, SDL_Visual.blue_mask, 0))
  295.         return -1;
  296.     // Create (or use) the nanox display window
  297.     if (! SDL_windowid) {
  298.         SDL_Window = GrNewWindow (GR_ROOT_WINDOW_ID, 0, 0, w, h, 0, BLACK, WHITE) ;
  299.         GrSelectEvents (SDL_Window, (GR_EVENT_MASK_EXPOSURE       |
  300.             GR_EVENT_MASK_BUTTON_DOWN  | GR_EVENT_MASK_BUTTON_UP  |
  301.             GR_EVENT_MASK_FOCUS_IN     | GR_EVENT_MASK_FOCUS_OUT  |
  302.             GR_EVENT_MASK_KEY_DOWN     | GR_EVENT_MASK_KEY_UP     |
  303.             GR_EVENT_MASK_MOUSE_ENTER  | GR_EVENT_MASK_MOUSE_EXIT |
  304.             GR_EVENT_MASK_MOUSE_MOTION | GR_EVENT_MASK_UPDATE     |
  305.             GR_EVENT_MASK_CLOSE_REQ)) ;
  306.     }
  307.     
  308.     /* Create the graphics context here, once we have a window */
  309.     SDL_GC = GrNewGC () ;
  310.     if (SDL_GC == 0) {
  311.         SDL_SetError("Couldn't create graphics context");
  312.         return(-1);
  313.     }
  314.     // Map them both and go fullscreen, if requested
  315.     if (! SDL_windowid) {
  316.         GrMapWindow (SDL_Window) ;
  317.         if (flags & SDL_FULLSCREEN) {
  318.             screen -> flags |= SDL_FULLSCREEN ;
  319.             NX_EnterFullScreen (this) ;
  320.         } else {
  321.             screen -> flags &= ~ SDL_FULLSCREEN ;
  322.         }
  323.     }
  324.     Dprintf ("leave NX_CreateWindown") ;
  325.     return 0 ;
  326. }
  327. SDL_Surface * NX_SetVideoMode (_THIS, SDL_Surface * current,
  328.                 int width, int height, int bpp, Uint32 flags)
  329. {
  330.     Dprintf ("enter NX_SetVideoModen") ;
  331.     // Lock the event thread, in multi-threading environments
  332.     SDL_Lock_EventThread () ;
  333.     bpp = SDL_Visual.bpp ;
  334.     if (NX_CreateWindow (this, current, width, height, bpp, flags) < 0) {
  335.         current = NULL;
  336.         goto done;
  337.     }
  338.     if (current -> w != width || current -> h != height) {
  339.         current -> w = width ;
  340.         current -> h = height ;
  341.         current -> pitch = SDL_CalculatePitch (current) ;
  342.         NX_ResizeImage (this, current, flags) ;
  343.     }
  344.     current -> flags |= (flags & (SDL_RESIZABLE | SDL_NOFRAME)) ;
  345.   done:
  346.     SDL_Unlock_EventThread () ;
  347.     Dprintf ("leave NX_SetVideoModen") ;
  348.     // We're done!
  349.     return current ;
  350. }
  351. // ncolors <= 256
  352. int NX_SetColors (_THIS, int firstcolor, int ncolors, SDL_Color * colors)
  353. {
  354.     int        i ;
  355.     GR_PALETTE pal ;
  356.     Dprintf ("enter NX_SetColorsn") ;
  357.     if (ncolors > 256) return 0 ;
  358.     
  359.     pal.count = ncolors ;
  360.     for (i = 0; i < ncolors; ++ i) {
  361.         pal.palette [i].r = colors [i].r ;
  362.         pal.palette [i].g = colors [i].g ;
  363.         pal.palette [i].b = colors [i].b ;
  364.     }
  365.     GrSetSystemPalette (firstcolor, & pal) ;
  366.     Dprintf ("leave NX_SetColorsn") ;
  367.     return 1 ;
  368. }
  369. static int NX_ToggleFullScreen (_THIS, int on)
  370. {
  371.     SDL_Rect rect ;
  372.     Uint32   event_thread ;
  373.     
  374.     Dprintf ("enter NX_ToggleFullScreenn") ;
  375.     // Don't switch if we don't own the window
  376.     if (SDL_windowid) return 0 ;
  377.     
  378.     // Don't lock if we are the event thread
  379.     event_thread = SDL_EventThreadID () ;
  380.     if (event_thread && (SDL_ThreadID () == event_thread)) {
  381.         event_thread = 0 ;
  382.     }
  383.     if (event_thread) {
  384.         SDL_Lock_EventThread() ;
  385.     }
  386.     
  387.     if (on) {
  388.         NX_EnterFullScreen (this) ;
  389.     } else {
  390.         this -> screen -> flags &= ~ SDL_FULLSCREEN ;
  391.         NX_LeaveFullScreen (this) ;
  392.     }
  393.     rect.x = rect.y = 0 ;
  394.     rect.w = this -> screen -> w, rect.h = this -> screen -> h ;
  395.     NX_NormalUpdate (this, 1, & rect) ;
  396.     if (event_thread) {
  397.         SDL_Unlock_EventThread () ;
  398.     }
  399.     
  400.     Dprintf ("leave NX_ToggleFullScreenn") ;
  401.     return 1 ;
  402. }
  403. // Update the current mouse state and position
  404. static void NX_UpdateMouse (_THIS)
  405. {
  406.     int            x, y ;
  407.     GR_WINDOW_INFO info ;
  408.     GR_SCREEN_INFO si ;
  409.     Dprintf ("enter NX_UpdateMousen") ;
  410.     // Lock the event thread, in multi-threading environments
  411.     SDL_Lock_EventThread () ;
  412.     
  413.     GrGetScreenInfo (& si) ;
  414.     GrGetWindowInfo (SDL_Window, & info) ;
  415.     x = si.xpos - info.x ;
  416.     y = si.ypos - info.y ;
  417.     if (x >= 0 && x <= info.width && y >= 0 && y <= info.height) {
  418.         SDL_PrivateAppActive (1, SDL_APPMOUSEFOCUS) ;
  419.         SDL_PrivateMouseMotion (0, 0, x, y);
  420.     } else {
  421.         SDL_PrivateAppActive (0, SDL_APPMOUSEFOCUS) ;
  422.     }
  423.     SDL_Unlock_EventThread () ;
  424.     Dprintf ("leave NX_UpdateMousen") ;
  425. }
  426. static int NX_SetGammaRamp (_THIS, Uint16 * ramp)
  427. {
  428.     int i ;
  429.     Uint16 * red, * green, * blue ;
  430.     
  431.     Dprintf ("enter NX_SetGammaRampn") ;
  432.     
  433.     if (SDL_Visual.bpp != 32 && SDL_Visual.bpp != 24) return -1 ;
  434.     if (! GammaRamp_R) GammaRamp_R = (Uint16 *) malloc (sizeof (Uint16) * CI_SIZE) ;
  435.     if (! GammaRamp_G) GammaRamp_G = (Uint16 *) malloc (sizeof (Uint16) * CI_SIZE) ;
  436.     if (! GammaRamp_B) GammaRamp_B = (Uint16 *) malloc (sizeof (Uint16) * CI_SIZE) ;
  437.     if ((! GammaRamp_R) || (! GammaRamp_G) || (! GammaRamp_B)) {
  438.         SDL_OutOfMemory () ;
  439.         return -1 ;
  440.     }
  441.     for (i = 0; i < CI_SIZE; ++ i)
  442.         GammaRamp_R [i] = GammaRamp_G [i] = GammaRamp_B [i] = i ;
  443.     red   = ramp ;
  444.     green = ramp + CI_SIZE ;
  445.     blue  = green + CI_SIZE ;
  446.         
  447.     for (i = 0; i < CI_SIZE; ++ i) {
  448.         GammaRamp_R [i] = red   [i] ;
  449.         GammaRamp_G [i] = green [i] ;
  450.         GammaRamp_B [i] = blue  [i] ;
  451.     }
  452.     Dprintf ("leave NX_SetGammaRampn") ;   
  453.     return 0 ;
  454. }
  455. static int NX_GetGammaRamp (_THIS, Uint16 * ramp)
  456. {
  457.     int i ;
  458.     Uint16 * red, * green, * blue ;
  459.     Dprintf ("enter NX_GetGammaRampn") ;   
  460.     if (SDL_Visual.bpp != 32 && SDL_Visual.bpp != 24) return -1 ;
  461.     red   = ramp ;
  462.     green = ramp  + CI_SIZE ;
  463.     blue  = green + CI_SIZE ;
  464.     if (GammaRamp_R && GammaRamp_G && GammaRamp_B) {
  465.         for (i = 0; i < CI_SIZE; ++ i) {
  466.             red   [i] = GammaRamp_R [i] ;
  467.             green [i] = GammaRamp_G [i] ;
  468.             blue  [i] = GammaRamp_B [i] ;
  469.         }
  470.     } else {
  471.         for (i = 0; i < CI_SIZE; ++ i)
  472.             red [i] = green [i] = blue [i] = i ;
  473.     }
  474.     Dprintf ("leave NX_GetGammaRampn") ;
  475.     return 0 ;
  476. }