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

流媒体/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_nullvideo.c,v 1.3 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. /* Dummy SDL video driver implementation; this is just enough to make an
  23.  *  SDL-based application THINK it's got a working video driver, for
  24.  *  applications that call SDL_Init(SDL_INIT_VIDEO) when they don't need it,
  25.  *  and also for use as a collection of stubs when porting SDL to a new
  26.  *  platform for which you haven't yet written a valid video driver.
  27.  *
  28.  * This is also a great way to determine bottlenecks: if you think that SDL
  29.  *  is a performance problem for a given platform, enable this driver, and
  30.  *  then see if your application runs faster without video overhead.
  31.  *
  32.  * Initial work by Ryan C. Gordon (icculus@linuxgames.com). A good portion
  33.  *  of this was cut-and-pasted from Stephane Peter's work in the AAlib
  34.  *  SDL video driver.  Renamed to "DUMMY" by Sam Lantinga.
  35.  */
  36. #include <stdio.h>
  37. #include <stdlib.h>
  38. #include <string.h>
  39. #include "SDL.h"
  40. #include "SDL_error.h"
  41. #include "SDL_video.h"
  42. #include "SDL_mouse.h"
  43. #include "SDL_sysvideo.h"
  44. #include "SDL_pixels_c.h"
  45. #include "SDL_events_c.h"
  46. #include "SDL_nullvideo.h"
  47. #include "SDL_nullevents_c.h"
  48. #include "SDL_nullmouse_c.h"
  49. #define DUMMYVID_DRIVER_NAME "dummy"
  50. /* Initialization/Query functions */
  51. static int DUMMY_VideoInit(_THIS, SDL_PixelFormat *vformat);
  52. static SDL_Rect **DUMMY_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
  53. static SDL_Surface *DUMMY_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
  54. static int DUMMY_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors);
  55. static void DUMMY_VideoQuit(_THIS);
  56. /* Hardware surface functions */
  57. static int DUMMY_AllocHWSurface(_THIS, SDL_Surface *surface);
  58. static int DUMMY_LockHWSurface(_THIS, SDL_Surface *surface);
  59. static void DUMMY_UnlockHWSurface(_THIS, SDL_Surface *surface);
  60. static void DUMMY_FreeHWSurface(_THIS, SDL_Surface *surface);
  61. /* etc. */
  62. static void DUMMY_UpdateRects(_THIS, int numrects, SDL_Rect *rects);
  63. /* DUMMY driver bootstrap functions */
  64. static int DUMMY_Available(void)
  65. {
  66. const char *envr = getenv("SDL_VIDEODRIVER");
  67. if ((envr) && (strcmp(envr, DUMMYVID_DRIVER_NAME) == 0)) {
  68. return(1);
  69. }
  70. return(0);
  71. }
  72. static void DUMMY_DeleteDevice(SDL_VideoDevice *device)
  73. {
  74. free(device->hidden);
  75. free(device);
  76. }
  77. static SDL_VideoDevice *DUMMY_CreateDevice(int devindex)
  78. {
  79. SDL_VideoDevice *device;
  80. /* Initialize all variables that we clean on shutdown */
  81. device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
  82. if ( device ) {
  83. memset(device, 0, (sizeof *device));
  84. device->hidden = (struct SDL_PrivateVideoData *)
  85. malloc((sizeof *device->hidden));
  86. }
  87. if ( (device == NULL) || (device->hidden == NULL) ) {
  88. SDL_OutOfMemory();
  89. if ( device ) {
  90. free(device);
  91. }
  92. return(0);
  93. }
  94. memset(device->hidden, 0, (sizeof *device->hidden));
  95. /* Set the function pointers */
  96. device->VideoInit = DUMMY_VideoInit;
  97. device->ListModes = DUMMY_ListModes;
  98. device->SetVideoMode = DUMMY_SetVideoMode;
  99. device->CreateYUVOverlay = NULL;
  100. device->SetColors = DUMMY_SetColors;
  101. device->UpdateRects = DUMMY_UpdateRects;
  102. device->VideoQuit = DUMMY_VideoQuit;
  103. device->AllocHWSurface = DUMMY_AllocHWSurface;
  104. device->CheckHWBlit = NULL;
  105. device->FillHWRect = NULL;
  106. device->SetHWColorKey = NULL;
  107. device->SetHWAlpha = NULL;
  108. device->LockHWSurface = DUMMY_LockHWSurface;
  109. device->UnlockHWSurface = DUMMY_UnlockHWSurface;
  110. device->FlipHWSurface = NULL;
  111. device->FreeHWSurface = DUMMY_FreeHWSurface;
  112. device->SetCaption = NULL;
  113. device->SetIcon = NULL;
  114. device->IconifyWindow = NULL;
  115. device->GrabInput = NULL;
  116. device->GetWMInfo = NULL;
  117. device->InitOSKeymap = DUMMY_InitOSKeymap;
  118. device->PumpEvents = DUMMY_PumpEvents;
  119. device->free = DUMMY_DeleteDevice;
  120. return device;
  121. }
  122. VideoBootStrap DUMMY_bootstrap = {
  123. DUMMYVID_DRIVER_NAME, "SDL dummy video driver",
  124. DUMMY_Available, DUMMY_CreateDevice
  125. };
  126. int DUMMY_VideoInit(_THIS, SDL_PixelFormat *vformat)
  127. {
  128. fprintf(stderr, "WARNING: You are using the SDL dummy video driver!n");
  129. /* Determine the screen depth (use default 8-bit depth) */
  130. /* we change this during the SDL_SetVideoMode implementation... */
  131. vformat->BitsPerPixel = 8;
  132. vformat->BytesPerPixel = 1;
  133. /* We're done! */
  134. return(0);
  135. }
  136. SDL_Rect **DUMMY_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
  137. {
  138.      return (SDL_Rect **) -1;
  139. }
  140. SDL_Surface *DUMMY_SetVideoMode(_THIS, SDL_Surface *current,
  141. int width, int height, int bpp, Uint32 flags)
  142. {
  143. if ( this->hidden->buffer ) {
  144. free( this->hidden->buffer );
  145. }
  146. this->hidden->buffer = malloc(width * height * (bpp / 8));
  147. if ( ! this->hidden->buffer ) {
  148. SDL_SetError("Couldn't allocate buffer for requested mode");
  149. return(NULL);
  150. }
  151. /*  printf("Setting mode %dx%dn", width, height); */
  152. memset(this->hidden->buffer, 0, width * height * (bpp / 8));
  153. /* Allocate the new pixel format for the screen */
  154. if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) {
  155. free(this->hidden->buffer);
  156. this->hidden->buffer = NULL;
  157. SDL_SetError("Couldn't allocate new pixel format for requested mode");
  158. return(NULL);
  159. }
  160. /* Set up the new mode framebuffer */
  161. current->flags = flags & SDL_FULLSCREEN;
  162. this->hidden->w = current->w = width;
  163. this->hidden->h = current->h = height;
  164. current->pitch = current->w * (bpp / 8);
  165. current->pixels = this->hidden->buffer;
  166. /* We're done */
  167. return(current);
  168. }
  169. /* We don't actually allow hardware surfaces other than the main one */
  170. static int DUMMY_AllocHWSurface(_THIS, SDL_Surface *surface)
  171. {
  172. return(-1);
  173. }
  174. static void DUMMY_FreeHWSurface(_THIS, SDL_Surface *surface)
  175. {
  176. return;
  177. }
  178. /* We need to wait for vertical retrace on page flipped displays */
  179. static int DUMMY_LockHWSurface(_THIS, SDL_Surface *surface)
  180. {
  181. return(0);
  182. }
  183. static void DUMMY_UnlockHWSurface(_THIS, SDL_Surface *surface)
  184. {
  185. return;
  186. }
  187. static void DUMMY_UpdateRects(_THIS, int numrects, SDL_Rect *rects)
  188. {
  189. /* do nothing. */
  190. }
  191. int DUMMY_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
  192. {
  193. /* do nothing of note. */
  194. return(1);
  195. }
  196. /* Note:  If we are terminated, this could be called in the middle of
  197.    another SDL video routine -- notably UpdateRects.
  198. */
  199. void DUMMY_VideoQuit(_THIS)
  200. {
  201. if (this->screen->pixels != NULL)
  202. {
  203. free(this->screen->pixels);
  204. this->screen->pixels = NULL;
  205. }
  206. }