forked from KolibriOS/kolibrios
520 lines
8.1 KiB
HTML
520 lines
8.1 KiB
HTML
|
<HTML
|
||
|
><HEAD
|
||
|
><TITLE
|
||
|
>SDL_PixelFormat</TITLE
|
||
|
><META
|
||
|
NAME="GENERATOR"
|
||
|
CONTENT="Modular DocBook HTML Stylesheet Version 1.64
|
||
|
"><LINK
|
||
|
REL="HOME"
|
||
|
TITLE="SDL Library Documentation"
|
||
|
HREF="index.html"><LINK
|
||
|
REL="UP"
|
||
|
TITLE="Video"
|
||
|
HREF="video.html"><LINK
|
||
|
REL="PREVIOUS"
|
||
|
TITLE="SDL_Palette"
|
||
|
HREF="sdlpalette.html"><LINK
|
||
|
REL="NEXT"
|
||
|
TITLE="SDL_Surface"
|
||
|
HREF="sdlsurface.html"></HEAD
|
||
|
><BODY
|
||
|
CLASS="REFENTRY"
|
||
|
BGCOLOR="#FFF8DC"
|
||
|
TEXT="#000000"
|
||
|
LINK="#0000ee"
|
||
|
VLINK="#551a8b"
|
||
|
ALINK="#ff0000"
|
||
|
><DIV
|
||
|
CLASS="NAVHEADER"
|
||
|
><TABLE
|
||
|
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="sdlpalette.html"
|
||
|
>Prev</A
|
||
|
></TD
|
||
|
><TD
|
||
|
WIDTH="80%"
|
||
|
ALIGN="center"
|
||
|
VALIGN="bottom"
|
||
|
></TD
|
||
|
><TD
|
||
|
WIDTH="10%"
|
||
|
ALIGN="right"
|
||
|
VALIGN="bottom"
|
||
|
><A
|
||
|
HREF="sdlsurface.html"
|
||
|
>Next</A
|
||
|
></TD
|
||
|
></TR
|
||
|
></TABLE
|
||
|
><HR
|
||
|
ALIGN="LEFT"
|
||
|
WIDTH="100%"></DIV
|
||
|
><H1
|
||
|
><A
|
||
|
NAME="SDLPIXELFORMAT"
|
||
|
>SDL_PixelFormat</A
|
||
|
></H1
|
||
|
><DIV
|
||
|
CLASS="REFNAMEDIV"
|
||
|
><A
|
||
|
NAME="AEN2756"
|
||
|
></A
|
||
|
><H2
|
||
|
>Name</H2
|
||
|
>SDL_PixelFormat -- Stores surface format information</DIV
|
||
|
><DIV
|
||
|
CLASS="REFSECT1"
|
||
|
><A
|
||
|
NAME="AEN2759"
|
||
|
></A
|
||
|
><H2
|
||
|
>Structure Definition</H2
|
||
|
><PRE
|
||
|
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;
|
||
|
} SDL_PixelFormat;</PRE
|
||
|
></DIV
|
||
|
><DIV
|
||
|
CLASS="REFSECT1"
|
||
|
><A
|
||
|
NAME="AEN2762"
|
||
|
></A
|
||
|
><H2
|
||
|
>Structure Data</H2
|
||
|
><DIV
|
||
|
CLASS="INFORMALTABLE"
|
||
|
><A
|
||
|
NAME="AEN2764"
|
||
|
></A
|
||
|
><P
|
||
|
></P
|
||
|
><TABLE
|
||
|
BORDER="0"
|
||
|
CLASS="CALSTABLE"
|
||
|
><TBODY
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>palette</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Pointer to the <A
|
||
|
HREF="sdlpalette.html"
|
||
|
>palette</A
|
||
|
>, or <TT
|
||
|
CLASS="LITERAL"
|
||
|
>NULL</TT
|
||
|
> if the <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BitsPerPixel</I
|
||
|
></TT
|
||
|
>>8</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BitsPerPixel</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>The number of bits used to represent each pixel in a surface. Usually 8, 16, 24 or 32.</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BytesPerPixel</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>The number of bytes used to represent each pixel in a surface. Usually one to four.</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>[RGBA]mask</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Binary mask used to retrieve individual color values</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>[RGBA]loss</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Precision loss of each color component (2<SUP
|
||
|
>[RGBA]loss</SUP
|
||
|
>)</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>[RGBA]shift</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Binary left shift of each color component in the pixel value</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>colorkey</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Pixel value of transparent pixels</TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>alpha</I
|
||
|
></TT
|
||
|
></TD
|
||
|
><TD
|
||
|
ALIGN="LEFT"
|
||
|
VALIGN="TOP"
|
||
|
>Overall surface alpha value</TD
|
||
|
></TR
|
||
|
></TBODY
|
||
|
></TABLE
|
||
|
><P
|
||
|
></P
|
||
|
></DIV
|
||
|
></DIV
|
||
|
><DIV
|
||
|
CLASS="REFSECT1"
|
||
|
><A
|
||
|
NAME="AEN2803"
|
||
|
></A
|
||
|
><H2
|
||
|
>Description</H2
|
||
|
><P
|
||
|
>A <SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>SDL_PixelFormat</SPAN
|
||
|
> describes the format of the pixel data stored at the <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>pixels</I
|
||
|
></TT
|
||
|
> field of a <A
|
||
|
HREF="sdlsurface.html"
|
||
|
><SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>SDL_Surface</SPAN
|
||
|
></A
|
||
|
>. Every surface stores a <SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>SDL_PixelFormat</SPAN
|
||
|
> in the <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>format</I
|
||
|
></TT
|
||
|
> field.</P
|
||
|
><P
|
||
|
>If you wish to do pixel level modifications on a surface, then understanding how SDL stores its color information is essential.</P
|
||
|
><P
|
||
|
>8-bit pixel formats are the easiest to understand. Since its an 8-bit format, we have 8 <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BitsPerPixel</I
|
||
|
></TT
|
||
|
> and 1 <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BytesPerPixel</I
|
||
|
></TT
|
||
|
>. Since <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>BytesPerPixel</I
|
||
|
></TT
|
||
|
> is 1, all pixels are represented by a Uint8 which contains an index into <TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>palette</I
|
||
|
></TT
|
||
|
>-><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>colors</I
|
||
|
></TT
|
||
|
>. So, to determine the color of a pixel in a 8-bit surface: we read the color index from <SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>surface</SPAN
|
||
|
>-><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>pixels</I
|
||
|
></TT
|
||
|
> and we use that index to read the <A
|
||
|
HREF="sdlcolor.html"
|
||
|
><SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>SDL_Color</SPAN
|
||
|
></A
|
||
|
> structure from <SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>surface</SPAN
|
||
|
>-><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>format</I
|
||
|
></TT
|
||
|
>-><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>palette</I
|
||
|
></TT
|
||
|
>-><TT
|
||
|
CLASS="STRUCTFIELD"
|
||
|
><I
|
||
|
>colors</I
|
||
|
></TT
|
||
|
>. Like so:
|
||
|
<PRE
|
||
|
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);
|
||
|
.
|
||
|
.</PRE
|
||
|
></P
|
||
|
><P
|
||
|
>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.
|
||
|
<PRE
|
||
|
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);
|
||
|
.
|
||
|
.
|
||
|
.</PRE
|
||
|
></P
|
||
|
></DIV
|
||
|
><DIV
|
||
|
CLASS="REFSECT1"
|
||
|
><A
|
||
|
NAME="AEN2830"
|
||
|
></A
|
||
|
><H2
|
||
|
>See Also</H2
|
||
|
><P
|
||
|
><A
|
||
|
HREF="sdlsurface.html"
|
||
|
><SPAN
|
||
|
CLASS="STRUCTNAME"
|
||
|
>SDL_Surface</SPAN
|
||
|
></A
|
||
|
>,
|
||
|
<A
|
||
|
HREF="sdlmaprgb.html"
|
||
|
><TT
|
||
|
CLASS="FUNCTION"
|
||
|
>SDL_MapRGB</TT
|
||
|
></A
|
||
|
></P
|
||
|
></DIV
|
||
|
><DIV
|
||
|
CLASS="NAVFOOTER"
|
||
|
><HR
|
||
|
ALIGN="LEFT"
|
||
|
WIDTH="100%"><TABLE
|
||
|
WIDTH="100%"
|
||
|
BORDER="0"
|
||
|
CELLPADDING="0"
|
||
|
CELLSPACING="0"
|
||
|
><TR
|
||
|
><TD
|
||
|
WIDTH="33%"
|
||
|
ALIGN="left"
|
||
|
VALIGN="top"
|
||
|
><A
|
||
|
HREF="sdlpalette.html"
|
||
|
>Prev</A
|
||
|
></TD
|
||
|
><TD
|
||
|
WIDTH="34%"
|
||
|
ALIGN="center"
|
||
|
VALIGN="top"
|
||
|
><A
|
||
|
HREF="index.html"
|
||
|
>Home</A
|
||
|
></TD
|
||
|
><TD
|
||
|
WIDTH="33%"
|
||
|
ALIGN="right"
|
||
|
VALIGN="top"
|
||
|
><A
|
||
|
HREF="sdlsurface.html"
|
||
|
>Next</A
|
||
|
></TD
|
||
|
></TR
|
||
|
><TR
|
||
|
><TD
|
||
|
WIDTH="33%"
|
||
|
ALIGN="left"
|
||
|
VALIGN="top"
|
||
|
>SDL_Palette</TD
|
||
|
><TD
|
||
|
WIDTH="34%"
|
||
|
ALIGN="center"
|
||
|
VALIGN="top"
|
||
|
><A
|
||
|
HREF="video.html"
|
||
|
>Up</A
|
||
|
></TD
|
||
|
><TD
|
||
|
WIDTH="33%"
|
||
|
ALIGN="right"
|
||
|
VALIGN="top"
|
||
|
>SDL_Surface</TD
|
||
|
></TR
|
||
|
></TABLE
|
||
|
></DIV
|
||
|
></BODY
|
||
|
></HTML
|
||
|
>
|