Main Page | Class Hierarchy | Class List | Directories | File List | Class Members | Related Pages

sdlpixel.hpp

00001 /*      _______   __   __   __   ______   __   __   _______   __   __                 
00002  *     / _____/\ / /\ / /\ / /\ / ____/\ / /\ / /\ / ___  /\ /  |\/ /\                
00003  *    / /\____\// / // / // / // /\___\// /_// / // /\_/ / // , |/ / /                 
00004  *   / / /__   / / // / // / // / /    / ___  / // ___  / // /| ' / /                  
00005  *  / /_// /\ / /_// / // / // /_/_   / / // / // /\_/ / // / |  / /                   
00006  * /______/ //______/ //_/ //_____/\ /_/ //_/ //_/ //_/ //_/ /|_/ /                    
00007  * \______\/ \______\/ \_\/ \_____\/ \_\/ \_\/ \_\/ \_\/ \_\/ \_\/                      
00008  *
00009  * Copyright (c) 2004, 2005 darkbits                        Js_./
00010  * Per Larsson a.k.a finalman                          _RqZ{a<^_aa
00011  * Olof Naessén a.k.a jansem/yakslem                _asww7!uY`>  )\a//
00012  *                                                 _Qhm`] _f "'c  1!5m
00013  * Visit: http://guichan.darkbits.org             )Qk<P ` _: :+' .'  "{[
00014  *                                               .)j(] .d_/ '-(  P .   S
00015  * License: (BSD)                                <Td/Z <fP"5(\"??"\a.  .L
00016  * Redistribution and use in source and          _dV>ws?a-?'      ._/L  #'
00017  * binary forms, with or without                 )4d[#7r, .   '     )d`)[
00018  * modification, are permitted provided         _Q-5'5W..j/?'   -?!\)cam'
00019  * that the following conditions are met:       j<<WP+k/);.        _W=j f
00020  * 1. Redistributions of source code must       .$%w\/]Q  . ."'  .  mj$
00021  *    retain the above copyright notice,        ]E.pYY(Q]>.   a     J@\
00022  *    this list of conditions and the           j(]1u<sE"L,. .   ./^ ]{a
00023  *    following disclaimer.                     4'_uomm\.  )L);-4     (3=
00024  * 2. Redistributions in binary form must        )_]X{Z('a_"a7'<a"a,  ]"[
00025  *    reproduce the above copyright notice,       #}<]m7`Za??4,P-"'7. ).m
00026  *    this list of conditions and the            ]d2e)Q(<Q(  ?94   b-  LQ/
00027  *    following disclaimer in the                <B!</]C)d_, '(<' .f. =C+m
00028  *    documentation and/or other materials      .Z!=J ]e []('-4f _ ) -.)m]'
00029  *    provided with the distribution.          .w[5]' _[ /.)_-"+?   _/ <W"
00030  * 3. Neither the name of Guichan nor the      :$we` _! + _/ .        j?
00031  *    names of its contributors may be used     =3)= _f  (_yQmWW$#(    "
00032  *    to endorse or promote products derived     -   W,  sQQQQmZQ#Wwa]..
00033  *    from this software without specific        (js, \[QQW$QWW#?!V"".
00034  *    prior written permission.                    ]y:.<\..          .
00035  *                                                 -]n w/ '         [.
00036  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT       )/ )/           !
00037  * HOLDERS AND CONTRIBUTORS "AS IS" AND ANY         <  (; sac    ,    '
00038  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING,               ]^ .-  %
00039  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF            c <   r
00040  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR            aga<  <La
00041  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE          5%  )P'-3L
00042  * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR        _bQf` y`..)a
00043  * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,          ,J?4P'.P"_(\?d'.,
00044  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES               _Pa,)!f/<[]/  ?"
00045  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT      _2-..:. .r+_,.. .
00046  * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     ?a.<%"'  " -'.a_ _,
00047  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION)                     ^
00048  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
00049  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00050  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00051  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
00052  * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00053  */
00054 
00055 #ifndef GCN_SDLPIXEL_HPP
00056 #define GCN_SDLPIXEL_HPP
00057 
00058 #include "SDL.h"
00059 
00060 #include "guichan/color.hpp"
00061 
00062 namespace gcn
00063 {
00064 
00073     inline const Color SDLgetPixel(SDL_Surface* surface, int x, int y)
00074     {
00075         int bpp = surface->format->BytesPerPixel;
00076 
00077         SDL_LockSurface(surface);
00078 
00079         Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
00080     
00081         unsigned int color = 0;
00082     
00083         switch(bpp)
00084         {
00085           case 1:
00086               color = *p;
00087               break;
00088         
00089           case 2:
00090               color = *(Uint16 *)p;
00091               break;
00092         
00093           case 3:
00094               if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00095               {
00096                   color = p[0] << 16 | p[1] << 8 | p[2];
00097               }
00098               else
00099               {
00100                   color = p[0] | p[1] << 8 | p[2] << 16;
00101               }
00102               break;
00103         
00104           case 4:
00105               color = *(Uint32 *)p;
00106               break;
00107         
00108         }
00109 
00110         unsigned char r,g,b,a;
00111     
00112         SDL_GetRGBA(color, surface->format, &r, &g, &b, &a);
00113         SDL_UnlockSurface(surface);
00114 
00115         return Color(r,g,b,a);
00116     }
00117 
00125     inline void SDLputPixel(SDL_Surface* surface, int x, int y, const Color& color)
00126     {
00127         int bpp = surface->format->BytesPerPixel;
00128         
00129         SDL_LockSurface(surface);
00130 
00131         Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
00132     
00133         Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
00134 
00135         switch(bpp)
00136         {
00137           case 1:
00138               *p = pixel;
00139               break;
00140         
00141           case 2:
00142               *(Uint16 *)p = pixel;
00143               break;
00144         
00145           case 3:
00146               if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00147               {
00148                   p[0] = (pixel >> 16) & 0xff;
00149                   p[1] = (pixel >> 8) & 0xff;
00150                   p[2] = pixel & 0xff;
00151               }
00152               else
00153               {
00154                   p[0] = pixel & 0xff;
00155                   p[1] = (pixel >> 8) & 0xff;
00156                   p[2] = (pixel >> 16) & 0xff;
00157               }
00158               break;
00159         
00160           case 4:
00161               *(Uint32 *)p = pixel;
00162               break;
00163         }
00164     
00165         SDL_UnlockSurface(surface);
00166     }
00167 
00175     inline unsigned int SDLAlpha32(unsigned int src, unsigned int dst, unsigned char a)
00176     {
00177         unsigned int b = ((src & 0xff) * a + (dst & 0xff) * (255 - a)) >> 8;
00178         unsigned int g = ((src & 0xff00) * a + (dst & 0xff00) * (255 - a)) >> 8;
00179         unsigned int r = ((src & 0xff0000) * a + (dst & 0xff0000) * (255 - a)) >> 8;
00180 
00181         return (b & 0xff) | (g & 0xff00) | (r & 0xff0000);
00182     }
00183     
00191     inline void SDLputPixelAlpha(SDL_Surface* surface, int x, int y, const Color& color)
00192     {
00193         int bpp = surface->format->BytesPerPixel;
00194         
00195         SDL_LockSurface(surface);
00196 
00197         Uint8 *p = (Uint8 *)surface->pixels + y * surface->pitch + x * bpp;
00198     
00199         Uint32 pixel = SDL_MapRGB(surface->format, color.r, color.g, color.b);
00200 
00201         switch(bpp)
00202         {
00203           case 1:
00204               *p = pixel;
00205               break;
00206         
00207           case 2:
00208               *(Uint16 *)p = pixel;
00209               break;
00210         
00211           case 3:
00212               if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00213               {
00214                   p[0] = (pixel >> 16) & 0xff;
00215                   p[1] = (pixel >> 8) & 0xff;
00216                   p[2] = pixel & 0xff;
00217               }
00218               else
00219               {
00220                   p[0] = pixel & 0xff;
00221                   p[1] = (pixel >> 8) & 0xff;
00222                   p[2] = (pixel >> 16) & 0xff;
00223               }
00224               break;
00225         
00226           case 4:
00227               *(Uint32 *)p = SDLAlpha32(pixel, *(Uint32 *)p, color.a);
00228               break;
00229         }
00230     
00231         SDL_UnlockSurface(surface);
00232     }
00233 }
00234 
00235 #endif // end GCN_SDLPIXEL_HPP

Generated on Tue May 17 21:23:26 2005 for Guichan by  doxygen 1.4.1