sdlut.c
上传用户:lijia5631
上传日期:2008-11-10
资源大小:1214k
文件大小:10k
源码类别:

视频捕捉/采集

开发平台:

MultiPlatform

  1. #include "sdlut.h"
  2. /* I like booleans */
  3. typedef int bool;
  4. #define true 1
  5. #define false 0
  6. /*
  7.  * Function pointers for storing callbacks
  8.  */
  9. bool sdlut_redisplay_necessary;
  10. void (*sdlut_active_function_ptr)   (SDL_ActiveEvent*) = NULL;
  11. void (*sdlut_display_function_ptr)  (void) = NULL;
  12. void (*sdlut_idle_function_ptr)     (void) = NULL;
  13. void (*sdlut_keyboard_function_ptr) (SDL_KeyboardEvent*) = NULL;
  14. void (*sdlut_motion_function_ptr)   (SDL_MouseMotionEvent*) = NULL;
  15. void (*sdlut_mouse_function_ptr)    (SDL_MouseButtonEvent*) = NULL;
  16. void (*sdlut_resize_function_ptr)   (SDL_ResizeEvent*) = NULL;
  17. void (*sdlut_glut_keyboard_function_ptr) (unsigned char key, 
  18.          int x, int y) = NULL;
  19. void (*sdlut_glut_mouse_function_ptr)    (int button, int state, 
  20.          int x, int y) = NULL;
  21. void (*sdlut_glut_motion_function_ptr)   (int x, int y) = NULL;
  22. void (*sdlut_glut_reshape_function_ptr)  (int w, int h) = NULL;
  23. /*
  24.  * Prototypes of SDL->GLUT event adapter functions
  25.  */
  26. static void sdlut_glut_keyboard_adapter (SDL_KeyboardEvent*);
  27. static void sdlut_glut_mouse_adapter    (SDL_MouseButtonEvent*);
  28. static void sdlut_glut_motion_adapter   (SDL_MouseMotionEvent*);
  29. static void sdlut_glut_reshape_adapter  (SDL_ResizeEvent*);
  30. /*
  31.  * SDL system initialization and window manipulation functions
  32.  */
  33. void sdlutInit ()
  34. {
  35.   if (SDL_Init(SDL_INIT_VIDEO) < 0)
  36.   {
  37.     printf("Couldn't init SDL: %sn", SDL_GetError());
  38.     return;
  39.   }
  40. #if 0
  41.   /* disable key repeating */
  42.   if ((flags & SDLUT_REPEAT) == SDLUT_REPEAT)
  43.     SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, 
  44.                         SDL_DEFAULT_REPEAT_INTERVAL);
  45.   else
  46.     SDL_EnableKeyRepeat(0, 0);
  47.   /* grab all mouse and keyboard input to window */
  48.   if ((flags & SDLUT_GRAB) == SDLUT_GRAB)
  49.     SDL_WM_GrabInput(SDL_GRAB_ON);
  50.   else
  51.     SDL_WM_GrabInput(SDL_GRAB_OFF);
  52. #endif
  53. }
  54. void sdlutInitDisplayMode (int flags)
  55. {
  56.   if ((flags & SDLUT_RGB) == SDLUT_RGB)
  57.   {
  58.     SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 4);
  59.     SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 4);
  60.     SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 4);
  61.   }
  62.   if ((flags & SDLUT_ALPHA) == SDLUT_ALPHA)
  63.   {
  64.     SDL_GL_SetAttribute(SDL_GL_ALPHA_SIZE, 4);
  65.   }
  66.   if ((flags & SDLUT_DEPTH) == SDLUT_DEPTH)
  67.     SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 4);
  68.   if ((flags & SDLUT_STENCIL) == SDLUT_STENCIL)
  69.     SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 4);
  70.   if ((flags & SDLUT_DOUBLE) == SDLUT_DOUBLE)
  71.     SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
  72.   if ((flags & SDLUT_FSAA) == SDLUT_FSAA)
  73.   {
  74.     SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 1);
  75.     SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 4);
  76.   }
  77. }
  78. void sdlutCreateWindow (const char* title, int w, int h, int bpp, int flags)
  79. {
  80.   if (SDL_SetVideoMode(w,h,bpp,SDL_OPENGL|flags) == NULL)
  81.   {
  82.     printf("Couldn't set video mode: %sn", SDL_GetError());
  83.     return;
  84.   }
  85.   /* set the window title and icon name */
  86.   SDL_WM_SetCaption(title, title);
  87. }
  88. void sdlutDestroyWindow ()
  89. {
  90.   SDL_QuitSubSystem(SDL_INIT_VIDEO);
  91.   SDL_Quit();
  92. }
  93. /*
  94.  * Ah, the main event loop.  Exits when a QUIT event is triggered
  95.  */
  96. void sdlutMainLoop ()
  97. {
  98.   SDL_Event event;
  99.   bool      done = false;
  100.   sdlut_redisplay_necessary = true;
  101.   while (!done)
  102.   {
  103.     if (sdlut_redisplay_necessary && sdlut_display_function_ptr)
  104.     {
  105.       sdlut_display_function_ptr();
  106.       sdlut_redisplay_necessary = false;
  107.     }
  108.     if (SDL_PollEvent(&event))
  109.     {
  110.       do
  111.       {
  112.         switch (event.type)
  113.         {
  114.         case SDL_ACTIVEEVENT:
  115.           if (sdlut_active_function_ptr)
  116.             sdlut_active_function_ptr((SDL_ActiveEvent*) &event);
  117.           break;
  118.         case SDL_KEYDOWN:
  119.         case SDL_KEYUP:
  120.           if (sdlut_keyboard_function_ptr)
  121.             sdlut_keyboard_function_ptr((SDL_KeyboardEvent*) &event);
  122.           break;
  123.         case SDL_MOUSEMOTION:
  124.           if (sdlut_motion_function_ptr)
  125.             sdlut_motion_function_ptr((SDL_MouseMotionEvent*) &event);
  126.           break;
  127.         case SDL_MOUSEBUTTONDOWN:
  128.         case SDL_MOUSEBUTTONUP:
  129.           if (sdlut_mouse_function_ptr)
  130.             sdlut_mouse_function_ptr((SDL_MouseButtonEvent*) &event);
  131.           break;
  132.         case SDL_QUIT:
  133.           done = true;
  134.           break;
  135.         case SDL_VIDEORESIZE:
  136.           if (sdlut_resize_function_ptr)
  137.             sdlut_resize_function_ptr((SDL_ResizeEvent*) &event);
  138.           break;
  139.         case SDL_VIDEOEXPOSE:
  140.           sdlut_redisplay_necessary = true;
  141.           break;
  142.         default:
  143.           break;
  144.         }
  145.       } while (SDL_PollEvent(&event));
  146.     }
  147.     else
  148.     {
  149.       if (sdlut_idle_function_ptr)
  150.         sdlut_idle_function_ptr();
  151.     }
  152.   }
  153. }
  154. void sdlutPostRedisplay ()
  155. {
  156.   sdlut_redisplay_necessary = true;
  157. }
  158. void sdlutSwapBuffers ()
  159. {
  160.   SDL_GL_SwapBuffers();
  161. }
  162. /*
  163.  * SDL-style event callbacks
  164.  */
  165. void sdlutActiveFunc (void (*func)(SDL_ActiveEvent*))
  166. {
  167.   sdlut_active_function_ptr = func;
  168. }
  169. void sdlutDisplayFunc (void (*func)(void))
  170. {
  171.   sdlut_display_function_ptr = func;
  172. }
  173. void sdlutIdleFunc (void (*func)(void))
  174. {
  175.   sdlut_idle_function_ptr = func;
  176. }
  177. void sdlutKeyboardFunc (void (*func)(SDL_KeyboardEvent*))
  178. {
  179.   sdlut_keyboard_function_ptr = func;
  180. }
  181. void sdlutMotionFunc (void (*func)(SDL_MouseMotionEvent*))
  182. {
  183.   sdlut_motion_function_ptr = func;
  184. }
  185. void sdlutMouseFunc (void (*func)(SDL_MouseButtonEvent*))
  186. {
  187.   sdlut_mouse_function_ptr = func;
  188. }
  189. void sdlutResizeFunc (void (*func)(SDL_ResizeEvent*))
  190. {
  191.   sdlut_resize_function_ptr = func;
  192. }
  193. /*
  194.  *  GLUT-style event callbacks
  195.  */
  196. void sdlutGlutDisplayFunc (void (*func)(void))
  197. {
  198.   sdlut_display_function_ptr = func;
  199. }
  200. void sdlutGlutIdleFunc (void (*func)(void))
  201. {
  202.   sdlut_idle_function_ptr = func;
  203. }
  204. void sdlutGlutKeyboardFunc (void (*func)(unsigned char key, int x, int y))
  205. {
  206.   sdlut_glut_keyboard_function_ptr = func;
  207.   if (sdlut_glut_keyboard_function_ptr)
  208.     sdlut_keyboard_function_ptr = sdlut_glut_keyboard_adapter;
  209.   else
  210.     sdlut_keyboard_function_ptr = NULL;
  211. }
  212. void sdlutGlutMouseFunc (void (*func)(int button, int state, int x, int y))
  213. {
  214.   sdlut_glut_mouse_function_ptr = func;
  215.   if (sdlut_glut_mouse_function_ptr)
  216.     sdlut_mouse_function_ptr = sdlut_glut_mouse_adapter;
  217.   else
  218.     sdlut_mouse_function_ptr = NULL;
  219. }
  220. void sdlutGlutMotionFunc (void (*func)(int x, int y))
  221. {
  222.   sdlut_glut_motion_function_ptr = func;
  223.   if (sdlut_glut_motion_function_ptr)
  224.     sdlut_motion_function_ptr = sdlut_glut_motion_adapter;
  225.   else
  226.     sdlut_motion_function_ptr = NULL;
  227. }
  228. void sdlutGlutReshapeFunc (void (*func)(int w, int h))
  229. {
  230.   sdlut_glut_reshape_function_ptr = func;
  231.   if (sdlut_glut_reshape_function_ptr)
  232.     sdlut_resize_function_ptr = sdlut_glut_reshape_adapter;
  233.   else
  234.     sdlut_resize_function_ptr = NULL;
  235. }
  236. /*
  237.  * Adapter functions to support SDL->GLUT event translation
  238.  */
  239. /* for use in sdlut_glut_keyboard_adapter, to grab the mouse loc */
  240. static int x, y;
  241. static void sdlut_glut_keyboard_adapter (SDL_KeyboardEvent* e)
  242. {
  243.   if (e->state == SDL_RELEASED && e->keysym.sym < 128)
  244.   {
  245.     SDL_GetMouseState(&x, &y);
  246.     sdlut_glut_keyboard_function_ptr(e->keysym.sym, x, y);
  247.   }
  248. }
  249. /* SDL -> GLUT mappings
  250.    SDL_LEFT_BUTTON   = 1  ->  GLUT_LEFT_BUTTON   = 0
  251.    SDL_MIDDLE_BUTTON = 2  ->  GLUT_MIDDLE_BUTTON = 1
  252.    SDL_RIGHT_BUTTON  = 3  ->  GLUT_RIGHT_BUTTON  = 2
  253.    SDL_PRESESD       = 0  ->  GLUT_DOWN = 1
  254.    SDL_RELEASED      = 1  ->  GLUT_UP   = 0
  255. */
  256. static int ButtonTrans[4] = { 0, 0, 1, 2 };
  257. static int StateTrans[2]  = { 1, 0 };
  258. static void sdlut_glut_mouse_adapter (SDL_MouseButtonEvent* e)
  259. {
  260.   sdlut_glut_mouse_function_ptr(ButtonTrans[e->button], 
  261.                                 StateTrans[e->state], 
  262.                                 e->x, e->y);
  263. }
  264. static void sdlut_glut_motion_adapter (SDL_MouseMotionEvent* e)
  265. {
  266.   sdlut_glut_motion_function_ptr(e->x, e->y);
  267. }
  268. static void sdlut_glut_reshape_adapter (SDL_ResizeEvent* e)
  269. {
  270.   sdlut_glut_reshape_function_ptr(e->w, e->h);
  271. }
  272. static char shiftmap[128] = {
  273. 0, /* NUL */
  274. 1, /* SOH */
  275. 2, /* STX */
  276. 3, /* ETX */
  277. 4, /* EOT */
  278. 5, /* ENQ */
  279. 6, /* ACK */
  280. 7,
  281. 8,
  282. 9,
  283. 10,
  284. 11,
  285. 12,
  286. 13,
  287. 14,
  288. 15,
  289. 16,
  290. 17,
  291. 18,
  292. 19,
  293. 20,
  294. 21,
  295. 22,
  296. 23,
  297. 24,
  298. 25,
  299. 26,
  300. 27,
  301. 28,
  302. 29,
  303. 30,
  304. 31,
  305. ' ', /* SPACE */
  306. '1', /* ! */
  307. ''', /* " */
  308. '3', /* # */
  309. '4', /* $ */
  310. '5', /* % */
  311. '7', /* & */
  312. '"', /* ' */
  313. '9', /* ( */
  314. '0', /* ) */
  315. '8', /* * */
  316. '=', /* + */
  317. '<', /* , */
  318. '_', /* - */
  319. '>', /* . */
  320. '?', /* / */
  321. ')', /* 0 */
  322. '!', /* 1 */
  323. '@', /* 2 */
  324. '#', /* 3 */
  325. '$', /* 4 */
  326. '%', /* 5 */
  327. '^', /* 6 */
  328. '&', /* 7 */
  329. '*', /* 8 */
  330. '(', /* 9 */
  331. ';', /* : */
  332. ':', /* ; */
  333. ',', /* < */
  334. '+', /* = */
  335. '.', /* > */
  336. '/', /* ? */
  337. '2', /* @ */
  338. 'a', /* A */
  339. 'b', /* B */
  340. 'c', /* C */
  341. 'd', /* D */
  342. 'e', /* E */
  343. 'f', /* F */
  344. 'g', /* G */
  345. 'h', /* H */
  346. 'i', /* I */
  347. 'j', /* J */
  348. 'k', /* K */
  349. 'l', /* L */
  350. 'm', /* M */
  351. 'n', /* N */
  352. 'o', /* O */
  353. 'p', /* P */
  354. 'q', /* Q */
  355. 'r', /* R */
  356. 's', /* S */
  357. 't', /* T */
  358. 'u', /* U */
  359. 'v', /* V */
  360. 'w', /* W */
  361. 'x', /* X */
  362. 'y', /* Y */
  363. 'z', /* Z */
  364. '{', /* [ */
  365. '|', /*  */
  366. '}', /* ] */
  367. '6', /* ^ */
  368. '-', /* _ */
  369. '~', /* ` */
  370. 'A', /* a */
  371. 'B', /* b */
  372. 'C', /* c */
  373. 'D', /* d */
  374. 'E', /* e */
  375. 'F', /* f */
  376. 'G', /* g */
  377. 'H', /* h */
  378. 'I', /* i */
  379. 'J', /* j */
  380. 'K', /* k */
  381. 'L', /* l */
  382. 'M', /* m */
  383. 'N', /* n */
  384. 'O', /* o */
  385. 'P', /* p */
  386. 'Q', /* q */
  387. 'R', /* r */
  388. 'S', /* s */
  389. 'T', /* t */
  390. 'U', /* u */
  391. 'V', /* v */
  392. 'W', /* w */
  393. 'X', /* x */
  394. 'Y', /* y */
  395. 'Z', /* z */
  396. '[', /* { */
  397. '\', /* | */
  398. ']', /* } */
  399. '`', /* ~ */
  400. 127 /* DEL */
  401. };
  402. unsigned char sdlutShiftASCII (unsigned char c)
  403. {
  404.   if (c >= 128 )
  405.     return c;
  406.   return shiftmap[c];
  407. }
  408. unsigned int lastTicks = 0;
  409. unsigned int sdlutGetElapsed ()
  410. {
  411.   unsigned int thisTicks = SDL_GetTicks();
  412.   unsigned int elapsed;
  413.   if( lastTicks )
  414.     elapsed = thisTicks - lastTicks;
  415.   else
  416.     elapsed = 0;
  417.   lastTicks = thisTicks;
  418.   return elapsed;
  419. }