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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /* Simple program:  Test bitmap blits */
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "SDL.h"
  6. #include "picture.xbm"
  7. SDL_Surface *LoadXBM(SDL_Surface *screen, int w, int h, Uint8 *bits)
  8. {
  9. SDL_Surface *bitmap;
  10. Uint8 *line;
  11. /* Allocate the bitmap */
  12. bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 1, 0, 0, 0, 0);
  13. if ( bitmap == NULL ) {
  14. fprintf(stderr, "Couldn't allocate bitmap: %sn",
  15. SDL_GetError());
  16. return(NULL);
  17. }
  18. /* Copy the pixels */
  19. line = (Uint8 *)bitmap->pixels;
  20. w = (w+7)/8;
  21. while ( h-- ) {
  22. memcpy(line, bits, w);
  23. /* X11 Bitmap images have the bits reversed */
  24. { int i, j; Uint8 *buf, byte;
  25. for ( buf=line, i=0; i<w; ++i, ++buf ) {
  26. byte = *buf;
  27. *buf = 0;
  28. for ( j=7; j>=0; --j ) {
  29. *buf |= (byte&0x01)<<j;
  30. byte >>= 1;
  31. }
  32. }
  33. }
  34. line += bitmap->pitch;
  35. bits += w;
  36. }
  37. return(bitmap);
  38. }
  39. int main(int argc, char *argv[])
  40. {
  41. SDL_Surface *screen;
  42. SDL_Surface *bitmap;
  43. Uint8  video_bpp;
  44. Uint32 videoflags;
  45. Uint8 *buffer;
  46. int i, done;
  47. SDL_Event event;
  48. /* Initialize SDL */
  49. if ( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
  50. fprintf(stderr, "Couldn't initialize SDL: %sn",SDL_GetError());
  51. exit(1);
  52. }
  53. atexit(SDL_Quit);
  54. video_bpp = 0;
  55. videoflags = SDL_SWSURFACE;
  56. while ( argc > 1 ) {
  57. --argc;
  58. if ( strcmp(argv[argc-1], "-bpp") == 0 ) {
  59. video_bpp = atoi(argv[argc]);
  60. --argc;
  61. } else
  62. if ( strcmp(argv[argc], "-warp") == 0 ) {
  63. videoflags |= SDL_HWPALETTE;
  64. } else
  65. if ( strcmp(argv[argc], "-hw") == 0 ) {
  66. videoflags |= SDL_HWSURFACE;
  67. } else
  68. if ( strcmp(argv[argc], "-fullscreen") == 0 ) {
  69. videoflags |= SDL_FULLSCREEN;
  70. } else {
  71. fprintf(stderr,
  72. "Usage: %s [-bpp N] [-warp] [-hw] [-fullscreen]n",
  73. argv[0]);
  74. exit(1);
  75. }
  76. }
  77. /* Set 640x480 video mode */
  78. if ( (screen=SDL_SetVideoMode(640,480,video_bpp,videoflags)) == NULL ) {
  79. fprintf(stderr, "Couldn't set 640x480x%d video mode: %sn",
  80. video_bpp, SDL_GetError());
  81. exit(2);
  82. }
  83. /* Set the surface pixels and refresh! */
  84. if ( SDL_LockSurface(screen) < 0 ) {
  85. fprintf(stderr, "Couldn't lock the display surface: %sn",
  86. SDL_GetError());
  87. exit(2);
  88. }
  89. buffer=(Uint8 *)screen->pixels;
  90. for ( i=0; i<screen->h; ++i ) {
  91. memset(buffer,(i*255)/screen->h, screen->pitch);
  92. buffer += screen->pitch;
  93. }
  94. SDL_UnlockSurface(screen);
  95. SDL_UpdateRect(screen, 0, 0, 0, 0);
  96. /* Load the bitmap */
  97. bitmap = LoadXBM(screen, picture_width, picture_height,
  98. (Uint8 *)picture_bits);
  99. if ( bitmap == NULL ) {
  100. exit(1);
  101. }
  102. /* Wait for a keystroke */
  103. done = 0;
  104. while ( !done ) {
  105. /* Check for events */
  106. while ( SDL_PollEvent(&event) ) {
  107. switch (event.type) {
  108. case SDL_MOUSEBUTTONDOWN: {
  109. SDL_Rect dst;
  110. dst.x = event.button.x - bitmap->w/2;
  111. dst.y = event.button.y - bitmap->h/2;
  112. dst.w = bitmap->w;
  113. dst.h = bitmap->h;
  114. SDL_BlitSurface(bitmap, NULL,
  115. screen, &dst);
  116. SDL_UpdateRects(screen,1,&dst);
  117. }
  118. break;
  119. case SDL_KEYDOWN:
  120. /* Any key press quits the app... */
  121. done = 1;
  122. break;
  123. case SDL_QUIT:
  124. done = 1;
  125. break;
  126. default:
  127. break;
  128. }
  129. }
  130. }
  131. SDL_FreeSurface(bitmap);
  132. return(0);
  133. }