comparison docs/html/guidevideoexamples.html @ 0:74212992fb08

Initial revision
author Sam Lantinga <slouken@lokigames.com>
date Thu, 26 Apr 2001 16:45:43 +0000
parents
children 55f1f1b3e27d
comparison
equal deleted inserted replaced
-1:000000000000 0:74212992fb08
1 <HTML
2 ><HEAD
3 ><TITLE
4 >Video Examples</TITLE
5 ><META
6 NAME="GENERATOR"
7 CONTENT="Modular DocBook HTML Stylesheet Version 1.61
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="AEN303"
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="AEN307"
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="AEN311"
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="AEN315"
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="AEN319"
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 >