This repository has been archived by the owner on Feb 11, 2021. It is now read-only.
/
guidevideo.html
463 lines (439 loc) · 8.97 KB
1
2
3
4
5
6
<HTML
><HEAD
><TITLE
>Graphics and Video</TITLE
><META
NAME="GENERATOR"
7
CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
8
9
10
11
12
13
14
15
16
17
18
"><LINK
REL="HOME"
TITLE="SDL Library Documentation"
HREF="index.html"><LINK
REL="UP"
TITLE="SDL Guide"
HREF="guide.html"><LINK
REL="PREVIOUS"
TITLE="Initializing SDL"
HREF="guidebasicsinit.html"><LINK
REL="NEXT"
19
20
TITLE="Using OpenGL With SDL"
HREF="guidevideoopengl.html"></HEAD
21
22
23
24
25
26
27
28
29
30
><BODY
CLASS="CHAPTER"
BGCOLOR="#FFF8DC"
TEXT="#000000"
LINK="#0000ee"
VLINK="#551a8b"
ALINK="#ff0000"
><DIV
CLASS="NAVHEADER"
><TABLE
31
SUMMARY="Header navigation table"
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>SDL Library Documentation</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="guidebasicsinit.html"
49
ACCESSKEY="P"
50
51
52
53
54
55
56
57
58
59
60
61
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
62
HREF="guidevideoopengl.html"
63
ACCESSKEY="N"
64
65
66
67
68
69
70
71
72
73
74
75
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="CHAPTER"
><H1
><A
NAME="GUIDEVIDEO"
76
77
></A
>Chapter 2. Graphics and Video</H1
78
><DIV
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="guidevideo.html#GUIDEVIDEOINTRO"
>Introduction to SDL Video</A
></DT
><DT
><A
HREF="guidevideoopengl.html"
>Using OpenGL With SDL</A
></DT
></DL
></DIV
><DIV
98
99
100
101
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
102
NAME="GUIDEVIDEOINTRO"
103
104
></A
>Introduction to SDL Video</H1
105
><P
106
107
108
>Video is probably the most common thing that SDL is used for, and
so it has the most complete subsystem. Here are a few
examples to demonstrate the basics.</P
109
110
111
112
113
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
114
NAME="AEN68"
115
116
></A
>Initializing the Video Display</H2
117
><P
118
119
120
121
122
123
>This is what almost all SDL programs have to do in one way or
another.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN71"
124
></A
125
126
127
128
129
><P
><B
>Example 2-1. Initializing the Video Display</B
></P
><PRE
130
CLASS="PROGRAMLISTING"
131
> SDL_Surface *screen;
132
133
134
135
136
137
/* Initialize the SDL library */
if( SDL_Init(SDL_INIT_VIDEO) < 0 ) {
fprintf(stderr,
"Couldn't initialize SDL: %s\n", SDL_GetError());
exit(1);
138
139
}
140
141
142
/* Clean up on exit */
atexit(SDL_Quit);
143
/*
144
145
* Initialize the display in a 640x480 8-bit palettized mode,
* requesting a software surface
146
*/
147
148
149
150
151
screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
if ( screen == NULL ) {
fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",
SDL_GetError());
exit(1);
152
}</PRE
153
></DIV
154
155
156
157
158
159
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
160
NAME="AEN74"
161
162
></A
>Initializing the Best Video Mode</H2
163
><P
164
165
166
167
168
169
170
171
>If you have a preference for a certain pixel depth but will accept any
other, use SDL_SetVideoMode with SDL_ANYFORMAT as below. You can also
use SDL_VideoModeOK() to find the native video mode that is closest to
the mode you request.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN77"
172
173
></A
><P
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
><B
>Example 2-2. Initializing the Best Video Mode</B
></P
><PRE
CLASS="PROGRAMLISTING"
> /* Have a preference for 8-bit, but accept any depth */
screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE|SDL_ANYFORMAT);
if ( screen == NULL ) {
fprintf(stderr, "Couldn't set 640x480x8 video mode: %s\n",
SDL_GetError());
exit(1);
}
printf("Set 640x480 at %d bits-per-pixel mode\n",
screen->format->BitsPerPixel);</PRE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN80"
196
197
></A
>Loading and Displaying a BMP File</H2
198
199
200
><P
>The following function loads and displays a BMP file given as
argument, once SDL is initialised and a video mode has been set.</P
201
202
203
><DIV
CLASS="EXAMPLE"
><A
204
NAME="AEN83"
205
206
207
></A
><P
><B
208
>Example 2-3. Loading and Displaying a BMP File</B
209
210
211
></P
><PRE
CLASS="PROGRAMLISTING"
212
>void display_bmp(char *file_name)
213
{
214
SDL_Surface *image;
215
216
217
218
219
220
/* Load the BMP file into a surface */
image = SDL_LoadBMP(file_name);
if (image == NULL) {
fprintf(stderr, "Couldn't load %s: %s\n", file_name, SDL_GetError());
return;
221
222
223
}
/*
224
225
226
* Palettized screen modes will have a default palette (a standard
* 8*8*4 colour cube), but if the image is palettized as well we can
* use that palette for a nicer colour matching
227
*/
228
229
230
if (image->format->palette && screen->format->palette) {
SDL_SetColors(screen, image->format->palette->colors, 0,
image->format->palette->ncolors);
231
232
}
233
234
235
/* Blit onto the screen surface */
if(SDL_BlitSurface(image, NULL, screen, NULL) < 0)
fprintf(stderr, "BlitSurface error: %s\n", SDL_GetError());
236
237
SDL_UpdateRect(screen, 0, 0, image->w, image->h);
238
239
240
241
242
243
244
245
246
247
248
249
/* Free the allocated BMP surface */
SDL_FreeSurface(image);
}</PRE
></DIV
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN86"
250
251
></A
>Drawing Directly to the Display</H2
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
><P
>The following two functions can be used to get and set single
pixels of a surface. They are carefully written to work with any depth
currently supported by SDL. Remember to lock the surface before
calling them, and to unlock it before calling any other SDL
functions.</P
><P
>To convert between pixel values and their red, green, blue
components, use SDL_GetRGB() and SDL_MapRGB().</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN90"
></A
><P
><B
>Example 2-4. getpixel()</B
></P
><PRE
CLASS="PROGRAMLISTING"
>/*
* Return the pixel value at (x, y)
* NOTE: The surface must be locked before calling this!
*/
Uint32 getpixel(SDL_Surface *surface, int x, int y)
277
{
278
279
280
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to retrieve */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
281
282
283
284
switch(bpp) {
case 1:
return *p;
285
286
287
case 2:
return *(Uint16 *)p;
288
289
290
291
292
293
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
return p[0] << 16 | p[1] << 8 | p[2];
else
return p[0] | p[1] << 8 | p[2] << 16;
294
295
296
case 4:
return *(Uint32 *)p;
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
default:
return 0; /* shouldn't happen, but avoids warnings */
}
}</PRE
></DIV
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN93"
></A
><P
><B
>Example 2-5. putpixel()</B
></P
><PRE
CLASS="PROGRAMLISTING"
>/*
* Set the pixel at (x, y) to the given value
* NOTE: The surface must be locked before calling this!
*/
void putpixel(SDL_Surface *surface, int x, int y, Uint32 pixel)
319
{
320
321
322
int bpp = surface->format->BytesPerPixel;
/* Here p is the address to the pixel we want to set */
Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
323
324
325
326
327
switch(bpp) {
case 1:
*p = pixel;
break;
328
329
330
331
case 2:
*(Uint16 *)p = pixel;
break;
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
case 3:
if(SDL_BYTEORDER == SDL_BIG_ENDIAN) {
p[0] = (pixel >> 16) & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = pixel & 0xff;
} else {
p[0] = pixel & 0xff;
p[1] = (pixel >> 8) & 0xff;
p[2] = (pixel >> 16) & 0xff;
}
break;
case 4:
*(Uint32 *)p = pixel;
break;
348
}
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
}</PRE
></DIV
><P
>The following code uses the putpixel() function above to set a
yellow pixel in the middle of the screen.</P
><DIV
CLASS="EXAMPLE"
><A
NAME="AEN97"
></A
><P
><B
>Example 2-6. Using putpixel()</B
></P
><PRE
CLASS="PROGRAMLISTING"
> /* Code to set a yellow pixel at the center of the screen */
366
367
368
int x, y;
Uint32 yellow;
369
370
371
372
373
/* Map the color yellow to this display (R=0xff, G=0xFF, B=0x00)
Note: If the display is palettized, you must set the palette first.
*/
yellow = SDL_MapRGB(screen->format, 0xff, 0xff, 0x00);
374
375
376
x = screen->w / 2;
y = screen->h / 2;
377
378
379
380
381
382
383
/* Lock the screen for direct access to the pixels */
if ( SDL_MUSTLOCK(screen) ) {
if ( SDL_LockSurface(screen) < 0 ) {
fprintf(stderr, "Can't lock screen: %s\n", SDL_GetError());
return;
}
384
385
}
386
putpixel(screen, x, y, yellow);
387
388
389
if ( SDL_MUSTLOCK(screen) ) {
SDL_UnlockSurface(screen);
390
}
391
392
/* Update just the part of the display that we've changed */
SDL_UpdateRect(screen, x, y, 1, 1);
393
394
return; </PRE
395
396
397
398
399
400
401
402
403
></DIV
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
404
SUMMARY="Footer navigation table"
405
406
407
408
409
410
411
412
413
414
415
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="guidebasicsinit.html"
416
ACCESSKEY="P"
417
418
419
420
421
422
423
424
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
425
ACCESSKEY="H"
426
427
428
429
430
431
432
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
433
HREF="guidevideoopengl.html"
434
ACCESSKEY="N"
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Initializing SDL</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="guide.html"
450
ACCESSKEY="U"
451
452
453
454
455
456
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
457
>Using OpenGL With SDL</TD
458
459
460
461
462
463
></TR
></TABLE
></DIV
></BODY
></HTML
>