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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_ph_modes.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. #include "SDL_ph_modes_c.h"
  23. static unsigned long key1, key2;
  24. static PgVideoModeInfo_t mode_info;
  25. static PgVideoModes_t mode_list;
  26.   /* The current list of available video modes */
  27. SDL_Rect  SDL_modelist[PH_MAX_VIDEOMODES];
  28. SDL_Rect* SDL_modearray[PH_MAX_VIDEOMODES];
  29. static int compare_modes_by_res(const void* mode1, const void* mode2)
  30. {
  31. if (PgGetVideoModeInfo(*(unsigned short*)mode1, &mode_info) < 0)
  32. {
  33.     fprintf(stderr,"error: In compare_modes_by_res PgGetVideoModeInfo failed on mode: 0x%xn",
  34.              *(unsigned short*)mode1);
  35.          return 0;
  36. }
  37. key1 = mode_info.width * mode_info.height;
  38. if (PgGetVideoModeInfo(*(unsigned short*)mode2, &mode_info) < 0)
  39. {
  40.          fprintf(stderr,"error: In compare_modes_by_res PgGetVideoModeInfo failed on mode: 0x%xn",
  41.             *(unsigned short*)mode2);
  42.     return 0;
  43. }
  44.         key2 = mode_info.width * mode_info.height;
  45. if (key1 > key2)
  46. return 1;
  47. else if (key1 == key2)
  48. return 0;
  49. else
  50. return -1;
  51. }
  52. SDL_Rect **ph_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
  53. {
  54.     int i = 0;
  55.     int j = 0;
  56.     SDL_Rect Amodelist[PH_MAX_VIDEOMODES];
  57.     for (i=0; i<PH_MAX_VIDEOMODES; i++)
  58.     {
  59.         SDL_modearray[i]=&SDL_modelist[i];
  60.     }
  61.     if (PgGetVideoModeList( &mode_list ) < 0)
  62.     {
  63.        fprintf(stderr,"error: PgGetVideoModeList failedn");
  64.        return NULL;
  65.     }
  66.     mode_info.bits_per_pixel = 0;
  67.     for (i=0; i < mode_list.num_modes; i++) 
  68.     {
  69.         if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
  70.         {
  71.             fprintf(stderr,"error: PgGetVideoModeInfo failed on mode: 0x%xn", mode_list.modes[i]);
  72.             return NULL;
  73.         }
  74.         if(mode_info.bits_per_pixel == format->BitsPerPixel)
  75.         {
  76.             Amodelist[j].w = mode_info.width;
  77.             Amodelist[j].h = mode_info.height;
  78.             Amodelist[j].x = 0;
  79.             Amodelist[j].y = 0;
  80.             j++;
  81.         }
  82.     }
  83.     /* reorder biggest for smallest, assume width dominates */
  84.     for(i=0; i<j; i++)
  85.     {
  86.         SDL_modelist[i].w = Amodelist[j - i -1].w;
  87.         SDL_modelist[i].h = Amodelist[j - i -1].h;
  88.         SDL_modelist[i].x = Amodelist[j - i -1].x;
  89.         SDL_modelist[i].y = Amodelist[j - i -1].y;
  90.     }
  91.     SDL_modearray[j]=NULL;
  92.     return SDL_modearray;
  93. }
  94. void ph_FreeVideoModes(_THIS)
  95. {
  96.    return;
  97. }
  98. #if 0
  99. static void set_best_resolution(_THIS, int width, int height)
  100. {
  101.     /* warning ! dead variable use_vidmode ! */
  102.     if ( use_vidmode ) {
  103. PgDisplaySettings_t  settings;
  104. PgVideoModeInfo_t current_mode_info;
  105. PgHWCaps_t my_hwcaps;
  106. unsigned short current_bpp;
  107.         int i;
  108. /*
  109. if (PgGetVideoMode( &settings ) < 0)
  110. {
  111. fprintf(stderr,"error: PgGetVideoMode failedn");
  112. return;
  113. }
  114. if (PgGetVideoModeInfo( settings.mode, &current_mode_info ) < 0)
  115. {
  116. fprintf(stderr,"error: PgGetVideoModeInfo failedn");
  117. return;
  118. }
  119. */
  120. //lu_zero 
  121.          if (PgGetGraphicsHWCaps(&my_hwcaps) < 0)
  122.           {
  123.                 fprintf(stderr,"set_best_resolution:  GetGraphicsHWCaps failed!! n");
  124.        //that HAVE to work
  125.             }
  126.          if (PgGetVideoModeInfo(my_hwcaps.current_video_mode, &current_mode_info) < 0)
  127.             {
  128.                 fprintf(stderr,"set_best_resolution:  PgGetVideoModeInfo failedn");
  129.             }
  130. current_bpp = current_mode_info.bits_per_pixel;
  131.         if (PgGetVideoModeList(&mode_list) >= 0)
  132. {
  133. qsort(mode_list.modes, mode_list.num_modes, sizeof(unsigned short), compare_modes_by_res);
  134. #ifdef PH_DEBUG
  135.    printf("Available modes:n");
  136.    for ( i = 0; i < mode_list.num_modes; ++i ) 
  137. {
  138. PgGetVideoModeInfo(mode_list.modes[i], &mode_info);
  139.      printf("Mode %d: %dx%dn", i, mode_info.width, mode_info.height);
  140.    }
  141. #endif
  142.             for ( i = mode_list.num_modes-1; i >= 0 ; --i ) 
  143. {
  144. if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
  145. {
  146. fprintf(stderr,"error: PgGetVideoModeInfo failedn");
  147. }
  148.                 if ( (mode_info.width >= width) &&
  149.                      (mode_info.height >= height) &&
  150.  (mode_info.bits_per_pixel == current_bpp) )
  151.                     break;
  152.             }
  153. if (i >= 0)
  154. {
  155.                 if ( (mode_info.width != current_mode_info.width) ||
  156.                      (mode_info.height != current_mode_info.height) ) 
  157. {
  158. settings.mode = mode_list.modes[i];
  159. if(PgSetVideoMode( &settings ) < 0)
  160. {
  161. fprintf(stderr,"error: PgSetVideoMode failedn");
  162. }
  163.                 }
  164.             }
  165.         }
  166.     }
  167. }
  168. int ph_ResizeFullScreen(_THIS)
  169. {
  170.     if (currently_fullscreen)
  171.     {
  172.         set_best_resolution(this, current_w, current_h);
  173.     }
  174.     return (1);
  175. }
  176. #endif /* 0 */
  177. /* return the mode associated with width, height and bpp */
  178. /* if there is no mode then zero is returned             */
  179. int get_mode(int width, int height, int bpp)
  180. {
  181.     int i;
  182.     if(width<640)
  183.     {
  184.         width=640;
  185.     }
  186.     if(height<480)
  187.     {
  188.         height=480;
  189.     }
  190.     if (PgGetVideoModeList(&mode_list) < 0)
  191.     {
  192.         fprintf(stderr,"error: PgGetVideoModeList failedn");
  193.         return -1;
  194.     }
  195.     /* search list for exact match */
  196.     for (i=0;i<mode_list.num_modes;i++)
  197.     {
  198.         if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
  199.         {
  200.             fprintf(stderr,"error: PgGetVideoModeInfo failedn");
  201.             return 0;
  202.         }
  203.         if ((mode_info.width == width) && 
  204.             (mode_info.height == height) && 
  205.             (mode_info.bits_per_pixel == bpp))
  206.         {
  207.             return mode_list.modes[i];
  208.         }
  209.     }
  210.     return (i == mode_list.num_modes) ? 0 : mode_list.modes[i];
  211. }
  212. int get_mode_any_format(int width, int height, int bpp)
  213. /* return the mode associated with width, height and bpp */
  214. /* if requested bpp is not found the mode with closest bpp is returned */
  215. {
  216.     int i, closest, delta, min_delta;
  217. if (PgGetVideoModeList( &mode_list ) < 0)
  218. {
  219.     fprintf(stderr,"error: PgGetVideoModeList failedn");
  220.     return -1;
  221. }
  222. qsort(mode_list.modes, mode_list.num_modes, sizeof(unsigned short), compare_modes_by_res);
  223. for(i=0;i<mode_list.num_modes;i++)
  224. {
  225.        if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
  226.        {
  227.            fprintf(stderr,"error: PgGetVideoModeInfo failedn");
  228.            return 0;
  229.        }
  230.        if ((mode_info.width == width) &&
  231.            (mode_info.height == height))
  232.            break;
  233. }
  234. if (i<mode_list.num_modes)
  235. {
  236. /* get closest bpp */
  237. closest = i++;
  238. if (mode_info.bits_per_pixel == bpp)
  239. return mode_list.modes[ closest ];
  240. min_delta = abs(mode_info.bits_per_pixel - bpp);
  241. while(1)
  242. {
  243. if (PgGetVideoModeInfo(mode_list.modes[i], &mode_info) < 0)
  244. {
  245.     fprintf(stderr,"error: PgGetVideoModeInfo failedn");
  246.     return 0;
  247. }
  248. if ((mode_info.width != width) ||
  249. (mode_info.height != height))
  250. break;
  251. else if (mode_info.bits_per_pixel == bpp)
  252. {
  253. closest = i;
  254. break;
  255. }
  256. else
  257. {
  258. delta = abs(mode_info.bits_per_pixel - bpp);
  259. if (delta < min_delta)
  260. {
  261. closest = i;
  262. min_delta = delta;
  263. }
  264. i++;
  265. }
  266. }
  267. return mode_list.modes[ closest ];
  268. }
  269. else
  270.     return 0;
  271. }
  272. void ph_WaitMapped(_THIS);
  273. void ph_WaitUnmapped(_THIS);
  274. void ph_QueueEnterFullScreen(_THIS);
  275. int ph_ToggleFullScreen(_THIS, int on)
  276. {
  277.     if (currently_fullscreen)
  278.     {
  279.         return ph_LeaveFullScreen(this);
  280.     }
  281.     else
  282.     {
  283.         return ph_EnterFullScreen(this);
  284.     }
  285.       
  286.     return 0;     
  287. }
  288. int ph_EnterFullScreen(_THIS)
  289. {
  290.     if (!currently_fullscreen)
  291.     {
  292.         if (this->screen)
  293.         {
  294.             if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
  295.             {
  296. #ifdef HAVE_OPENGL
  297. #endif /* HAVE_OPENGL */
  298.                 return 0;
  299.             }
  300.         }
  301.         if (OCImage.direct_context == NULL)
  302.         {
  303.             OCImage.direct_context=(PdDirectContext_t*)PdCreateDirectContext();
  304.         }
  305.         if (!OCImage.direct_context)
  306.         {
  307.             fprintf(stderr, "ph_EnterFullScreen: Can't create direct contextn" );
  308.         }
  309.         PdDirectStart(OCImage.direct_context);
  310.         currently_fullscreen = 1;
  311.     }
  312.     return 1;
  313. }
  314. int ph_LeaveFullScreen(_THIS)
  315. {
  316.     PgDisplaySettings_t mymode_settings;
  317.        
  318.     if (currently_fullscreen)
  319.     {
  320.         if ((this->screen->flags & SDL_OPENGL)==SDL_OPENGL)
  321.         {
  322. #ifdef HAVE_OPENGL
  323. #endif /* HAVE_OPENGL */
  324.            return 0;
  325.         }
  326.         else
  327.         {
  328.             PdDirectStop(OCImage.direct_context);
  329.             PdReleaseDirectContext(OCImage.direct_context);
  330.             
  331.             currently_fullscreen=0;
  332.             /* Restore old video mode */
  333.             if (old_video_mode != -1)
  334.             {
  335.                 mymode_settings.mode= (unsigned short) old_video_mode;
  336.                 mymode_settings.refresh= (unsigned short) old_refresh_rate;
  337.                 mymode_settings.flags= 0;
  338.                 
  339.                 if (PgSetVideoMode(&mymode_settings) < 0)
  340.                 {
  341.                     fprintf(stderr,"error: PgSetVideoMode failedn");
  342.                 }
  343.             }
  344.             old_video_mode=-1;
  345.             old_refresh_rate=-1;
  346.         }
  347.     }
  348.     return 1;
  349. }