NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.64
REL="HOME"
TITLE="SDL Library Documentation"
REL="UP"
TITLE="Video"
REL="PREVIOUS"
TITLE="SDL_Palette"
HREF="sdlpalette.html"><
LINK
REL="NEXT"
TITLE="SDL_Surface"
HREF="sdlsurface.html"><
/HEAD
CLASS="REFENTRY"
BGCOLOR="#FFF8DC"
TEXT="#000000"
LINK="#0000ee"
VLINK="#551a8b"
ALINK="#ff0000"
CLASS="NAVHEADER"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
COLSPAN="3"
ALIGN="center"
>SDL Library Documentation<
/TH
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
HREF="sdlpalette.html"
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
HREF="sdlsurface.html"
ALIGN="LEFT"
NAME="SDLPIXELFORMAT"
CLASS="REFNAMEDIV"
NAME="AEN2756"
>SDL_PixelFormat -- Stores surface format information<
/DIV
CLASS="REFSECT1"
NAME="AEN2759"
>Structure Definition<
/H2
CLASS="PROGRAMLISTING"
>typedef struct{
SDL_Palette *palette;
Uint8 BitsPerPixel;
Uint8 BytesPerPixel;
Uint32 Rmask, Gmask, Bmask, Amask;
Uint8 Rshift, Gshift, Bshift, Ashift;
Uint8 Rloss, Gloss, Bloss, Aloss;
Uint32 colorkey;
Uint8 alpha;
CLASS="REFSECT1"
NAME="AEN2762"
CLASS="INFORMALTABLE"
NAME="AEN2764"
BORDER="0"
CLASS="CALSTABLE"
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
HREF="sdlpalette.html"
CLASS="LITERAL"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>The number of bits used to represent each pixel in a surface. Usually
8,
16,
24 or
32.<
/TD
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>The number of bytes used to represent each pixel in a surface. Usually one to four.<
/TD
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>Binary mask used to retrieve individual
color values<
/TD
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>Precision loss of each
color component
(2<
SUP
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>Binary left shift of each
color component in the pixel value<
/TD
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>Pixel
value of transparent pixels<
/TD
ALIGN="LEFT"
VALIGN="TOP"
CLASS="STRUCTFIELD"
ALIGN="LEFT"
VALIGN="TOP"
>Overall surface alpha value<
/TD
CLASS="REFSECT1"
NAME="AEN2803"
CLASS="STRUCTNAME"
> describes the format of the pixel
data stored at the <
TT
CLASS="STRUCTFIELD"
HREF="sdlsurface.html"
CLASS="STRUCTNAME"
>. Every surface stores a <
SPAN
CLASS="STRUCTNAME"
CLASS="STRUCTFIELD"
>If you wish to do pixel level modifications on a surface, then understanding how SDL stores its
color information is essential.<
/P
>
8-bit pixel formats are the easiest to understand. Since its an
8-bit format, we have
8 <
TT
CLASS="STRUCTFIELD"
CLASS="STRUCTFIELD"
CLASS="STRUCTFIELD"
> is
1, all pixels are represented by a Uint8 which contains an index into <
TT
CLASS="STRUCTFIELD"
CLASS="STRUCTFIELD"
>. So, to determine the
color of a pixel in a
8-bit surface: we read the
color index from <
SPAN
CLASS="STRUCTNAME"
CLASS="STRUCTFIELD"
> and we use that index to read the <
A
HREF="sdlcolor.html"
CLASS="STRUCTNAME"
CLASS="STRUCTNAME"
CLASS="STRUCTFIELD"
CLASS="STRUCTFIELD"
CLASS="STRUCTFIELD"
>. Like so:
CLASS="PROGRAMLISTING"
>SDL_Surface *surface;
SDL_PixelFormat *fmt;
SDL_Color *color;
Uint8 index;
.
.
/* Create surface */
.
.
fmt=surface->format;
/* Check the bitdepth of the surface */
if(fmt->BitsPerPixel!=8){
fprintf(stderr, "Not an 8-bit surface.\n");
return(-1);
}
/* Lock the surface */
SDL_LockSurface(surface);
/* Get the topleft pixel */
index=*(Uint8 *)surface->pixels;
color=fmt->palette->colors[index];
/* Unlock the surface */
SDL_UnlockSurface(surface);
printf("Pixel Color-> Red: %d, Green: %d, Blue: %d. Index: %d\n",
color->r, color->g, color->b, index);
.
>Pixel formats above 8-bit are an entirely different experience. They are
considered to be "TrueColor" formats and the color information is stored in the
pixels themselves, not in a palette. The mask, shift and loss fields tell us
how the color information is encoded. The mask fields allow us to isolate each
color component, the shift fields tell us the number of bits to the right of
each component in the pixel value and the loss fields tell us the number of
bits lost from each component when packing 8-bit color component in a pixel.
CLASS="PROGRAMLISTING"
>/* Extracting color components from a 32-bit color value */
SDL_PixelFormat *fmt;
SDL_Surface *surface;
Uint32 temp, pixel;
Uint8 red, green, blue, alpha;
.
.
.
fmt=surface->format;
SDL_LockSurface(surface);
pixel=*((Uint32*)surface->pixels);
SDL_UnlockSurface(surface);
/* Get Red component */
temp=pixel&fmt->Rmask; /* Isolate red component */
temp=temp>>fmt->Rshift;/* Shift it down to 8-bit */
temp=temp<<fmt->Rloss; /* Expand to a full 8-bit number */
red=(Uint8)temp;
/* Get Green component */
temp=pixel&fmt->Gmask; /* Isolate green component */
temp=temp>>fmt->Gshift;/* Shift it down to 8-bit */
temp=temp<<fmt->Gloss; /* Expand to a full 8-bit number */
green=(Uint8)temp;
/* Get Blue component */
temp=pixel&fmt->Bmask; /* Isolate blue component */
temp=temp>>fmt->Bshift;/* Shift it down to 8-bit */
temp=temp<<fmt->Bloss; /* Expand to a full 8-bit number */
blue=(Uint8)temp;
/* Get Alpha component */
temp=pixel&fmt->Amask; /* Isolate alpha component */
temp=temp>>fmt->Ashift;/* Shift it down to 8-bit */
temp=temp<<fmt->Aloss; /* Expand to a full 8-bit number */
alpha=(Uint8)temp;
printf("Pixel Color -> R: %d, G: %d, B: %d, A: %d\n", red, green, blue, alpha);
.
.
CLASS="REFSECT1"
NAME="AEN2830"
HREF="sdlsurface.html"
CLASS="STRUCTNAME"
>,
HREF="sdlmaprgb.html"
CLASS="FUNCTION"
CLASS="NAVFOOTER"
ALIGN="LEFT"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
WIDTH="33%"
ALIGN="left"
VALIGN="top"
HREF="sdlpalette.html"
WIDTH="34%"
ALIGN="center"
VALIGN="top"
HREF="index.html"
WIDTH="33%"
ALIGN="right"
VALIGN="top"
HREF="sdlsurface.html"
WIDTH="33%"
ALIGN="left"
VALIGN="top"
WIDTH="34%"
ALIGN="center"
VALIGN="top"
HREF="video.html"
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>