CrystalSpace

Public API Reference

csgfx/packrgb.h

Go to the documentation of this file.
00001 /*
00002     Copyright (C) 1998-2003 by Jorrit Tyberghein
00003                        2003 by Frank Richter
00004 
00005     This library is free software; you can redistribute it and/or
00006     modify it under the terms of the GNU Library General Public
00007     License as published by the Free Software Foundation; either
00008     version 2 of the License, or (at your option) any later version.
00009 
00010     This library is distributed in the hope that it will be useful,
00011     but WITHOUT ANY WARRANTY; without even the implied warranty of
00012     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013     Library General Public License for more details.
00014 
00015     You should have received a copy of the GNU Library General Public
00016     License along with this library; if not, write to the Free
00017     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00018 */
00019 
00025 #ifndef __CSGFX_PACKRGB_H__
00026 #define __CSGFX_PACKRGB_H__
00027 
00028 #include "csextern.h"
00029 
00030 #include "cstypes.h"
00031 #include "csgfx/rgbpixel.h"
00032 
00033 
00055 struct csPackRGB
00056 {
00057   static bool IsRGBcolorSane() { return (sizeof(csRGBcolor) == 3); }
00064   static void PackRGBcolorToRGBBuffer (uint8* buf, 
00065     const csRGBcolor* pixels, size_t numPixels)
00066   {
00067     if (IsRGBcolorSane())
00068       memcpy (buf, pixels, numPixels * 3);
00069     else
00070     {
00071       uint8* bufptr = buf;
00072       while (numPixels--)
00073       {
00074         *bufptr++ = pixels->red;
00075         *bufptr++ = pixels->green;
00076         *bufptr++ = pixels->blue;
00077         pixels++; 
00078       }
00079     }
00080   }
00090   static const uint8* PackRGBcolorToRGB (const csRGBcolor* pixels, 
00091     size_t numPixels)
00092   {
00093     if (IsRGBcolorSane())
00094       return (uint8*)pixels;
00095     else
00096     {
00097       uint8* buf = new uint8[numPixels * 3];
00098       PackRGBcolorToRGBBuffer (buf, pixels, numPixels);
00099       return buf;
00100     }
00101   }
00106   static void DiscardPackedRGB (const uint8* rgb) 
00107   {
00108     if (!IsRGBcolorSane())
00109       delete[] (uint8*)rgb;
00110   }
00117   static void UnpackRGBtoRGBcolor (csRGBcolor* buf, const uint8* rgb, 
00118     size_t numPixels)
00119   {
00120     if (IsRGBcolorSane())
00121       memcpy (buf, rgb, numPixels * 3);
00122     else
00123     {
00124       csRGBcolor* bufptr = buf;
00125       while (numPixels--)
00126       {
00127         bufptr->red = *rgb++;
00128         bufptr->green = *rgb++;
00129         bufptr->blue = *rgb++;
00130         bufptr++; 
00131       }
00132     }
00133   }
00143   static const csRGBcolor* UnpackRGBtoRGBcolor (const uint8* rgb, 
00144     size_t numPixels)
00145   {
00146     if (IsRGBcolorSane())
00147       return (const csRGBcolor*)rgb;
00148     else
00149     {
00150       csRGBcolor* buf = new csRGBcolor[numPixels];
00151       UnpackRGBtoRGBcolor (buf, rgb, numPixels);
00152       return buf;
00153     }
00154   }
00160   static void DiscardUnpackedRGBcolor (const csRGBcolor* pixels) 
00161   {
00162     if (!IsRGBcolorSane())
00163       delete[] (csRGBcolor*)pixels;
00164   }
00174   static inline uint8* PackRGBpixelToRGB (const csRGBpixel* pixels, 
00175     size_t numPixels)
00176   {
00177     uint8* buf = new uint8[numPixels * 3];
00178     uint8* bufptr = buf;
00179     while (numPixels--)
00180     {
00181       *bufptr++ = pixels->red;
00182       *bufptr++ = pixels->green;
00183       *bufptr++ = pixels->blue;
00184       pixels++; 
00185     }
00186     return buf;
00187   }
00194   static void UnpackRGBtoRGBpixelBuffer (csRGBpixel* buf, uint8* rgb,
00195     size_t numPixels)
00196   {
00197     csRGBpixel* bufptr = buf;
00198     while (numPixels--)
00199     {
00200       bufptr->red = *rgb++;
00201       bufptr->green = *rgb++;
00202       bufptr->blue = *rgb++;
00203       bufptr++; 
00204     }
00205   }
00206 };
00207 
00211 struct csPackRGBA
00212 {
00213   static bool IsRGBpixelSane() { return (sizeof(csRGBpixel) == 4); }
00220   static void PackRGBpixelToRGBA (uint8* buf, const csRGBpixel* pixels, 
00221     size_t numPixels)
00222   {
00223     if (IsRGBpixelSane())
00224       memcpy (buf, pixels, numPixels * 4);
00225     else
00226     {
00227       uint8* bufptr = buf;
00228       while (numPixels--)
00229       {
00230         *bufptr++ = pixels->red;
00231         *bufptr++ = pixels->green;
00232         *bufptr++ = pixels->blue;
00233         *bufptr++ = pixels->alpha;
00234         pixels++; 
00235       }
00236     }
00237   }
00247   static const uint8* PackRGBpixelToRGBA (const csRGBpixel* pixels, 
00248     size_t numPixels)
00249   {
00250     if (IsRGBpixelSane())
00251       return (uint8*)pixels;
00252     else
00253     {
00254       uint8* buf = new uint8[numPixels * 4];
00255       PackRGBpixelToRGBA (buf, pixels, numPixels);
00256       return buf;
00257     }
00258   }
00263   static void DiscardPackedRGBA (const uint8* rgba) 
00264   {
00265     if (!IsRGBpixelSane())
00266     {
00267       delete[] (uint8*)rgba;
00268     }
00269   }
00276   static void UnpackRGBAtoRGBpixel (csRGBpixel* buf, const uint8* rgba, 
00277     size_t numPixels)
00278   {
00279     if (IsRGBpixelSane())
00280       memcpy (buf, rgba, numPixels * 4);
00281     else
00282     {
00283       csRGBpixel* bufptr = buf;
00284       while (numPixels--)
00285       {
00286         bufptr->red = *rgba++;
00287         bufptr->green = *rgba++;
00288         bufptr->blue = *rgba++;
00289         bufptr->alpha = *rgba++;
00290         bufptr++; 
00291       }
00292     }
00293   }
00303   static const csRGBpixel* UnpackRGBAtoRGBpixel (const uint8* rgba, 
00304     size_t numPixels)
00305   {
00306     if (IsRGBpixelSane())
00307       return (csRGBpixel*)rgba;
00308     else
00309     {
00310       csRGBpixel* buf = new csRGBpixel[numPixels];
00311       UnpackRGBAtoRGBpixel (buf, rgba, numPixels);
00312       return buf;
00313     }
00314   }
00324   static csRGBpixel* CopyUnpackRGBAtoRGBpixel (const uint8* rgba, 
00325     size_t numPixels)
00326   {
00327     if (IsRGBpixelSane())
00328     {
00329       csRGBpixel* buf = new csRGBpixel[numPixels];
00330       memcpy (buf, rgba, numPixels * sizeof(csRGBpixel));
00331       return buf;
00332     }
00333     else
00334       return (csRGBpixel*)UnpackRGBAtoRGBpixel (rgba, numPixels);
00335   }
00341   static void csDiscardUnpackedRGBpixel (const csRGBpixel* pixels) 
00342   {
00343     if (!IsRGBpixelSane())
00344       delete[] (csRGBpixel*)pixels;
00345   }
00355   static inline csRGBcolor* UnpackRGBAtoRGBcolor (const uint8* rgba, 
00356     size_t numPixels)
00357   {
00358     csRGBcolor* buf = new csRGBcolor[numPixels];
00359     csRGBcolor* bufptr = buf;
00360     while (numPixels--)
00361     {
00362       bufptr->red = *rgba++;
00363       bufptr->green = *rgba++;
00364       bufptr->blue = *rgba++;
00365       rgba++;
00366       bufptr++; 
00367     }
00368     return buf;
00369   }
00370 };
00371 
00376 #endif // __CSGFX_PACKRGB_H__

Generated for Crystal Space by doxygen 1.4.7