Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. <HTML
  2. ><HEAD
  3. ><TITLE
  4. >Video Examples</TITLE
  5. ><META
  6. NAME="GENERATOR"
  7. CONTENT="Modular DocBook HTML Stylesheet Version 1.64
  8. "><LINK
  9. REL="HOME"
  10. TITLE="SDL Library Documentation"
  11. HREF="index.html"><LINK
  12. REL="UP"
  13. TITLE="Examples"
  14. HREF="guideexamples.html"><LINK
  15. REL="PREVIOUS"
  16. TITLE="Examples"
  17. HREF="guideexamples.html"><LINK
  18. REL="NEXT"
  19. TITLE="Event Examples"
  20. HREF="guideeventexamples.html"></HEAD
  21. ><BODY
  22. CLASS="SECT1"
  23. BGCOLOR="#FFF8DC"
  24. TEXT="#000000"
  25. LINK="#0000ee"
  26. VLINK="#551a8b"
  27. ALINK="#ff0000"
  28. ><DIV
  29. CLASS="NAVHEADER"
  30. ><TABLE
  31. WIDTH="100%"
  32. BORDER="0"
  33. CELLPADDING="0"
  34. CELLSPACING="0"
  35. ><TR
  36. ><TH
  37. COLSPAN="3"
  38. ALIGN="center"
  39. >SDL Library Documentation</TH
  40. ></TR
  41. ><TR
  42. ><TD
  43. WIDTH="10%"
  44. ALIGN="left"
  45. VALIGN="bottom"
  46. ><A
  47. HREF="guideexamples.html"
  48. >Prev</A
  49. ></TD
  50. ><TD
  51. WIDTH="80%"
  52. ALIGN="center"
  53. VALIGN="bottom"
  54. >Chapter 4. Examples</TD
  55. ><TD
  56. WIDTH="10%"
  57. ALIGN="right"
  58. VALIGN="bottom"
  59. ><A
  60. HREF="guideeventexamples.html"
  61. >Next</A
  62. ></TD
  63. ></TR
  64. ></TABLE
  65. ><HR
  66. ALIGN="LEFT"
  67. WIDTH="100%"></DIV
  68. ><DIV
  69. CLASS="SECT1"
  70. ><H1
  71. CLASS="SECT1"
  72. ><A
  73. NAME="GUIDEVIDEOEXAMPLES"
  74. >Video Examples</A
  75. ></H1
  76. ><P
  77. ></P
  78. ><DIV
  79. CLASS="SECT2"
  80. ><H2
  81. CLASS="SECT2"
  82. ><A
  83. NAME="AEN375"
  84. >Initializing the video display</A
  85. ></H2
  86. ><P
  87. ><PRE
  88. CLASS="PROGRAMLISTING"
  89. >    SDL_Surface *screen;
  90.  
  91.     /* Initialize the SDL library */
  92.     if( SDL_Init(SDL_INIT_VIDEO) &#60; 0 ) {
  93.         fprintf(stderr,
  94.                 "Couldn't initialize SDL: %s\n", SDL_GetError());
  95.         exit(1);
  96.     }
  97.  
  98.     /* Clean up on exit */
  99.     atexit(SDL_Quit);
  100.  
  101.     /* Initialize the display in a 640x480 8-bit palettized mode */
  102.     screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
  103.     if ( screen == NULL ) {
  104.         fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",
  105.                         SDL_GetError());
  106.         exit(1);
  107.     }</PRE
  108. ></P
  109. ></DIV
  110. ><DIV
  111. CLASS="SECT2"
  112. ><H2
  113. CLASS="SECT2"
  114. ><A
  115. NAME="AEN379"
  116. >Initializing the best video mode</A
  117. ></H2
  118. ><P
  119. ><PRE
  120. CLASS="PROGRAMLISTING"
  121. >    /* Have a preference for 8-bit, but accept any depth */
  122.     screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE|SDL_ANYFORMAT);
  123.     if ( screen == NULL ) {
  124.         fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",
  125.                         SDL_GetError());
  126.         exit(1);
  127.     }
  128.     printf("Set 640x480 at %d bits-per-pixel mode\n",
  129.            screen-&#62;format-&#62;BitsPerPixel);</PRE
  130. ></P
  131. ></DIV
  132. ><DIV
  133. CLASS="SECT2"
  134. ><H2
  135. CLASS="SECT2"
  136. ><A
  137. NAME="AEN383"
  138. >Loading and displaying a BMP file</A
  139. ></H2
  140. ><P
  141. ><PRE
  142. CLASS="PROGRAMLISTING"
  143. >    SDL_Surface *image;
  144.     SDL_Rect dest;
  145.     int ncolors, i;
  146.     SDL_Color *colors;
  147.  
  148.     /* Load the BMP file into a surface */
  149.     image = SDL_LoadBMP("sample.bmp");
  150.     if ( image == NULL ) {
  151.         fprintf(stderr, "Couldn't load sample.bmp: %s\n",
  152.                         SDL_GetError());
  153.         return;
  154.     }
  155.  
  156.     /* Set the display colors -- SDL_SetColors() only does something on
  157.        palettized displays, but it doesn't hurt anything on HiColor or
  158.       TrueColor displays.
  159.       If the display colors have already been set, this step can be
  160.       skipped, and the library will automatically map the image to
  161.       the current display colors.
  162.    */
  163.    if ( image-&#62;format-&#62;palette ) {
  164.        ncolors = image-&#62;format-&#62;palette-&#62;ncolors;
  165.        colors  = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  166.        memcpy(colors, image-&#62;format-&#62;palette-&#62;colors, ncolors);
  167.    }
  168.    else {
  169.        int r, g, b;
  170.  
  171.        /* Allocate 256 color palette */
  172.        ncolors = 256;
  173.        colors  = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color));
  174.  
  175.        /* Set a 3,3,2 color cube */
  176.        for ( r=0; r&#60;8; ++r ) {
  177.            for ( g=0; g&#60;8; ++g ) {
  178.                for ( b=0; b&#60;4; ++b ) {
  179.                    i = ((r&#60;&#60;5)|(g&#60;&#60;2)|b);
  180.                    colors[i].r = r&#60;&#60;5;
  181.                    colors[i].g = g&#60;&#60;5;
  182.                    colors[i].b = b&#60;&#60;6;
  183.                }
  184.            }
  185.        }
  186.        /* Note: A better way of allocating the palette might be
  187.           to calculate the frequency of colors in the image
  188.           and create a palette based on that information.
  189.        */
  190.    }
  191.    /* Set colormap, try for all the colors, but don't worry about it */
  192.     SDL_SetColors(screen, colors, 0, ncolors);
  193.     free(colors);
  194.  
  195.     /* Blit onto the screen surface */
  196.     dest.x = 0;
  197.     dest.y = 0;
  198.     dest.w = image-&#62;w;
  199.     dest.h = image-&#62;h;
  200.     SDL_BlitSurface(image, NULL, screen, &#38;dest);
  201.  
  202.     SDL_UpdateRects(screen, 1, &#38;dest);
  203.  
  204.     /* Free the allocated BMP surface */
  205.     SDL_FreeSurface(image);
  206.     return;</PRE
  207. ></P
  208. ></DIV
  209. ><DIV
  210. CLASS="SECT2"
  211. ><H2
  212. CLASS="SECT2"
  213. ><A
  214. NAME="AEN387"
  215. >Drawing directly to the display</A
  216. ></H2
  217. ><P
  218. ><PRE
  219. CLASS="PROGRAMLISTING"
  220. >    /* Code to set a yellow pixel at the center of the screen */
  221.  
  222.     Sint32   X, Y;
  223.     Uint32   pixel;
  224.     Uint8   *bits, bpp;
  225.  
  226.     /* Map the color yellow to this display (R=0xFF, G=0xFF, B=0x00)
  227.        Note:  If the display is palettized, you must set the palette first.
  228.     */
  229.     pixel = SDL_MapRGB(screen-&#62;format, 0xFF, 0xFF, 0x00);
  230.  
  231.     /* Calculate the framebuffer offset of the center of the screen */
  232.     if ( SDL_MUSTLOCK(screen) ) {
  233.         if ( SDL_LockSurface(screen) &#60; 0 )
  234.             return;
  235.     }
  236.     bpp = screen-&#62;format-&#62;BytesPerPixel;
  237.     X = screen-&#62;w/2;
  238.     Y = screen-&#62;h/2;
  239.     bits = ((Uint8 *)screen-&#62;pixels)+Y*screen-&#62;pitch+X*bpp;
  240.  
  241.     /* Set the pixel */
  242.     switch(bpp) {
  243.         case 1:
  244.             *((Uint8 *)(bits)) = (Uint8)pixel;
  245.             break;
  246.         case 2:
  247.             *((Uint16 *)(bits)) = (Uint16)pixel;
  248.             break;
  249.         case 3: { /* Format/endian independent */
  250.             Uint8 r, g, b;
  251.  
  252.             r = (pixel&#62;&#62;screen-&#62;format-&#62;Rshift)&#38;0xFF;
  253.             g = (pixel&#62;&#62;screen-&#62;format-&#62;Gshift)&#38;0xFF;
  254.             b = (pixel&#62;&#62;screen-&#62;format-&#62;Bshift)&#38;0xFF;
  255.             *((bits)+screen-&#62;format-&#62;Rshift/8) = r;
  256.             *((bits)+screen-&#62;format-&#62;Gshift/8) = g;
  257.             *((bits)+screen-&#62;format-&#62;Bshift/8) = b;
  258.             }
  259.             break;
  260.         case 4:
  261.             *((Uint32 *)(bits)) = (Uint32)pixel;
  262.             break;
  263.     }
  264.  
  265.     /* Update the display */
  266.     if ( SDL_MUSTLOCK(screen) ) {
  267.         SDL_UnlockSurface(screen);
  268.     }
  269.     SDL_UpdateRect(screen, X, Y, 1, 1);
  270.  
  271.     return;</PRE
  272. ></P
  273. ></DIV
  274. ><DIV
  275. CLASS="SECT2"
  276. ><H2
  277. CLASS="SECT2"
  278. ><A
  279. NAME="AEN391"
  280. >Fastest possible surface blit</A
  281. ></H2
  282. ><P
  283. >There are three different ways you can draw an image to the screen:
  284. <P
  285. ></P
  286. ><TABLE
  287. BORDER="0"
  288. ><TBODY
  289. ><TR
  290. ><TD
  291. >1.Create a surface and use <A
  292. HREF="sdlblitsurface.html"
  293. ><TT
  294. CLASS="FUNCTION"
  295. >SDL_BlitSurface</TT
  296. ></A
  297. > to blit it to the screen</TD
  298. ></TR
  299. ><TR
  300. ><TD
  301. >2.Create the video surface in system memory and call <A
  302. HREF="sdlupdaterect.html"
  303. ><TT
  304. CLASS="FUNCTION"
  305. >SDL_UpdateRect</TT
  306. ></A
  307. ></TD
  308. ></TR
  309. ><TR
  310. ><TD
  311. >3.Create the video surface in video memory and call <A
  312. HREF="sdllocksurface.html"
  313. ><TT
  314. CLASS="FUNCTION"
  315. >SDL_LockSurface</TT
  316. ></A
  317. ></TD
  318. ></TR
  319. ></TBODY
  320. ></TABLE
  321. ><P
  322. ></P
  323. >
  324. The best way to do this is to combine methods:
  325. <PRE
  326. CLASS="PROGRAMLISTING"
  327. >#include &#60;stdio.h&#62;
  328. #include &#60;stdlib.h&#62;
  329. #include "SDL.h"
  330. #include "SDL_timer.h"
  331.  
  332. void ComplainAndExit(void)
  333. {
  334.     fprintf(stderr, "Problem: %s\n", SDL_GetError());
  335.     exit(1);
  336. }
  337.  
  338. int main(int argc, char *argv[])
  339. {
  340.     SDL_PixelFormat fmt;
  341.     SDL_Surface *screen, *locked;
  342.     SDL_Surface *imagebmp, *image;
  343.     SDL_Rect dstrect;
  344.     int i;
  345.     Uint8 *buffer;
  346.  
  347.     /* Initialize SDL */
  348.     if ( SDL_Init(SDL_INIT_VIDEO) &#60; 0 ) {
  349.         ComplainAndExit();
  350.     }
  351.     atexit(SDL_Quit);
  352.  
  353.     /* Load a BMP image into a surface */
  354.     imagebmp = SDL_LoadBMP("image.bmp");
  355.     if ( imagebmp == NULL ) {
  356.         ComplainAndExit();
  357.     }
  358.  
  359.     /* Set the video mode (640x480 at native depth) */
  360.     screen = SDL_SetVideoMode(640, 480, 0, SDL_HWSURFACE|SDL_FULLSCREEN);
  361.     if ( screen == NULL ) {
  362.         ComplainAndExit();
  363.     }
  364.  
  365.     /* Set the video colormap */
  366.     if ( imagebmp-&#62;format-&#62;palette != NULL ) {
  367.         SDL_SetColors(screen,
  368.                       imagebmp-&#62;format-&#62;palette-&#62;colors, 0,
  369.                       imagebmp-&#62;format-&#62;palette-&#62;ncolors);
  370.     }
  371.  
  372.     /* Convert the image to the video format (maps colors) */
  373.     image = SDL_DisplayFormat(imagebmp);
  374.     SDL_FreeSurface(imagebmp);
  375.     if ( image == NULL ) {
  376.         ComplainAndExit();
  377.     }
  378.  
  379.     /* Draw bands of color on the raw surface */
  380.     if ( SDL_MUSTLOCK(screen) ) {
  381.         if ( SDL_LockSurface(screen) &#60; 0 )
  382.             ComplainAndExit();
  383.     }
  384.     buffer=(Uint8 *)screen-&#62;pixels;
  385.     for ( i=0; i&#60;screen-&#62;h; ++i ) {
  386.         memset(buffer,(i*255)/screen-&#62;h,
  387.                screen-&#62;w*screen-&#62;format-&#62;BytesPerPixel);
  388.                buffer += screen-&#62;pitch;
  389.     }
  390.     if ( SDL_MUSTLOCK(screen) ) {
  391.         SDL_UnlockSurface(screen);
  392.     }
  393.  
  394.     /* Blit the image to the center of the screen */
  395.     dstrect.x = (screen-&#62;w-image-&#62;w)/2;
  396.     dstrect.y = (screen-&#62;h-image-&#62;h)/2;
  397.     dstrect.w = image-&#62;w;
  398.     dstrect.h = image-&#62;h;
  399.     if ( SDL_BlitSurface(image, NULL, screen, &#38;dstrect) &#60; 0 ) {
  400.         SDL_FreeSurface(image);
  401.         ComplainAndExit();
  402.     }
  403.     SDL_FreeSurface(image);
  404.  
  405.     /* Update the screen */
  406.     SDL_UpdateRects(screen, 1, &#38;dstrect);
  407.  
  408.     SDL_Delay(5000);        /* Wait 5 seconds */
  409.     exit(0);
  410. }</PRE
  411. ></P
  412. ></DIV
  413. ></DIV
  414. ><DIV
  415. CLASS="NAVFOOTER"
  416. ><HR
  417. ALIGN="LEFT"
  418. WIDTH="100%"><TABLE
  419. WIDTH="100%"
  420. BORDER="0"
  421. CELLPADDING="0"
  422. CELLSPACING="0"
  423. ><TR
  424. ><TD
  425. WIDTH="33%"
  426. ALIGN="left"
  427. VALIGN="top"
  428. ><A
  429. HREF="guideexamples.html"
  430. >Prev</A
  431. ></TD
  432. ><TD
  433. WIDTH="34%"
  434. ALIGN="center"
  435. VALIGN="top"
  436. ><A
  437. HREF="index.html"
  438. >Home</A
  439. ></TD
  440. ><TD
  441. WIDTH="33%"
  442. ALIGN="right"
  443. VALIGN="top"
  444. ><A
  445. HREF="guideeventexamples.html"
  446. >Next</A
  447. ></TD
  448. ></TR
  449. ><TR
  450. ><TD
  451. WIDTH="33%"
  452. ALIGN="left"
  453. VALIGN="top"
  454. >Examples</TD
  455. ><TD
  456. WIDTH="34%"
  457. ALIGN="center"
  458. VALIGN="top"
  459. ><A
  460. HREF="guideexamples.html"
  461. >Up</A
  462. ></TD
  463. ><TD
  464. WIDTH="33%"
  465. ALIGN="right"
  466. VALIGN="top"
  467. >Event Examples</TD
  468. ></TR
  469. ></TABLE
  470. ></DIV
  471. ></BODY
  472. ></HTML
  473. >