Mercurial > sdl-ios-xcode
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) < 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->format->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->format->palette ) { | |
164 ncolors = image->format->palette->ncolors; | |
165 colors = (SDL_Color *)malloc(ncolors*sizeof(SDL_Color)); | |
166 memcpy(colors, image->format->palette->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<8; ++r ) { | |
177 for ( g=0; g<8; ++g ) { | |
178 for ( b=0; b<4; ++b ) { | |
179 i = ((r<<5)|(g<<2)|b); | |
180 colors[i].r = r<<5; | |
181 colors[i].g = g<<5; | |
182 colors[i].b = b<<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->w; | |
199 dest.h = image->h; | |
200 SDL_BlitSurface(image, NULL, screen, &dest); | |
201 | |
202 SDL_UpdateRects(screen, 1, &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->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) < 0 ) | |
234 return; | |
235 } | |
236 bpp = screen->format->BytesPerPixel; | |
237 X = screen->w/2; | |
238 Y = screen->h/2; | |
239 bits = ((Uint8 *)screen->pixels)+Y*screen->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>>screen->format->Rshift)&0xFF; | |
253 g = (pixel>>screen->format->Gshift)&0xFF; | |
254 b = (pixel>>screen->format->Bshift)&0xFF; | |
255 *((bits)+screen->format->Rshift/8) = r; | |
256 *((bits)+screen->format->Gshift/8) = g; | |
257 *((bits)+screen->format->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 <stdio.h> | |
328 #include <stdlib.h> | |
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) < 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->format->palette != NULL ) { | |
367 SDL_SetColors(screen, | |
368 imagebmp->format->palette->colors, 0, | |
369 imagebmp->format->palette->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) < 0 ) | |
382 ComplainAndExit(); | |
383 } | |
384 buffer=(Uint8 *)screen->pixels; | |
385 for ( i=0; i<screen->h; ++i ) { | |
386 memset(buffer,(i*255)/screen->h, | |
387 screen->w*screen->format->BytesPerPixel); | |
388 buffer += screen->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->w-image->w)/2; | |
396 dstrect.y = (screen->h-image->h)/2; | |
397 dstrect.w = image->w; | |
398 dstrect.h = image->h; | |
399 if ( SDL_BlitSurface(image, NULL, screen, &dstrect) < 0 ) { | |
400 SDL_FreeSurface(image); | |
401 ComplainAndExit(); | |
402 } | |
403 SDL_FreeSurface(image); | |
404 | |
405 /* Update the screen */ | |
406 SDL_UpdateRects(screen, 1, &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 > |