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

流媒体/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_ggivideo.c,v 1.4 2002/04/22 21:38:05 wmay Exp $";
  21. #endif
  22. /* GGI-based SDL video driver implementation.
  23. */
  24. #include <stdlib.h>
  25. #include <stdio.h>
  26. #include <fcntl.h>
  27. #include <unistd.h>
  28. #include <sys/mman.h>
  29. #include <ggi/ggi.h>
  30. #include <ggi/gii.h>
  31. #include "SDL.h"
  32. #include "SDL_error.h"
  33. #include "SDL_video.h"
  34. #include "SDL_mouse.h"
  35. #include "SDL_sysvideo.h"
  36. #include "SDL_pixels_c.h"
  37. #include "SDL_events_c.h"
  38. #include "SDL_ggivideo.h"
  39. #include "SDL_ggimouse_c.h"
  40. #include "SDL_ggievents_c.h"
  41. struct private_hwdata
  42. {
  43. ggi_visual_t vis;
  44. };
  45. ggi_visual_t VIS;
  46. /* Initialization/Query functions */
  47. static int GGI_VideoInit(_THIS, SDL_PixelFormat *vformat);
  48. static SDL_Rect **GGI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags);
  49. static SDL_Surface *GGI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags);
  50. static int GGI_SetColors(_THIS, int firstcolor, int ncolors,
  51.  SDL_Color *colors);
  52. static void GGI_VideoQuit(_THIS);
  53. /* Hardware surface functions */
  54. static int GGI_AllocHWSurface(_THIS, SDL_Surface *surface);
  55. static int GGI_LockHWSurface(_THIS, SDL_Surface *surface);
  56. static void GGI_UnlockHWSurface(_THIS, SDL_Surface *surface);
  57. static void GGI_FreeHWSurface(_THIS, SDL_Surface *surface);
  58. /* GGI driver bootstrap functions */
  59. static int GGI_Available(void)
  60. {
  61. ggi_visual_t *vis;
  62. vis = NULL;
  63. if (ggiInit() == 0) {
  64. vis = ggiOpen(NULL);
  65. if (vis != NULL) {
  66. ggiClose(vis);
  67. }
  68. }
  69. return (vis != NULL);
  70. }
  71. static void GGI_DeleteDevice(SDL_VideoDevice *device)
  72. {
  73. free(device->hidden);
  74. free(device);
  75. }
  76. static SDL_VideoDevice *GGI_CreateDevice(int devindex)
  77. {
  78. SDL_VideoDevice *device;
  79. /* Initialize all variables that we clean on shutdown */
  80. device = (SDL_VideoDevice *)malloc(sizeof(SDL_VideoDevice));
  81. if ( device ) {
  82. memset(device, 0, (sizeof *device));
  83. device->hidden = (struct SDL_PrivateVideoData *)
  84. malloc((sizeof *device->hidden));
  85. }
  86. if ( (device == NULL) || (device->hidden == NULL) ) {
  87. SDL_OutOfMemory();
  88. if ( device ) {
  89. free(device);
  90. }
  91. return(0);
  92. }
  93. memset(device->hidden, 0, (sizeof *device->hidden));
  94. /* Set the function pointers */
  95. device->VideoInit = GGI_VideoInit;
  96. device->ListModes = GGI_ListModes;
  97. device->SetVideoMode = GGI_SetVideoMode;
  98. device->SetColors = GGI_SetColors;
  99. device->UpdateRects = NULL;
  100. device->VideoQuit = GGI_VideoQuit;
  101. device->AllocHWSurface = GGI_AllocHWSurface;
  102. device->CheckHWBlit = NULL;
  103. device->FillHWRect = NULL;
  104. device->SetHWColorKey = NULL;
  105. device->SetHWAlpha = NULL;
  106. device->LockHWSurface = GGI_LockHWSurface;
  107. device->UnlockHWSurface = GGI_UnlockHWSurface;
  108. device->FlipHWSurface = NULL;
  109. device->FreeHWSurface = GGI_FreeHWSurface;
  110. device->SetCaption = NULL;
  111. device->SetIcon = NULL;
  112. device->IconifyWindow = NULL;
  113. device->GrabInput = NULL;
  114. device->GetWMInfo = NULL;
  115. device->InitOSKeymap = GGI_InitOSKeymap;
  116. device->PumpEvents = GGI_PumpEvents;
  117. device->free = GGI_DeleteDevice;
  118. return device;
  119. }
  120. VideoBootStrap GGI_bootstrap = {
  121. "ggi", "General Graphics Interface (GGI)",
  122. GGI_Available, GGI_CreateDevice
  123. };
  124. static SDL_Rect video_mode;
  125. static SDL_Rect *SDL_modelist[4] = { NULL, NULL, NULL, NULL };
  126. int GGI_VideoInit(_THIS, SDL_PixelFormat *vformat)
  127. {
  128. ggi_mode mode =
  129. {
  130. 1,
  131. { GGI_AUTO, GGI_AUTO },
  132. { GGI_AUTO, GGI_AUTO },
  133. { 0, 0 },
  134. GT_AUTO,
  135. { GGI_AUTO, GGI_AUTO }
  136. };
  137. struct private_hwdata *priv;
  138. ggi_color pal[256], map[256];
  139. const ggi_directbuffer *db;
  140. int err, num_bufs;
  141. ggi_pixel white, black;
  142. priv = malloc(sizeof(struct private_hwdata));
  143. if (priv == NULL)
  144. {
  145. SDL_SetError("Unhandled GGI mode type!n");
  146. GGI_VideoQuit(NULL);
  147. }
  148. if (ggiInit() != 0)
  149. {
  150. SDL_SetError("Unable to initialize GGI!n");
  151. GGI_VideoQuit(NULL);
  152. }
  153. VIS = ggiOpen(NULL);
  154. if (VIS == NULL)
  155. {
  156. SDL_SetError("Unable to open default GGI visual!n");
  157. ggiExit();
  158. GGI_VideoQuit(NULL);
  159. }
  160. ggiSetFlags(VIS, GGIFLAG_ASYNC);
  161. /* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
  162. ggiCheckMode(VIS, &mode);
  163. /* At this point we should have a valid mode - try to set it */
  164. err = ggiSetMode(VIS, &mode);
  165. /* If we couldn't set _any_ modes, something is very wrong */
  166. if (err)
  167. {
  168. SDL_SetError("Can't set a mode!n");
  169. ggiClose(VIS);
  170. ggiExit();
  171. GGI_VideoQuit(NULL);
  172. }
  173. /* Set a palette for palletized modes */
  174. if (GT_SCHEME(mode.graphtype) == GT_PALETTE)
  175. {
  176. ggiSetColorfulPalette(VIS);
  177. ggiGetPalette(VIS, 0, 1 << vformat->BitsPerPixel, pal);
  178. }
  179. /* Now we try to get the DirectBuffer info, which determines whether
  180.  * SDL can access hardware surfaces directly. */
  181. num_bufs = ggiDBGetNumBuffers(VIS);
  182. if (num_bufs > 0)
  183. {
  184. db = ggiDBGetBuffer(VIS, 0); /* Only handle one DB for now */
  185. vformat->BitsPerPixel = db->buffer.plb.pixelformat->depth;
  186. vformat->Rmask = db->buffer.plb.pixelformat->red_mask;
  187. vformat->Gmask = db->buffer.plb.pixelformat->green_mask;
  188. vformat->Bmask = db->buffer.plb.pixelformat->blue_mask;
  189. /* Fill in our hardware acceleration capabilities */
  190. this->info.wm_available = 0;
  191. this->info.hw_available = 1;
  192. this->info.video_mem = db->buffer.plb.stride * mode.virt.y;
  193. }
  194. video_mode.x = 0;
  195. video_mode.y = 0;
  196. video_mode.w = mode.virt.x;
  197. video_mode.h = mode.virt.y;
  198. SDL_modelist[((vformat->BitsPerPixel + 7) / 8) - 1] = &video_mode;
  199. /* We're done! */
  200. return(0);
  201. }
  202. static SDL_Rect **GGI_ListModes(_THIS, SDL_PixelFormat *format, Uint32 flags)
  203. {
  204. return(&SDL_modelist[((format->BitsPerPixel + 7) / 8) - 1]);
  205. }
  206. /* Various screen update functions available */
  207. static void GGI_DirectUpdate(_THIS, int numrects, SDL_Rect *rects);
  208. SDL_Surface *GGI_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags)
  209. {
  210. ggi_mode mode =
  211. {
  212. 1,
  213. { GGI_AUTO, GGI_AUTO },
  214. { GGI_AUTO, GGI_AUTO },
  215. { 0, 0 },
  216. GT_AUTO,
  217. { GGI_AUTO, GGI_AUTO }
  218. };
  219.         const ggi_directbuffer *db;
  220. ggi_color pal[256];
  221. int err;
  222. fprintf(stderr, "GGI_SetVideoMode()n");
  223. mode.visible.x = mode.virt.x = width;
  224. mode.visible.y = mode.virt.y = height;
  225. /* Translate requested SDL bit depth into a GGI mode */
  226. switch (bpp)
  227. {
  228. case 1:  mode.graphtype = GT_1BIT;  break;
  229. case 2:  mode.graphtype = GT_2BIT;  break;
  230. case 4:  mode.graphtype = GT_4BIT;  break;
  231. case 8:  mode.graphtype = GT_8BIT;  break;
  232. case 15: mode.graphtype = GT_15BIT; break;
  233. case 16: mode.graphtype = GT_16BIT; break;
  234. case 24: mode.graphtype = GT_24BIT; break;
  235. case 32: mode.graphtype = GT_32BIT; break;
  236. default:
  237. SDL_SetError("Unknown SDL bit depth, using GT_AUTO....n");
  238. mode.graphtype = GT_AUTO;
  239. }
  240. /* Validate mode, autodetecting any GGI_AUTO or GT_AUTO fields */
  241. ggiCheckMode(VIS, &mode);
  242. /* At this point we should have a valid mode - try to set it */
  243. err = ggiSetMode(VIS, &mode);
  244. /* If we couldn't set _any_ modes, something is very wrong */
  245. if (err)
  246. {
  247. SDL_SetError("Can't set a mode!n");
  248. ggiClose(VIS);
  249. ggiExit();
  250. GGI_VideoQuit(NULL);
  251. }
  252. /* Set a palette for palletized modes */
  253. if (GT_SCHEME(mode.graphtype) == GT_PALETTE)
  254. {
  255. ggiSetColorfulPalette(VIS);
  256. ggiGetPalette(VIS, 0, 1 << bpp, pal);
  257. }
  258. db = ggiDBGetBuffer(VIS, 0);
  259. /* Set up the new mode framebuffer */
  260. current->flags = (SDL_FULLSCREEN | SDL_HWSURFACE);
  261. current->w = mode.virt.x;
  262. current->h = mode.virt.y;
  263. current->pitch = db->buffer.plb.stride;
  264. current->pixels = db->read;
  265. /* Set the blit function */
  266. this->UpdateRects = GGI_DirectUpdate;
  267. /* We're done */
  268. return(current);
  269. }
  270. static int GGI_AllocHWSurface(_THIS, SDL_Surface *surface)
  271. {
  272. return(-1);
  273. }
  274. static void GGI_FreeHWSurface(_THIS, SDL_Surface *surface)
  275. {
  276. return;
  277. }
  278. static int GGI_LockHWSurface(_THIS, SDL_Surface *surface)
  279. {
  280. return(0);
  281. }
  282. static void GGI_UnlockHWSurface(_THIS, SDL_Surface *surface)
  283. {
  284. return;
  285. }
  286. static void GGI_DirectUpdate(_THIS, int numrects, SDL_Rect *rects)
  287. {
  288. int i;
  289. /* ggiFlush(VIS); */
  290. for (i = 0; i < numrects; i++)
  291. {
  292. ggiFlushRegion(VIS, rects[i].x, rects[i].y, rects[i].w, rects[i].h);
  293. }
  294. return;
  295. }
  296. int GGI_SetColors(_THIS, int firstcolor, int ncolors, SDL_Color *colors)
  297. {
  298. int i;
  299. ggi_color pal[256];
  300. /* Set up the colormap */
  301. for (i = 0; i < ncolors; i++)
  302. {
  303. pal[i].r = (colors[i].r << 8) | colors[i].r;
  304. pal[i].g = (colors[i].g << 8) | colors[i].g;
  305. pal[i].b = (colors[i].b << 8) | colors[i].b;
  306. }
  307. ggiSetPalette(VIS, firstcolor, ncolors, pal);
  308. return 1;
  309. }
  310. void GGI_VideoQuit(_THIS)
  311. {
  312. }
  313. void GGI_FinalQuit(void) 
  314. {
  315. }