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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Test out the multi-threaded event handling functions */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include "SDL.h"
  6. #include "SDL_thread.h"
  7. /* Are we done yet? */
  8. static int done = 0;
  9. /* Is the cursor visible? */
  10. static int visible = 1;
  11. SDL_Surface *LoadIconSurface(char *file, Uint8 **maskp)
  12. {
  13. SDL_Surface *icon;
  14. Uint8       *pixels;
  15. Uint8       *mask;
  16. int          mlen, i;
  17. *maskp = NULL;
  18. /* Load the icon surface */
  19. icon = SDL_LoadBMP(file);
  20. if ( icon == NULL ) {
  21. fprintf(stderr, "Couldn't load %s: %sn", file, SDL_GetError());
  22. return(NULL);
  23. }
  24. /* Check width and height */
  25. if ( (icon->w%8) != 0 ) {
  26. fprintf(stderr, "Icon width must be a multiple of 8!n");
  27. SDL_FreeSurface(icon);
  28. return(NULL);
  29. }
  30. if ( icon->format->palette == NULL ) {
  31. fprintf(stderr, "Icon must have a palette!n");
  32. SDL_FreeSurface(icon);
  33. return(NULL);
  34. }
  35. /* Set the colorkey */
  36. SDL_SetColorKey(icon, SDL_SRCCOLORKEY, *((Uint8 *)icon->pixels));
  37. /* Create the mask */
  38. pixels = (Uint8 *)icon->pixels;
  39. printf("Transparent pixel: (%d,%d,%d)n",
  40. icon->format->palette->colors[*pixels].r,
  41. icon->format->palette->colors[*pixels].g,
  42. icon->format->palette->colors[*pixels].b);
  43. mlen = icon->w*icon->h;
  44. mask = (Uint8 *)malloc(mlen/8);
  45. if ( mask == NULL ) {
  46. fprintf(stderr, "Out of memory!n");
  47. SDL_FreeSurface(icon);
  48. return(NULL);
  49. }
  50. memset(mask, 0, mlen/8);
  51. for ( i=0; i<mlen; ) {
  52. if ( pixels[i] != *pixels )
  53. mask[i/8] |= 0x01;
  54. ++i;
  55. if ( (i%8) != 0 )
  56. mask[i/8] <<= 1;
  57. }
  58. *maskp = mask;
  59. return(icon);
  60. }
  61. int FilterEvents(const SDL_Event *event)
  62. {
  63. static int reallyquit = 0;
  64. switch (event->type) {
  65. case SDL_ACTIVEEVENT:
  66. /* See what happened */
  67. printf("App %s ",
  68. event->active.gain ? "gained" : "lost");
  69. if ( event->active.state & SDL_APPACTIVE )
  70. printf("active ");
  71. if ( event->active.state & SDL_APPMOUSEFOCUS )
  72. printf("mouse ");
  73. if ( event->active.state & SDL_APPINPUTFOCUS )
  74. printf("input ");
  75. printf("focusn");
  76. /* See if we are iconified or restored */
  77. if ( event->active.state & SDL_APPACTIVE ) {
  78. printf("App has been %sn",
  79. event->active.gain ?
  80.  "restored" : "iconified");
  81. }
  82. return(0);
  83. /* This is important!  Queue it if we want to quit. */
  84. case SDL_QUIT:
  85. if ( ! reallyquit ) {
  86. reallyquit = 1;
  87. printf("Quit requestedn");
  88. return(0);
  89. }
  90. printf("Quit demandedn");
  91. return(1);
  92. /* Mouse and keyboard events go to threads */
  93. case SDL_MOUSEMOTION:
  94. case SDL_MOUSEBUTTONDOWN:
  95. case SDL_MOUSEBUTTONUP:
  96. case SDL_KEYDOWN:
  97. case SDL_KEYUP:
  98. return(1);
  99. /* Drop all other events */
  100. default:
  101. return(0);
  102. }
  103. }
  104. int HandleMouse(void *unused)
  105. {
  106. SDL_Event events[10];
  107. int i, found;
  108. Uint32 mask;
  109. /* Handle mouse events here */
  110. mask = (SDL_MOUSEMOTIONMASK|SDL_MOUSEBUTTONDOWNMASK|SDL_MOUSEBUTTONUPMASK);
  111. while ( ! done ) {
  112. found = SDL_PeepEvents(events, 10, SDL_GETEVENT, mask);
  113. for ( i=0; i<found; ++i ) {
  114. switch(events[i].type) {
  115. /* We want to toggle visibility on buttonpress */
  116. case SDL_MOUSEBUTTONDOWN:
  117. case SDL_MOUSEBUTTONUP:
  118. if ( events[i].button.state == SDL_PRESSED ) {
  119. visible = !visible;
  120. SDL_ShowCursor(visible);
  121. }
  122. printf("Mouse button %d has been %sn",
  123. events[i].button.button,
  124. (events[i].button.state == SDL_PRESSED) ?
  125. "pressed" : "released");
  126. break;
  127. /* Show relative mouse motion */
  128. case SDL_MOUSEMOTION:
  129. printf("Mouse relative motion: {%d,%d}n",
  130. events[i].motion.xrel, events[i].motion.yrel);
  131. break;
  132. }
  133. }
  134. /* Give up some CPU to allow events to arrive */
  135. SDL_Delay(20);
  136. }
  137. return(0);
  138. }
  139. int HandleKeyboard(void *unused)
  140. {
  141. SDL_Event events[10];
  142. int i, found;
  143. Uint32 mask;
  144. /* Handle mouse events here */
  145. mask = (SDL_KEYDOWNMASK|SDL_KEYUPMASK);
  146. while ( ! done ) {
  147. found = SDL_PeepEvents(events, 10, SDL_GETEVENT, mask);
  148. for ( i=0; i<found; ++i ) {
  149. switch(events[i].type) {
  150.     /* We want to toggle visibility on buttonpress */
  151.     case SDL_KEYDOWN:
  152.     case SDL_KEYUP:
  153.      /* Allow hitting <ESC> to quit the app */
  154.      if ( events[i].key.keysym.sym == SDLK_ESCAPE ) {
  155.      done = 1;
  156.      }
  157.      printf("Key '%c' has been %sn",
  158. events[i].key.keysym.unicode,
  159. (events[i].key.state == SDL_PRESSED) ?
  160. "pressed" : "released");
  161.      break;
  162. }
  163. }
  164. /* Give up some CPU to allow events to arrive */
  165. SDL_Delay(20);
  166. }
  167. return(0);
  168. }
  169. int main(int argc, char *argv[])
  170. {
  171. SDL_Surface *screen;
  172. SDL_Surface *icon;
  173. Uint8 *icon_mask;
  174. int i, parsed;
  175. Uint8 *buffer;
  176. SDL_Color palette[256];
  177. Uint32 init_flags;
  178. Uint8  video_bpp;
  179. Uint32 video_flags;
  180. SDL_Thread *mouse_thread;
  181. SDL_Thread *keybd_thread;
  182. /* Set the options, based on command line arguments */
  183. init_flags = SDL_INIT_VIDEO;
  184. video_bpp = 8;
  185. video_flags = SDL_SWSURFACE;
  186. parsed = 1;
  187. while ( parsed ) {
  188. /* If the threaded option is enabled, and the SDL library hasn't
  189.    been compiled with threaded events enabled, then the mouse and
  190.    keyboard won't respond.
  191.  */
  192. if ( (argc >= 2) && (strcmp(argv[1], "-threaded") == 0) ) {
  193. init_flags |= SDL_INIT_EVENTTHREAD;
  194. argc -= 1;
  195. argv += 1;
  196. printf("Running with threaded eventsn");
  197. } else
  198. if ( (argc >= 2) && (strcmp(argv[1], "-fullscreen") == 0) ) {
  199. video_flags |= SDL_FULLSCREEN;
  200. argc -= 1;
  201. argv += 1;
  202. } else
  203. if ( (argc >= 3) && (strcmp(argv[1], "-bpp") == 0) ) {
  204. video_bpp = atoi(argv[2]);
  205. argc -= 2;
  206. argv += 2;
  207. } else {
  208. parsed = 0;
  209. }
  210. }
  211. /* Initialize SDL with the requested flags */
  212. if ( SDL_Init(init_flags) < 0 ) {
  213. fprintf(stderr,
  214. "Couldn't initialize SDL: %sn", SDL_GetError());
  215. exit(1);
  216. }
  217. atexit(SDL_Quit);
  218. /* Set the icon -- this must be done before the first mode set */
  219. icon = LoadIconSurface("icon.bmp", &icon_mask);
  220. if ( icon != NULL ) {
  221. SDL_WM_SetIcon(icon, icon_mask);
  222. }
  223. if ( icon_mask != NULL )
  224. free(icon_mask);
  225. /* Initialize the display */
  226. screen = SDL_SetVideoMode(640, 480, video_bpp, video_flags);
  227. if (  screen == NULL ) {
  228. fprintf(stderr, "Couldn't set 640x480x%d video mode: %sn",
  229. video_bpp, SDL_GetError());
  230. exit(1);
  231. }
  232. printf("Running in %s moden", screen->flags & SDL_FULLSCREEN ?
  233. "fullscreen" : "windowed");
  234. /* Enable printable characters */
  235. SDL_EnableUNICODE(1);
  236. /* Set an event filter that discards everything but QUIT */
  237. SDL_SetEventFilter(FilterEvents);
  238. /* Create the event handling threads */
  239. mouse_thread = SDL_CreateThread(HandleMouse, NULL);
  240. keybd_thread = SDL_CreateThread(HandleKeyboard, NULL);
  241. /* Set the surface pixels and refresh! */
  242. for ( i=0; i<256; ++i ) {
  243. palette[i].r = 255-i;
  244. palette[i].g = 255-i;
  245. palette[i].b = 255-i;
  246. }
  247. SDL_SetColors(screen, palette, 0, 256);
  248. if ( SDL_LockSurface(screen) < 0 ) {
  249. fprintf(stderr, "Couldn't lock display surface: %sn",
  250. SDL_GetError());
  251. exit(2);
  252. }
  253. buffer = (Uint8 *)screen->pixels;
  254. for ( i=0; i<screen->h; ++i ) {
  255. memset(buffer,(i*255)/screen->h,
  256. screen->w*screen->format->BytesPerPixel);
  257. buffer += screen->pitch;
  258. }
  259. SDL_UnlockSurface(screen);
  260. SDL_UpdateRect(screen, 0, 0, 0, 0);
  261. /* Loop, waiting for QUIT */
  262. while ( ! done ) {
  263. if ( ! (init_flags & SDL_INIT_EVENTTHREAD) ) {
  264. SDL_PumpEvents(); /* Needed when event thread is off */
  265. }
  266. if ( SDL_PeepEvents(NULL, 0, SDL_PEEKEVENT, SDL_QUITMASK) ) {
  267. done = 1;
  268. }
  269. /* Give up some CPU so the events can accumulate */
  270. SDL_Delay(20);
  271. }
  272. SDL_WaitThread(mouse_thread, NULL);
  273. SDL_WaitThread(keybd_thread, NULL);
  274. return(0);
  275. }