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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Bring up a window and play with it */
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define BENCHMARK_SDL
  6. #define NOTICE(X) printf("%s", X);
  7. #include "SDL.h"
  8. void DrawPict(SDL_Surface *screen, char *bmpfile,
  9. int speedy, int flip, int nofade)
  10. {
  11. SDL_Surface *picture;
  12. SDL_Rect dest, update;
  13. int i, centered;
  14. int ncolors;
  15. SDL_Color *colors, *cmap;
  16. /* Load the image into a surface */
  17. if ( bmpfile == NULL ) {
  18. bmpfile = "sample.bmp"; /* Sample image */
  19. }
  20. fprintf(stderr, "Loading picture: %sn", bmpfile);
  21. picture = SDL_LoadBMP(bmpfile);
  22. if ( picture == NULL ) {
  23. fprintf(stderr, "Couldn't load %s: %sn", bmpfile,
  24. SDL_GetError());
  25. return;
  26. }
  27. /* Set the display colors -- on a hicolor display this is a no-op */
  28. if ( picture->format->palette ) {
  29. ncolors = picture->format->palette->ncolors;
  30. colors  = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  31. cmap    = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  32. memcpy(colors, picture->format->palette->colors,
  33. ncolors*sizeof(SDL_Color));
  34. } else {
  35. int       r, g, b;
  36. /* Allocate 256 color palette */
  37. ncolors = 256;
  38. colors  = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  39. cmap    = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  40. /* Set a 3,3,2 color cube */
  41. for ( r=0; r<8; ++r ) {
  42. for ( g=0; g<8; ++g ) {
  43. for ( b=0; b<4; ++b ) {
  44. i = ((r<<5)|(g<<2)|b);
  45. colors[i].r = r<<5;
  46. colors[i].g = g<<5;
  47. colors[i].b = b<<6;
  48. }
  49. }
  50. }
  51. }
  52. NOTICE("testwin: setting colorsn");
  53. if ( ! SDL_SetColors(screen, colors, 0, ncolors) &&
  54. (screen->format->palette != NULL) ) {
  55. fprintf(stderr,
  56. "Warning: Couldn't set all of the colors, but SDL will map the imagen"
  57. "         (colormap fading will suffer - try the -warp option)n"
  58. );
  59. }
  60. /* Set the screen to black (not really necessary) */
  61. if ( SDL_LockSurface(screen) == 0 ) {
  62. Uint32 black;
  63. Uint8 *pixels;
  64. black = SDL_MapRGB(screen->format, 0, 0, 0);
  65. pixels = (Uint8 *)screen->pixels;
  66. for ( i=0; i<screen->h; ++i ) {
  67. memset(pixels, black,
  68. screen->w*screen->format->BytesPerPixel);
  69. pixels += screen->pitch;
  70. }
  71. SDL_UnlockSurface(screen);
  72. SDL_UpdateRect(screen, 0, 0, 0, 0);
  73. }
  74. /* Display the picture */
  75. if ( speedy ) {
  76. SDL_Surface *displayfmt;
  77. fprintf(stderr, "Converting picturen");
  78. displayfmt = SDL_DisplayFormat(picture);
  79. if ( displayfmt == NULL ) {
  80. fprintf(stderr,
  81. "Couldn't convert image: %sn", SDL_GetError());
  82. goto done;
  83. }
  84. SDL_FreeSurface(picture);
  85. picture = displayfmt;
  86. }
  87. printf("(image surface located in %s memory)n", 
  88. (picture->flags&SDL_HWSURFACE) ? "video" : "system");
  89. centered = (screen->w - picture->w)/2;
  90. if ( centered < 0 ) {
  91. centered = 0;
  92. }
  93. dest.y = (screen->h - picture->h)/2;
  94. dest.w = picture->w;
  95. dest.h = picture->h;
  96. NOTICE("testwin: moving imagen");
  97. for ( i=0; i<=centered; ++i ) {
  98. dest.x = i;
  99. update = dest;
  100. if ( SDL_BlitSurface(picture, NULL, screen, &update) < 0 ) {
  101. fprintf(stderr, "Blit failed: %sn", SDL_GetError());
  102. break;
  103. }
  104. if ( flip ) {
  105. SDL_Flip(screen);
  106. } else {
  107. SDL_UpdateRects(screen, 1, &update);
  108. }
  109. }
  110. #ifdef SCREENSHOT
  111. if ( SDL_SaveBMP(screen, "screen.bmp") < 0 )
  112. printf("Couldn't save screen: %sn", SDL_GetError());
  113. #endif
  114. #ifndef BENCHMARK_SDL
  115. /* Let it sit there for a while */
  116. SDL_Delay(5*1000);
  117. #endif
  118. /* Fade the colormap */
  119. if ( ! nofade ) {
  120. int maxstep;
  121. SDL_Color final;
  122. SDL_Color palcolors[256];
  123. struct {
  124. Sint16 r, g, b;
  125. } cdist[256];
  126. NOTICE("testwin: fading out...n");
  127. memcpy(cmap, colors, ncolors*sizeof(SDL_Color));
  128. maxstep = 32-1;
  129. final.r = 0xFF;
  130. final.g = 0x00;
  131. final.b = 0x00;
  132. memcpy(palcolors, colors, ncolors*sizeof(SDL_Color));
  133. for ( i=0; i<ncolors; ++i ) {
  134. cdist[i].r = final.r-palcolors[i].r;
  135. cdist[i].g = final.g-palcolors[i].g;
  136. cdist[i].b = final.b-palcolors[i].b;
  137. }
  138. for ( i=0; i<=maxstep/2; ++i ) { /* halfway fade */
  139. int c;
  140. for ( c=0; c<ncolors; ++c ) {
  141. colors[c].r =
  142. palcolors[c].r+((cdist[c].r*i))/maxstep;
  143. colors[c].g =
  144. palcolors[c].g+((cdist[c].g*i))/maxstep;
  145. colors[c].b =
  146. palcolors[c].b+((cdist[c].b*i))/maxstep;
  147. }
  148. SDL_SetColors(screen, colors, 0, ncolors);
  149. SDL_Delay(1);
  150. }
  151. final.r = 0x00;
  152. final.g = 0x00;
  153. final.b = 0x00;
  154. memcpy(palcolors, colors, ncolors*sizeof(SDL_Color));
  155. for ( i=0; i<ncolors; ++i ) {
  156. cdist[i].r = final.r-palcolors[i].r;
  157. cdist[i].g = final.g-palcolors[i].g;
  158. cdist[i].b = final.b-palcolors[i].b;
  159. }
  160. maxstep /= 2;
  161. for ( i=0; i<=maxstep; ++i ) { /* finish fade out */
  162. int c;
  163. for ( c=0; c<ncolors; ++c ) {
  164. colors[c].r =
  165. palcolors[c].r+((cdist[c].r*i))/maxstep;
  166. colors[c].g =
  167. palcolors[c].g+((cdist[c].g*i))/maxstep;
  168. colors[c].b =
  169. palcolors[c].b+((cdist[c].b*i))/maxstep;
  170. }
  171. SDL_SetColors(screen, colors, 0, ncolors);
  172. SDL_Delay(1);
  173. }
  174. for ( i=0; i<ncolors; ++i ) {
  175. colors[i].r = final.r;
  176. colors[i].g = final.g;
  177. colors[i].b = final.b;
  178. }
  179. SDL_SetColors(screen, colors, 0, ncolors);
  180. NOTICE("testwin: fading in...n");
  181. memcpy(palcolors, colors, ncolors*sizeof(SDL_Color));
  182. for ( i=0; i<ncolors; ++i ) {
  183. cdist[i].r = cmap[i].r-palcolors[i].r;
  184. cdist[i].g = cmap[i].g-palcolors[i].g;
  185. cdist[i].b = cmap[i].b-palcolors[i].b;
  186. }
  187. for ( i=0; i<=maxstep; ++i ) { /* 32 step fade in */
  188. int c;
  189. for ( c=0; c<ncolors; ++c ) {
  190. colors[c].r =
  191. palcolors[c].r+((cdist[c].r*i))/maxstep;
  192. colors[c].g =
  193. palcolors[c].g+((cdist[c].g*i))/maxstep;
  194. colors[c].b =
  195. palcolors[c].b+((cdist[c].b*i))/maxstep;
  196. }
  197. SDL_SetColors(screen, colors, 0, ncolors);
  198. SDL_Delay(1);
  199. }
  200. NOTICE("testwin: fading overn");
  201. }
  202. done:
  203. /* Free the picture and return */
  204. SDL_FreeSurface(picture);
  205. free(colors); free(cmap);
  206. return;
  207. }
  208. int main(int argc, char *argv[])
  209. {
  210. SDL_Surface *screen;
  211. /* Options */
  212. int speedy, flip, nofade;
  213. int delay;
  214. int w, h;
  215. int desired_bpp;
  216. Uint32 video_flags;
  217. #ifdef BENCHMARK_SDL
  218. Uint32 then, now;
  219. #endif
  220. /* Set default options and check command-line */
  221. speedy = 0;
  222. flip = 0;
  223. nofade = 0;
  224. delay = 1;
  225. w = 640;
  226. h = 480;
  227. desired_bpp = 0;
  228. video_flags = 0;
  229. while ( argc > 1 ) {
  230. if ( strcmp(argv[1], "-speedy") == 0 ) {
  231. speedy = 1;
  232. argv += 1;
  233. argc -= 1;
  234. } else
  235. if ( strcmp(argv[1], "-nofade") == 0 ) {
  236. nofade = 1;
  237. argv += 1;
  238. argc -= 1;
  239. } else
  240. if ( strcmp(argv[1], "-delay") == 0 ) {
  241. if ( argv[2] ) {
  242. delay = atoi(argv[2]);
  243. argv += 2;
  244. argc -= 2;
  245. } else {
  246. fprintf(stderr,
  247. "The -delay option requires an argumentn");
  248. exit(1);
  249. }
  250. } else
  251. if ( strcmp(argv[1], "-width") == 0 ) {
  252. if ( argv[2] && ((w = atoi(argv[2])) > 0) ) {
  253. argv += 2;
  254. argc -= 2;
  255. } else {
  256. fprintf(stderr,
  257. "The -width option requires an argumentn");
  258. exit(1);
  259. }
  260. } else
  261. if ( strcmp(argv[1], "-height") == 0 ) {
  262. if ( argv[2] && ((h = atoi(argv[2])) > 0) ) {
  263. argv += 2;
  264. argc -= 2;
  265. } else {
  266. fprintf(stderr,
  267. "The -height option requires an argumentn");
  268. exit(1);
  269. }
  270. } else
  271. if ( strcmp(argv[1], "-bpp") == 0 ) {
  272. if ( argv[2] ) {
  273. desired_bpp = atoi(argv[2]);
  274. argv += 2;
  275. argc -= 2;
  276. } else {
  277. fprintf(stderr,
  278. "The -bpp option requires an argumentn");
  279. exit(1);
  280. }
  281. } else
  282. if ( strcmp(argv[1], "-warp") == 0 ) {
  283. video_flags |= SDL_HWPALETTE;
  284. argv += 1;
  285. argc -= 1;
  286. } else
  287. if ( strcmp(argv[1], "-hw") == 0 ) {
  288. video_flags |= SDL_HWSURFACE;
  289. argv += 1;
  290. argc -= 1;
  291. } else
  292. if ( strcmp(argv[1], "-flip") == 0 ) {
  293. video_flags |= SDL_DOUBLEBUF;
  294. argv += 1;
  295. argc -= 1;
  296. } else
  297. if ( strcmp(argv[1], "-fullscreen") == 0 ) {
  298. video_flags |= SDL_FULLSCREEN;
  299. argv += 1;
  300. argc -= 1;
  301. } else
  302. break;
  303. }
  304. if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
  305. fprintf(stderr,
  306. "Couldn't initialize SDL: %sn", SDL_GetError());
  307. exit(1);
  308. }
  309. atexit(SDL_Quit); /* Clean up on exit */
  310. /* Initialize the display */
  311. screen = SDL_SetVideoMode(w, h, desired_bpp, video_flags);
  312. if ( screen == NULL ) {
  313. fprintf(stderr, "Couldn't set %dx%dx%d video mode: %sn",
  314. w, h, desired_bpp, SDL_GetError());
  315. exit(1);
  316. }
  317. printf("Set%s %dx%dx%d moden",
  318. screen->flags & SDL_FULLSCREEN ? " fullscreen" : "",
  319. screen->w, screen->h, screen->format->BitsPerPixel);
  320. printf("(video surface located in %s memory)n",
  321. (screen->flags&SDL_HWSURFACE) ? "video" : "system");
  322. if ( screen->flags & SDL_DOUBLEBUF ) {
  323. printf("Double-buffering enabledn");
  324. flip = 1;
  325. }
  326. /* Set the window manager title bar */
  327. SDL_WM_SetCaption("SDL test window", "testwin");
  328. /* Do all the drawing work */
  329. #ifdef BENCHMARK_SDL
  330. then = SDL_GetTicks();
  331. DrawPict(screen, argv[1], speedy, flip, nofade);
  332. now = SDL_GetTicks();
  333. printf("Time: %d millisecondsn", now-then);
  334. #else
  335. DrawPict(screen, argv[1], speedy, flip, nofade);
  336. #endif
  337. SDL_Delay(delay*1000);
  338. return(0);
  339. }