NLMISC::CBitmap Class Reference

#include <bitmap.h>

Inheritance diagram for NLMISC::CBitmap:

NL3D::ITexture NL3D::CTextureBlank NL3D::CTextureBlend NL3D::CTextureBump NL3D::CTextureCross NL3D::CTextureCube NL3D::CTextureDLM NL3D::CTextureEmboss NL3D::CTextureFar NL3D::CTextureFile NL3D::CTextureFont NL3D::CTextureGrouped NL3D::CTextureMem NL3D::CTextureMultiFile NL3D::CTextureNear

Detailed Description

Class Bitmap

Author:
Stephane Coutelas

Nevrax France

Date:
2000

Definition at line 87 of file bitmap.h.

[NOHEADER]

CRGBA getDXTC1Texel (sint x, sint y, uint32 numMipMap) const
CRGBA getDXTC3Texel (sint x, sint y, uint32 numMipMap) const
CRGBA getDXTC5Texel (sint x, sint y, uint32 numMipMap) const
CRGBA getDXTCColorFromBlock (const uint8 *block, sint x, sint y)

Public Types

enum  TType {
  RGBA = 0, Luminance, Alpha, AlphaLuminance,
  DXTC1, DXTC1Alpha, DXTC3, DXTC5,
  DsDt, ModeCount, DonTKnow = 0xffffffff
}

Public Member Functions

void blend (CBitmap &Bm0, CBitmap &Bm1, uint16 factor, bool inputBitmapIsMutable=false)
bool blit (const CBitmap *src, sint32 x, sint32 y)
void buildMipMaps ()
 CBitmap ()
bool convertToType (TType type)
void flipH ()
void flipV ()
CRGBAF getColor (float x, float y) const
virtual uint32 getHeight (uint32 numMipMap=0) const
uint32 getMipMapCount () const
CRGBA getPixelColor (sint x, sint y, uint32 numMipMap=0) const
TType getPixelFormat () const
uint32 getSize (uint32 numMipMap=0) const
virtual uint32 getWidth (uint32 numMipMap=0) const
bool isGrayscaleAsAlpha () const
uint8 load (NLMISC::IStream &f, uint mipMapSkip=0)
void loadGrayscaleAsAlpha (bool loadAsAlpha)
void makeDummy ()
void releaseMipMaps ()
void resample (sint32 nNewWidth, sint32 nNewHeight)
void reset (TType type=RGBA)
void resize (sint32 nNewWidth, sint32 nNewHeight, TType newType=DonTKnow, bool resetTo0=true)
void resizeMipMap (uint32 numMipMap, sint32 nNewWidth, sint32 nNewHeight, bool resetTo0=true)
void rot90CCW ()
void rot90CW ()
void rotateCCW ()
void setMipMapCount (uint32 mmc)
bool writeJPG (NLMISC::IStream &f, uint8 quality=80)
bool writeTGA (NLMISC::IStream &f, uint32 d, bool upsideDown=false)
virtual ~CBitmap ()

Static Public Member Functions

void loadSize (const std::string &path, uint32 &retWidth, uint32 &retHeight)
void loadSize (NLMISC::IStream &f, uint32 &width, uint32 &height)

Data Fields

enum NLMISC::CBitmap::TType PixelFormat

Static Public Attributes

const uint32 bitPerPixels [ModeCount]
const uint32 DXTC1HEADER = NL_MAKEFOURCC('D','X', 'T', '1')
const uint32 DXTC3HEADER = NL_MAKEFOURCC('D','X', 'T', '3')
const uint32 DXTC5HEADER = NL_MAKEFOURCC('D','X', 'T', '5')

Protected Attributes

CObjectVector< uint8_Data [MAX_MIPMAP]
uint32 _Height
bool _LoadGrayscaleAsAlpha
uint8 _MipMapCount
uint32 _Width

Private Member Functions

uint32 blend (uint32 &n0, uint32 &n1, uint32 coef0)
bool decompressDXT1 (bool alpha)
bool decompressDXT3 ()
bool decompressDXT5 ()
float getColorInterp (float x, float y, float xy00, float xy01, float xy10, float xy11) const
CRGBA getRGBAPixel (sint x, sint y, uint32 numMipMap) const
uint8 readDDS (NLMISC::IStream &f, uint mipMapSkip)
uint8 readTGA (NLMISC::IStream &f)
void resamplePicture32 (const NLMISC::CRGBA *pSrc, NLMISC::CRGBA *pDest, sint32 nSrcWidth, sint32 nSrcHeight, sint32 nDestWidth, sint32 nDestHeight)
bool alphaLuminanceToAlpha ()
bool alphaLuminanceToLuminance ()
bool alphaLuminanceToRGBA ()
bool alphaToAlphaLuminance ()
bool alphaToLuminance ()
bool alphaToRGBA ()
bool convertToAlpha ()
bool convertToAlphaLuminance ()
bool convertToDXTC5 ()
bool convertToLuminance ()
bool convertToRGBA ()
bool luminanceToAlpha ()
bool luminanceToAlphaLuminance ()
bool luminanceToRGBA ()
bool rgbaToAlpha ()
bool rgbaToAlphaLuminance ()
bool rgbaToLuminance ()

Static Private Member Functions

void uncompress (uint16 color, NLMISC::CRGBA &)


Member Enumeration Documentation

enum NLMISC::CBitmap::TType
 

Enumeration values:
RGBA 
Luminance 
Alpha 
AlphaLuminance 
DXTC1 
DXTC1Alpha 
DXTC3 
DXTC5 
DsDt 
ModeCount 
DonTKnow 

Definition at line 234 of file bitmap.h.

00235         { 
00236                 RGBA=0,
00237                 Luminance,
00238                 Alpha,
00239                 AlphaLuminance,
00240                 DXTC1,
00241                 DXTC1Alpha,
00242                 DXTC3,
00243                 DXTC5,
00244                 DsDt,
00245                 ModeCount,
00246                 DonTKnow=0xffffffff
00247         } PixelFormat;


Constructor & Destructor Documentation

NLMISC::CBitmap::CBitmap  )  [inline]
 

Definition at line 254 of file bitmap.h.

References _LoadGrayscaleAsAlpha, _MipMapCount, PixelFormat, and RGBA.

00255         {
00256                 _MipMapCount = 1;
00257                 _Width = 0;
00258                 _Height = 0;
00259                 PixelFormat = RGBA;
00260                 _LoadGrayscaleAsAlpha = true;
00261         }

virtual NLMISC::CBitmap::~CBitmap  )  [inline, virtual]
 

Definition at line 263 of file bitmap.h.

00263 { }


Member Function Documentation

bool NLMISC::CBitmap::alphaLuminanceToAlpha  )  [private]
 

Definition at line 762 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlpha().

00763 {
00764         uint32 i;
00765 
00766         if(_Width*_Height == 0)  return false;
00767                 
00768         for(uint8 m= 0; m<_MipMapCount; m++)
00769         {
00770                 CObjectVector<uint8> dataTmp;
00771                 dataTmp.resize(_Data[m].size()/2);
00772                 uint    dstId= 0;
00773 
00774                 for(i=0; i<_Data[m].size(); i+=2)
00775                 {
00776                         dataTmp[dstId++]= _Data[m][i+1];
00777                 }
00778                 NLMISC::contReset(_Data[m]); 
00779                 _Data[m].resize(0);
00780                 _Data[m] = dataTmp;
00781         }
00782         PixelFormat = Alpha;
00783         return true;
00784 }

bool NLMISC::CBitmap::alphaLuminanceToLuminance  )  [private]
 

Definition at line 677 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToLuminance().

00678 {
00679         uint32 i;
00680 
00681         if(_Width*_Height == 0)  return false;
00682                 
00683         for(uint8 m= 0; m<_MipMapCount; m++)
00684         {
00685                 CObjectVector<uint8> dataTmp;
00686                 dataTmp.resize(_Data[m].size()/2);
00687                 uint    dstId= 0;
00688 
00689                 for(i=0; i<_Data[m].size(); i+=2)
00690                 {
00691                         dataTmp[dstId++]= 0;
00692                         dataTmp[dstId++]= 0;
00693                         dataTmp[dstId++]= 0;
00694                         dataTmp[dstId++]= _Data[m][i];
00695                 }
00696                 NLMISC::contReset(_Data[m]); 
00697                 _Data[m].resize(0);
00698                 _Data[m] = dataTmp;
00699         }
00700         PixelFormat = Luminance;
00701         return true;
00702 }

bool NLMISC::CBitmap::alphaLuminanceToRGBA  )  [private]
 

Definition at line 519 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToRGBA().

00520 {
00521         uint32 i;
00522 
00523         if(_Width*_Height == 0)  return false;
00524         
00525         for(uint8 m= 0; m<_MipMapCount; m++)
00526         {
00527                 CObjectVector<uint8> dataTmp;
00528                 dataTmp.resize(_Data[m].size()*2);
00529                 uint    dstId= 0;
00530 
00531                 for(i=0; i<_Data[m].size(); i+=2)
00532                 {
00533                         dataTmp[dstId++]= _Data[m][i];
00534                         dataTmp[dstId++]= _Data[m][i];
00535                         dataTmp[dstId++]= _Data[m][i];
00536                         dataTmp[dstId++]= _Data[m][i+1];
00537                 }
00538                 _Data[m] = dataTmp;
00539         }
00540         PixelFormat = RGBA;
00541         return true;
00542 }

bool NLMISC::CBitmap::alphaToAlphaLuminance  )  [private]
 

Definition at line 607 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlphaLuminance().

00608 {
00609         uint32 i;
00610 
00611         if(_Width*_Height == 0)  return false;
00612                 
00613         for(uint8 m= 0; m<_MipMapCount; m++)
00614         {
00615                 CObjectVector<uint8> dataTmp;
00616                 dataTmp.resize(_Data[m].size()*2);
00617                 uint    dstId= 0;
00618 
00619                 for(i=0; i<_Data[m].size(); i++)
00620                 {
00621                         dataTmp[dstId++]= 0;
00622                         dataTmp[dstId++]= _Data[m][i];
00623                 }
00624                 _Data[m] = dataTmp;
00625         }
00626         PixelFormat = AlphaLuminance;
00627         return true;
00628 }

bool NLMISC::CBitmap::alphaToLuminance  )  [private]
 

Definition at line 664 of file bitmap.cpp.

References PixelFormat.

Referenced by convertToLuminance().

00665 {
00666         if(_Width*_Height == 0)  return false;
00667                 
00668         PixelFormat = Luminance;
00669         return true;
00670 }

bool NLMISC::CBitmap::alphaToRGBA  )  [private]
 

Definition at line 490 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToRGBA().

00491 {
00492         uint32 i;
00493 
00494         if(_Width*_Height == 0)  return false;
00495         
00496         for(uint8 m= 0; m<_MipMapCount; m++)
00497         {
00498                 CObjectVector<uint8> dataTmp;
00499                 dataTmp.resize(_Data[m].size()*4);
00500                 uint    dstId= 0;
00501 
00502                 for(i=0; i<_Data[m].size(); i++)
00503                 {
00504                         dataTmp[dstId++]= 255;
00505                         dataTmp[dstId++]= 255;
00506                         dataTmp[dstId++]= 255;
00507                         dataTmp[dstId++]= _Data[m][i];
00508                 }
00509                 _Data[m] = dataTmp;
00510         }
00511         PixelFormat = RGBA;
00512         return true;
00513 }

void NLMISC::CBitmap::blend CBitmap Bm0,
CBitmap Bm1,
uint16  factor,
bool  inputBitmapIsMutable = false
 

Set this bitmap as the result of the blend bewteen 2 bitmap REQUIRE : - Bm0 and Bm1 should have the same size.

  • Both bitmap should be convertible to RGBA pixel format. The result is a RGBA bitmap. NB: this just works with the first mipmaps
    Parameters:
    factor The blend factor. 0 means the result is equal to Bm0, 256 means the result is equal to Bm1
    inputBitmapIsMutable when true, bitmap can be converted in place when needed (no copy done)

Definition at line 2817 of file bitmap.cpp.

References _Data, _Height, _Width, convertToRGBA(), nlassert, PixelFormat, resize(), RGBA, uint, uint16, uint64, and uint8.

02818 {
02819         nlassert(factor <= 256);
02820 
02821         nlassert(Bm0._Width != 0 && Bm0._Height != 0
02822                          && Bm1._Width != 0 && Bm1._Height != 0);
02823 
02824         nlassert(Bm0._Width  == Bm1._Width);    // the bitmap should have the same size
02825         nlassert(Bm0._Height == Bm1._Height);
02826 
02827         const CBitmap *nBm0, *nBm1; // pointer to the bitmap that is used for blending, or to a copy is a conversion wa required
02828 
02829         CBitmap cp0, cp1; // these bitmap are copies of Bm1 and Bm0 if a conversion was needed
02830 
02831         if (Bm0.PixelFormat != RGBA)
02832         {
02833                 if (inputBitmapIsMutable)
02834                 {
02835                         Bm0.convertToRGBA();
02836                         nBm0 = &Bm0;
02837                 }
02838                 else
02839                 {               
02840                         cp0 = Bm0;
02841                         cp0.convertToRGBA();
02842                         nBm0 = &cp0;
02843                 }
02844         }
02845         else
02846         {
02847                 nBm0 = &Bm0;
02848         }
02849 
02850 
02851         if (Bm1.PixelFormat != RGBA)
02852         {
02853                 if (inputBitmapIsMutable)
02854                 {
02855                         Bm1.convertToRGBA();
02856                         nBm1 = &Bm1;
02857                 }
02858                 else
02859                 {
02860                         cp1 = Bm1;
02861                         cp1.convertToRGBA();
02862                         nBm1 = &cp1;
02863                 }
02864         }
02865         else
02866         {
02867                 nBm1 = &Bm1;
02868         }
02869 
02870         this->resize(Bm0._Width, Bm0._Height, RGBA);
02871 
02872         uint numPix = _Width * _Height; // 4 component per pixels
02873 
02874 
02875         const uint8 *src0               = &(nBm0->_Data[0][0]);
02876         const uint8 *src1               = &(nBm1->_Data[0][0]);
02877         uint8 *dest                             = &(this->_Data[0][0]);
02878         
02879 
02880         #ifdef NL_OS_WINDOWS                    
02881         if (CSystemInfo::hasMMX())              
02882         {
02883                 // On a P4 2GHz, with a 256x256 texture, I got the following results :
02884                 // without mmx : 5.2 ms
02885         // with mmx    : 1.7 ms
02886                 // I'm sure this can be further optimized..
02887 
02888                 uint numPixLeft = numPix & 1; // process 2 pixels at once, so special case for odd number
02889                 numPix = numPix & ~1;
02890                 // do fast blend with mmx
02891                 uint64 blendFactor0;
02892                 uint64 blendFactor1;
02893                 uint16 *bf0 = (uint16 *) &blendFactor0;
02894                 uint16 *bf1 = (uint16 *) &blendFactor1;
02895                 bf0[0] = bf0[1] = bf0[2] = bf0[3] = factor;
02896                 bf1[0] = bf1[1] = bf1[2] = bf1[3] = 256 - factor;
02897                 __asm
02898                 {                       
02899                         mov esi, src0
02900                         mov eax, src1
02901                         mov edi, dest
02902                         mov ebx, -8
02903                         mov ecx, numPix
02904                         shr ecx, 1 // process pixels 2 by 2
02905                         movq mm1, blendFactor0
02906                         movq mm0, blendFactor1 
02907                                 
02908                 myLoop:
02909                         pxor mm6, mm6
02910                         lea  ebx, [ebx + 8] // points next location
02911                         pxor mm7, mm7                   
02912                         movq mm2, [esi + ebx]
02913                         movq mm3, [eax + ebx]                   
02914                         // do blend 
02915                         punpckhbw mm7, mm2  // mm7 contains src0 color 0 in high bytes
02916                         punpckhbw mm6, mm3  // mm6 contains src1 color 0 in high bytes
02917                         psrl      mm7, 1
02918                         pxor mm4, mm4       // mm4 = 0                  
02919                         psrl      mm6, 1
02920                         pmulhw mm7, mm0     // src0 = src0 * blendFactor
02921                         pxor mm5, mm5       // mm5 = 0
02922                         pmulhw mm6, mm1     // src1 = src1 * (1 - blendfactor)
02923                         punpcklbw mm4, mm2  // mm4 contains src0 color 1 in high bytes
02924                         paddusw mm6, mm7    // mm6 = src0[0] blended with src1[0]
02925                         psrl      mm4, 1
02926                         punpcklbw mm5, mm3  // mm4 contains src1 color 1 in high bytes
02927                         psll      mm6, 1
02928                         psrl      mm5, 1
02929                         pmulhw    mm4, mm0     // src0 = src0 * blendFactor
02930                         pmulhw    mm5, mm1     // src1 = src1 * (1 - blendfactor)
02931                         paddusw   mm4, mm5    // mm6 = src0[1] blended with src1[1]
02932                         psll      mm4, 1
02933                         // pack result
02934                         packuswb  mm4, mm6
02935                         dec               ecx
02936                         movq      [edi + ebx], mm4  // store result
02937                         jne myLoop
02938                         emms
02939                 }
02940                 if (numPixLeft)
02941                 {
02942                         // case of odd number of pixels
02943                         src0 += 4 * numPix;
02944                         src1 += 4 * numPix;
02945                         dest += 4 * numPix;
02946                         uint blendFact    = (uint) factor;
02947                         uint invblendFact = 256 - blendFact;                    
02948                         *dest = (uint8) (((blendFact * *src1)           + (invblendFact * *src0)) >> 8);
02949                         *(dest + 1) = (uint8) (((blendFact * *(src1 + 1)) + (invblendFact * *(src0 + 1))) >> 8);
02950                         *(dest + 2) = (uint8) (((blendFact * *(src1 + 2)) + (invblendFact * *(src0 + 2))) >> 8);
02951                         *(dest + 3)  = (uint8) (((blendFact * *(src1 + 3)) + (invblendFact * *(src0 + 3))) >> 8);
02952                 }
02953         }       
02954         else    
02955         #endif //#ifdef NL_OS_WINDOWS   
02956         {       
02957                 uint8 *endPix                   = dest + (numPix << 2);
02958                 // no mmx version
02959                 uint blendFact    = (uint) factor;
02960                 uint invblendFact = 256 - blendFact;
02961                 do
02962                 {
02964                         *dest = (uint8) (((blendFact * *src1)           + (invblendFact * *src0)) >> 8);
02965                         *(dest + 1) = (uint8) (((blendFact * *(src1 + 1)) + (invblendFact * *(src0 + 1))) >> 8);
02966                         *(dest + 2) = (uint8) (((blendFact * *(src1 + 2)) + (invblendFact * *(src0 + 2))) >> 8);
02967                         *(dest + 3)  = (uint8) (((blendFact * *(src1 + 3)) + (invblendFact * *(src0 + 3))) >> 8);
02968 
02969                         src0 = src0 + 4;
02970                         src1 = src1 + 4;
02971                         dest = dest + 4;        
02972                 }
02973                 while (dest != endPix);
02974         }
02975 }

uint32 NLMISC::CBitmap::blend uint32 n0,
uint32 n1,
uint32  coef0
[private]
 

blend 2 integers between 0 and 255 .

Parameters:
n0 first integer
n1 second integer
coef coefficient for the first integer (must be in [0,256])

Definition at line 1338 of file bitmap.cpp.

References uint32.

Referenced by decompressDXT5(), and NL3D::CTextureBlend::doGenerate().

01339 {
01340         int     a0 = coef0;
01341         int     a1 = 256-a0;
01342         return ((n0*a0 + n1*a1) >>8);
01343 }

bool NLMISC::CBitmap::blit const CBitmap src,
sint32  x,
sint32  y
 

Perform a simple blit from the source to this bitmap at the (x, y) pos The dimension of the original bitmap are preserved For now, this texture and the source must have the same format With DXTC format, the dest coordinates must be a multiple of 4 mipmap are not rebuild when present

Returns:
true if the params were corrects and if the blit occures. In debug build there's an assertion

Definition at line 2332 of file bitmap.cpp.

References bitPerPixels, DonTKnow, height, nlassert, PixelFormat, sint, sint32, src, uint, uint8, width, x, and y.

Referenced by NL3D::CTextureGrouped::doGenerate(), and NL3D::CCoarseMeshBuild::expand().

02333 {
02334         
02335         nlassert(this->PixelFormat == src->PixelFormat);
02336         if (this->PixelFormat != src->PixelFormat)
02337         {
02338                 return false;
02339         }
02340 
02341 
02342         // check for dxtc use
02343 
02344         const bool useDXTC   =  PixelFormat == DXTC1 || PixelFormat == DXTC1Alpha || PixelFormat == DXTC3 || PixelFormat ==     DXTC5;
02345 
02346         // number of bits for a 4x4 pix block
02347         const uint dxtcNumBits  =  PixelFormat == DXTC1 || PixelFormat == DXTC1Alpha ? 64 : 128;
02348         
02349 
02350         if (useDXTC)
02351         {
02352                 // blit pos must be multiple of 4
02353 
02354                 nlassert(! (x & 3 || y & 3) );
02355                 if (x & 3 || y & 3) return false;
02356 
02357         }
02358 
02359         nlassert(PixelFormat != DonTKnow);
02360 
02361         // the width to copy
02362         sint width = src->_Width;
02363         // the height to copy
02364         sint height = src->_Height;
02365 
02366         uint destStartX, destStartY;
02367         uint srcStartX, srcStartY;
02368 
02369 
02370         // clip against left
02371         if (x < 0)
02372         {
02373                 width += x;
02374                 if (width <= 0) return true;
02375                 destStartX = 0;
02376                 srcStartX = -x;
02377         }
02378         else
02379         {
02380                 destStartX = x;
02381                 srcStartX = 0;
02382         }
02383 
02384         // clip against top
02385         if (y < 0)
02386         {
02387                 height += y;
02388                 if (height <= 0) return true;
02389                 srcStartY = -y;
02390                 destStartY = 0;
02391         }
02392         else
02393         {
02394                 destStartY = y;
02395                 srcStartY = 0;
02396         }
02397 
02398         // clip against right
02399         if ((destStartX + width - 1) >= _Width)
02400         {
02401                 width = _Width - destStartX;
02402                 if (width <= 0) return true;
02403         }
02404 
02405         // clip against bottom
02406         if ((destStartY + height - 1) >= _Height)
02407         {
02408                 height = _Height - destStartY;
02409                 if (width <= 0) return true;
02410         }
02411 
02412 
02413         // divide all distance by 4 when using DXTC
02414         if (useDXTC)
02415         {
02416                 destStartX >>= 2;
02417                 destStartY >>= 2;
02418                 srcStartX >>= 2;
02419                 srcStartY >>= 2;
02420                 width >>= 2;
02421                 height >>= 2;
02422         }
02423         
02424 
02425         // bytes per pixs is for either one pixel or 16 (a 4x4 block in DXTC)
02426         const uint bytePerPixs = ( useDXTC ? dxtcNumBits : bitPerPixels[PixelFormat] ) >> 3 /* divide by 8 to get the number of bytes */;
02427 
02428 
02429         const uint destRealWidth = useDXTC ? (_Width >> 2) : _Width;
02430         const uint srcRealWidth = useDXTC ? (src->_Width >> 2) : src->_Width;
02431         
02432 
02433         // size to go to the next line in the destination
02434         const uint destStride = destRealWidth * bytePerPixs;
02435 
02436         // size to go to the next line in the source
02437         const uint srcStride = srcRealWidth * bytePerPixs;
02438         
02439         // length in bytes of a line to copy
02440         const uint lineLength = width * bytePerPixs;
02441 
02442 
02443         uint8  *destPos = &(_Data[0][0]) + destStride * destStartY + bytePerPixs * destStartX;
02444         const uint8 *srcPos = &(src->_Data[0][0]) + srcStride * srcStartY + bytePerPixs * srcStartX;
02445 
02446         // copy each hline
02447         for (sint k = 0; k < height; ++k)
02448         {
02449                 ::memcpy(destPos, srcPos, lineLength);
02450                 destPos += destStride;
02451                 srcPos += srcStride;
02452         }
02453 
02454         
02455         return true;
02456 }

void NLMISC::CBitmap::buildMipMaps  ) 
 

Build the mipmaps of the bitmap if they don't exist. Work only in RGBA mode...

See also:
releaseMipMaps().

Definition at line 1422 of file bitmap.cpp.

References _MipMapCount, NLMISC::CRGBA::A, NLMISC::CRGBA::B, NLMISC::CRGBA::G, NLMISC::isPowerOf2(), PixelFormat, NLMISC::CRGBA::R, NLMISC::CObjectVector< uint8 >::resize(), RGBA, sint, uint32, and w.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CTextureMem::doGenerate(), flipH(), flipV(), resample(), rot90CCW(), rot90CW(), and NL3D::CDriverGL::setupTextureEx().

01423 {
01424         uint32 i,j;
01425 
01426         if(PixelFormat!=RGBA) return;
01427         if(_MipMapCount!=1) return;
01428         if(!NLMISC::isPowerOf2(_Width)) return;
01429         if(!NLMISC::isPowerOf2(_Height)) return;
01430         
01431         uint32 w = _Width;
01432         uint32 h = _Height;
01433 
01434         while(w>1 || h>1)
01435         {
01436                 uint32 precw = w;
01437                 uint32 prech = h;
01438                 w = (w+1)/2;
01439                 h = (h+1)/2;
01440                 uint32  mulw= precw/w;
01441                 uint32  mulh= prech/h;
01442 
01443                 _Data[_MipMapCount].resize(w*h*4);
01444                 
01445         
01446                 NLMISC::CRGBA *pRgba = (NLMISC::CRGBA*)&_Data[_MipMapCount][0];
01447                 NLMISC::CRGBA *pRgbaPrev = (NLMISC::CRGBA*)&_Data[_MipMapCount-1][0];
01448                 for(i=0; i<h; i++)
01449                 {
01450                         sint    i0= mulh*i;
01451                         sint    i1= mulh*i+1;
01452                         if(mulh==1)
01453                                 i1=i0;
01454                         i0*=precw;
01455                         i1*=precw;
01456                         for(j=0; j<w; j++)
01457                         {
01458                                 sint    j0= mulw*j;
01459                                 sint    j1= mulw*j+1;
01460                                 if(mulh==1)
01461                                         j1=j0;
01462                                 CRGBA   &c0= pRgbaPrev[i0+j0];
01463                                 CRGBA   &c1= pRgbaPrev[i0+j1];
01464                                 CRGBA   &c2= pRgbaPrev[i1+j0];
01465                                 CRGBA   &c3= pRgbaPrev[i1+j1];
01466                                 pRgba[i*w + j].R = (c0.R +
01467                                                                         c1.R +
01468                                                                         c2.R +
01469                                                                         c3.R + 2 ) /4;
01470                                 pRgba[i*w + j].G = (c0.G +
01471                                                                         c1.G +
01472                                                                         c2.G +
01473                                                                         c3.G + 2 ) /4;
01474                                 pRgba[i*w + j].B = (c0.B +
01475                                                                         c1.B +
01476                                                                         c2.B +
01477                                                                         c3.B + 2 ) /4;
01478                                 pRgba[i*w + j].A = (c0.A +
01479                                                                         c1.A +
01480                                                                         c2.A +
01481                                                                         c3.A + 2 ) /4;
01482                         }
01483                 }
01484 
01485                 _MipMapCount++;
01486         }
01487 }

bool NLMISC::CBitmap::convertToAlpha  )  [private]
 

Definition at line 821 of file bitmap.cpp.

References alphaLuminanceToAlpha(), luminanceToAlpha(), PixelFormat, RGBA, and rgbaToAlpha().

Referenced by convertToType().

00822 {
00823         switch(PixelFormat)
00824         {
00825                 case RGBA :
00826                         return rgbaToAlpha();
00827                         break;
00828 
00829                 case Luminance :
00830                         return luminanceToAlpha();
00831                         break;
00832 
00833                 case Alpha :
00834                         return true;
00835                         break;
00836 
00837                 case AlphaLuminance :
00838                         return alphaLuminanceToAlpha();
00839                         break;
00840 
00841                 default:
00842                         break;
00843         }
00844         return false;
00845 }

bool NLMISC::CBitmap::convertToAlphaLuminance  )  [private]
 

Definition at line 852 of file bitmap.cpp.

References alphaToAlphaLuminance(), luminanceToAlphaLuminance(), PixelFormat, RGBA, and rgbaToAlphaLuminance().

Referenced by convertToType().

00853 {
00854         switch(PixelFormat)
00855         {
00856                 case RGBA :
00857                         return rgbaToAlphaLuminance();
00858                         break;
00859 
00860                 case Luminance :
00861                         return luminanceToAlphaLuminance();
00862                         break;
00863 
00864                 case Alpha :
00865                         return alphaToAlphaLuminance();
00866                         break;
00867 
00868                 case AlphaLuminance :
00869                         return true;
00870                         break;
00871 
00872                 default:
00873                         break;
00874         }
00875         return false;
00876 }

bool NLMISC::CBitmap::convertToDXTC5  )  [private]
 

Change bitmap format

about DXTC1 to DXTC5 : Does nothing if the format is not DXTC1 about alpha encoding : alpha0 == alpha1 code(x,y) == 7 for every (x,y)

about luminance to alpha and alpha to luminance : the buffer keeps unchanged

Definition at line 415 of file bitmap.cpp.

Referenced by convertToType().

00416 {
00417         /* Yoyo: RGB encoding for DXTC1 and DXTC5/3 are actually different!!
00418                 DXTC3/5 don't rely on sign of color0>color1 to setup special encoding (ie use a special compression for Black)
00419                 Since this can arise if the src is DXTC1 , we can't simply compress it into DXTC5 without doing a 
00420                 heavy compression...
00421                 (the inverse is false: DXTC5 to DXTC1 is possible, with maybe swap color0/color1 and bits).
00422         */
00423 
00424         return false;
00425 
00426 /*      uint32 i,j;
00427 
00428         if(PixelFormat!=DXTC1) return false;
00429 
00430         for(uint8 m= 0; m<_MipMapCount; m++)
00431         {
00432                 CObjectVector<uint8> dataTmp;
00433                 dataTmp.resize(2*_Data[m].size());
00434                 uint    dstId= 0;
00435 
00436                 for(i=0; i<_Data[m].size(); i+=8)
00437                 {
00438                         //64 bits alpha
00439                         for(j=0; j<8; j++)
00440                         {
00441                                 dataTmp[dstId++]= 255;
00442                         }
00443 
00444                         //64 bits RGB
00445                         for(j=0; j<8; j++)
00446                         {
00447                                 dataTmp[dstId++]= _Data[m][i+j];
00448                         }
00449                 }
00450                 _Data[m] = dataTmp;
00451         }
00452         PixelFormat = DXTC5;
00453         return true;
00454 */
00455 }

bool NLMISC::CBitmap::convertToLuminance  )  [private]
 

Definition at line 790 of file bitmap.cpp.

References alphaLuminanceToLuminance(), alphaToLuminance(), PixelFormat, RGBA, and rgbaToLuminance().

Referenced by convertToType().

00791 {
00792         switch(PixelFormat)
00793         {
00794                 case RGBA :
00795                         return rgbaToLuminance();
00796                         break;
00797 
00798                 case Luminance :
00799                         return true;
00800                         break;
00801 
00802                 case Alpha :
00803                         return alphaToLuminance();
00804                         break;
00805 
00806                 case AlphaLuminance :
00807                         return alphaLuminanceToLuminance();
00808                         break;
00809 
00810                 default:
00811                         break;
00812         }
00813         return false;
00814 }

bool NLMISC::CBitmap::convertToRGBA  )  [private]
 

Definition at line 882 of file bitmap.cpp.

References alphaLuminanceToRGBA(), alphaToRGBA(), decompressDXT1(), decompressDXT3(), decompressDXT5(), luminanceToRGBA(), PixelFormat, and RGBA.

Referenced by blend(), and convertToType().

00883 {
00884         switch(PixelFormat)
00885         {
00886                 case DXTC1 :
00887                         return decompressDXT1(false);
00888                         break;
00889 
00890                 case DXTC1Alpha :
00891                         return decompressDXT1(true);
00892                         break;
00893 
00894                 case DXTC3 :
00895                         return decompressDXT3();        
00896                         break;
00897 
00898                 case DXTC5 :
00899                         return decompressDXT5();                
00900                         break;
00901 
00902                 case Luminance :
00903                         return luminanceToRGBA();
00904                         break;
00905 
00906                 case Alpha :
00907                         return alphaToRGBA();
00908                         break;
00909 
00910                 case AlphaLuminance :
00911                         return alphaLuminanceToRGBA();
00912                         break;
00913                 case RGBA:
00914                         return true;
00915                 break;
00916                 default:
00917                         break;
00918         }
00919         return false;
00920 }

bool NLMISC::CBitmap::convertToType TType  type  ) 
 

Convert bitmap to another type conversion to rgba always work. No-op if already rgba.

Parameters:
type new type for the bitmap
Returns:
true if conversion succeeded, false else

Definition at line 926 of file bitmap.cpp.

References convertToAlpha(), convertToAlphaLuminance(), convertToDXTC5(), convertToLuminance(), convertToRGBA(), PixelFormat, RGBA, and type.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CLodCharacterTmpBitmap::build(), NL3D::CCoarseMeshBuild::buildBitmap(), NL3D::CTextureFile::buildBitmapFromFile(), NL3D::CHeightMap::buildFromBitmap(), NL3D::CAsyncTextureManager::CTextureEntry::createCoarseBitmap(), NL3D::CZoneLighter::getTexture(), NL3D::CTileBank::getTileNoiseMap(), and NL3D::CDriverGL::setupTextureEx().

00927 {
00928         if(PixelFormat==type) return true;
00929 
00930         switch(type)
00931         {
00932                 case RGBA :
00933                         return convertToRGBA();
00934                         break;
00935 
00936                 case DXTC5 :
00937                         return convertToDXTC5();                
00938                         break;
00939 
00940                 case Luminance :
00941                         return convertToLuminance();
00942                         break;
00943 
00944                 case Alpha :
00945                         return convertToAlpha();
00946                         break;
00947 
00948                 case AlphaLuminance :
00949                         return convertToAlphaLuminance();
00950                         break;
00951 
00952                 default:
00953                         break;
00954         }
00955         
00956         return false;
00957 }

bool NLMISC::CBitmap::decompressDXT1 bool  alpha  )  [private]
 

Decompress bitmap compressed with S3TC DXT1 algorithm.

Parameters:
alpha if alpha is true there's alpha.

Definition at line 965 of file bitmap.cpp.

References _MipMapCount, NLMISC::CRGBA::A, alpha, NLMISC::CRGBA::blendFromui(), height, NLMISC::MAX_MIPMAP, PixelFormat, NLMISC::CRGBA::R, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CRGBA::set(), NLMISC::CObjectVector< uint8 >::size(), NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), src, uint, uint16, uint32, uint8, uncompress(), width, x, and y.

Referenced by convertToRGBA().

00966 {
00967         uint32 i,j,k;
00968         NLMISC::CRGBA   c[4];
00969         CObjectVector<uint8> dataTmp[MAX_MIPMAP];
00970         
00971         uint32 width= _Width;
00972         uint32 height= _Height;
00973 
00974         for(uint8 m= 0; m<_MipMapCount; m++)
00975         {
00976                 uint32 wtmp, htmp;
00977                 if(width<4)
00978                         wtmp = 4;
00979                 else
00980                         wtmp = width;
00981                 if(height < 4)
00982                         htmp = 4;
00983                 else
00984                         htmp = height;
00985                 uint32 mipMapSz = wtmp*htmp*4;
00986                 dataTmp[m].resize(mipMapSz); 
00987                 if(dataTmp[m].size()<mipMapSz)
00988                 {
00989                         throw EAllocationFailure();
00990                 }
00991                 uint32 wBlockCount= wtmp/4;
00992                 
00993 
00994 
00995                 for(i=0; i < _Data[m].size(); i+=8)
00996                 {
00997                         uint16 color0;
00998                         uint16 color1;
00999                         uint32 bits;
01000                         memcpy(&color0,&_Data[m][i],2);
01001                         memcpy(&color1,&_Data[m][i+2],2);
01002                         memcpy(&bits,&_Data[m][i+4],4);
01003 
01004                         uncompress(color0,c[0]);
01005                         uncompress(color1,c[1]);        
01006                         
01007                         if (alpha)
01008                         {                       
01009                                 c[0].A= 0;
01010                                 c[1].A= 0;
01011                                 c[2].A= 0;
01012                                 c[3].A= 0;
01013                         }
01014                         else
01015                         {
01016                                 c[0].A= 255;
01017                                 c[1].A= 255;
01018                                 c[2].A= 255;
01019                                 c[3].A= 255;
01020                         }
01021                         
01022                         if(color0>color1)
01023                         {
01024                                 c[2].blendFromui(c[0],c[1],85);
01025                                 if(alpha) c[2].A= 255;
01026 
01027                                 c[3].blendFromui(c[0],c[1],171);        
01028                                 if(alpha) c[3].A= 255;
01029                         }
01030                         else
01031                         {
01032                                 c[2].blendFromui(c[0],c[1],128);
01033                                 if(alpha) c[2].A= 255;
01034 
01035                                 c[3].set(0,0,0,0);
01036                         }
01037 
01038                         // computing the 16 RGBA of the block
01039                         
01040                         uint32 blockNum= i/8; //(64 bits)
01041                         // <previous blocks in above lines> * 4 (rows) * _Width (columns) + 4pix*4rgba*<same line previous blocks>
01042                         uint32 pixelsCount= 4*(blockNum/wBlockCount)*wtmp*4 + 4*4*(blockNum%wBlockCount);
01043                         for(j=0; j<4; j++)
01044                         {
01045                                 for(k=0; k<4; k++)
01046                                 {
01047                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k]= c[bits&3].R;
01048                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+1]= c[bits&3].G;
01049                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+2]= c[bits&3].B;
01050                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+3]= c[bits&3].A;
01051                                         bits>>=2;
01052                                 }
01053                         }
01054                 }
01055 
01056                 // Copy result into the mipmap level.
01057                 if(wtmp==width && htmp==height)
01058                 {
01059                         // For mipmaps level >4 pixels.
01060                         _Data[m]= dataTmp[m];
01061                 }
01062                 else
01063                 {
01064                         // For last mipmaps, level <4 pixels.
01065                         _Data[m].resize(width*height*4);
01066                         CRGBA   *src= (CRGBA*)&dataTmp[m][0];
01067                         CRGBA   *dst= (CRGBA*)&_Data[m][0];
01068                         uint    x,y;
01069                         for(y=0;y<height;y++)
01070                         {
01071                                 for(x=0;x<width;x++)
01072                                         dst[y*width+x]= src[y*wtmp+x];
01073                         }
01074                 }
01075 
01076                 // Next mipmap size.
01077                 width = (width+1)/2;
01078                 height = (height+1)/2;
01079         }
01080         PixelFormat = RGBA;
01081         return true;
01082 }

bool NLMISC::CBitmap::decompressDXT3  )  [private]
 

Decompress bitmap compressed with S3TC DXT3 algorithm.

Exceptions:
EAllocationFailure : can't allocate memory.

Definition at line 1090 of file bitmap.cpp.

References _MipMapCount, alpha, NLMISC::CRGBA::blendFromui(), height, NLMISC::MAX_MIPMAP, PixelFormat, NLMISC::CRGBA::R, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CObjectVector< uint8 >::size(), NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), src, uint, uint16, uint32, uint64, uint8, uncompress(), width, x, and y.

Referenced by convertToRGBA().

01091 {
01092         uint32 i,j,k;
01093         NLMISC::CRGBA   c[4];
01094         CObjectVector<uint8> dataTmp[MAX_MIPMAP];
01095         
01096         uint32 width= _Width;
01097         uint32 height= _Height;
01098 
01099         for(uint8 m= 0; m<_MipMapCount; m++)
01100         {
01101                 uint32 wtmp, htmp;
01102                 if(width<4)
01103                         wtmp = 4;
01104                 else
01105                         wtmp = width;
01106                 if(height < 4)
01107                         htmp = 4;
01108                 else
01109                         htmp = height;
01110                 uint32 mipMapSz = wtmp*htmp*4;
01111                 dataTmp[m].resize(mipMapSz); 
01112                 if(dataTmp[m].size()<mipMapSz)
01113                 {
01114                         throw EAllocationFailure();
01115                 }
01116                 uint32 wBlockCount= wtmp/4;
01117                 
01118 
01119                 for(i=0; i < _Data[m].size(); i+=16)
01120                 {
01121                         uint8 alpha[16];
01122                         uint64 alphatmp;
01123                         memcpy(&alphatmp,&_Data[m][i],8);
01124 
01125                         for(j=0; j<16; j++)
01126                         {
01127                                 uint8   a= (uint8)(alphatmp&15);
01128                                 // expand to 0-255.
01129                                 alpha[j]= a+(a<<4);
01130                                 alphatmp>>=4;
01131                         }
01132 
01133 
01134                         uint16 color0;
01135                         uint16 color1;
01136                         uint32 bits;
01137                         memcpy(&color0,&_Data[m][i+8],2);
01138                         memcpy(&color1,&_Data[m][i+10],2);
01139                         memcpy(&bits,&_Data[m][i+12],4);
01140 
01141                         uncompress(color0,c[0]);
01142                         uncompress(color1,c[1]);        
01143                                                 
01144                         // ignore color0>color1 for DXT3 and DXT5.
01145                         c[2].blendFromui(c[0],c[1],85);
01146                         c[3].blendFromui(c[0],c[1],171);        
01147 
01148                         // computing the 16 RGBA of the block
01149                         
01150                         uint32 blockNum= i/16; //(128 bits)
01151                         // <previous blocks in above lines> * 4 (rows) * wtmp (columns) + 4pix*4rgba*<same line previous blocks>
01152                         uint32 pixelsCount= 4*(blockNum/wBlockCount)*wtmp*4 + 4*4*(blockNum%wBlockCount);
01153                         for(j=0; j<4; j++)
01154                         {
01155                                 for(k=0; k<4; k++)
01156                                 {
01157                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k]= c[bits&3].R;
01158                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+1]= c[bits&3].G;
01159                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+2]= c[bits&3].B;
01160                                         dataTmp[m][pixelsCount + j*wtmp*4 + 4*k+3]= alpha[4*j+k];
01161                                         bits>>=2;
01162                                 }
01163                         }
01164                 }
01165 
01166                 // Copy result into the mipmap level.
01167                 if(wtmp==width && htmp==height)
01168                 {
01169                         // For mipmaps level >4 pixels.
01170                         _Data[m]= dataTmp[m];
01171                 }
01172                 else
01173                 {
01174                         // For last mipmaps, level <4 pixels.
01175                         _Data[m].resize(width*height*4);
01176                         CRGBA   *src= (CRGBA*)&dataTmp[m][0];
01177                         CRGBA   *dst= (CRGBA*)&_Data[m][0];
01178                         uint    x,y;
01179                         for(y=0;y<height;y++)
01180                         {
01181                                 for(x=0;x<width;x++)
01182                                         dst[y*width+x]= src[y*wtmp+x];
01183                         }
01184                 }
01185 
01186                 // Next mipmap size.
01187                 width = (width+1)/2;
01188                 height = (height+1)/2;
01189         }
01190         PixelFormat = RGBA;
01191         return true;
01192 }

bool NLMISC::CBitmap::decompressDXT5  )  [private]
 

Decompress bitmap compressed with S3TC DXT3 algorithm.

Exceptions:
EAllocationFailure : can't allocate memory.

Definition at line 1200 of file bitmap.cpp.

References _MipMapCount, alpha, blend(), NLMISC::CRGBA::blendFromui(), height, NLMISC::MAX_MIPMAP, PixelFormat, NLMISC::CRGBA::R, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CObjectVector< uint8 >::size(), NLMISC::CObjectVector< T, EnableObjectBehavior >::size(), src, uint, uint16, uint32, uint64, uint8, uncompress(), width, x, and y.

Referenced by convertToRGBA().

01201 {
01202         uint32 i,j,k;
01203         NLMISC::CRGBA   c[4];
01204         CObjectVector<uint8> dataTmp[MAX_MIPMAP];
01205         
01206         uint32 width= _Width;
01207         uint32 height= _Height;
01208 
01209         for(uint8 m= 0; m<_MipMapCount; m++)
01210         {
01211                 uint32 wtmp, htmp;
01212                 if(width<4)
01213                         wtmp = 4;
01214                 else
01215                         wtmp = width;
01216                 if(height < 4)
01217                         htmp = 4;
01218                 else
01219                         htmp = height;
01220                 uint32 mipMapSz = wtmp*htmp*4;
01221                 dataTmp[m].resize(mipMapSz); 
01222                 if(dataTmp[m].size()<mipMapSz)
01223                 {
01224                         throw EAllocationFailure();
01225                 }
01226                 uint32 wBlockCount= wtmp/4;
01227                 
01228 
01229 
01230                 for(i=0; i < _Data[m].size(); i+=16)
01231                 {
01232                         uint64 bitsAlpha;
01233                         memcpy(&bitsAlpha,&_Data[m][i],8);
01234                         bitsAlpha>>= 16;
01235 
01236                         uint32 alpha[8];
01237                         alpha[0]= _Data[m][i+0];
01238                         alpha[1]= _Data[m][i+1];
01239                         
01240                         if(alpha[0]>alpha[1])
01241                         {
01242                                 alpha[2]= blend(alpha[0], alpha[1], 219);
01243                                 alpha[3]= blend(alpha[0], alpha[1], 183);
01244                                 alpha[4]= blend(alpha[0], alpha[1], 146);
01245                                 alpha[5]= blend(alpha[0], alpha[1], 110);
01246                                 alpha[6]= blend(alpha[0], alpha[1], 73);
01247                                 alpha[7]= blend(alpha[0], alpha[1], 37);
01248                         }
01249                         else
01250                         {
01251                                 alpha[2]= blend(alpha[0], alpha[1], 204);
01252                                 alpha[3]= blend(alpha[0], alpha[1], 154);
01253                                 alpha[4]= blend(alpha[0], alpha[1], 102);
01254                                 alpha[5]= blend(alpha[0], alpha[1], 51);
01255                                 alpha[6]= 0;
01256                                 alpha[7]= 255;
01257                         }
01258 
01259                         uint8 codeAlpha[16];
01260                         for(j=0; j<16; j++)
01261                         {
01262                                 codeAlpha[j] = (uint8)bitsAlpha & 7;
01263                                 bitsAlpha>>=3;
01264                         }
01265 
01266 
01267                         uint16 color0;
01268                         uint16 color1;
01269                         uint32 bits;
01270                         memcpy(&color0,&_Data[m][i+8],2);
01271                         memcpy(&color1,&_Data[m][i+10],2);
01272                         memcpy(&bits,&_Data[m][i+12],4);
01273 
01274                         uncompress(color0,c[0]);
01275                         uncompress(color1,c[1]);        
01276                         
01277                         // ignore color0>color1 for DXT3 and DXT5.
01278                         c[2].blendFromui(c[0],c[1],85);
01279                         c[3].blendFromui(c[0],c[1],171);        
01280 
01281                         // computing the 16 RGBA of the block
01282                         
01283                         uint32 blockNum= i/16; //(128 bits)
01284 
01285                         // <previous blocks in above lines> * 4 (rows) * wtmp (columns) + 4pix*<same line previous blocks>
01286                         uint32 pixelsCount= (blockNum/wBlockCount)*wtmp*4 + 4*(blockNum%wBlockCount);
01287                         // *sizeof(RGBA)
01288                         pixelsCount*=4;
01289                         for(j=0; j<4; j++)
01290                         {
01291                                 for(k=0; k<4; k++)
01292                                 {
01293                                         dataTmp[m][pixelsCount + (j*wtmp+k)*4 +0]= c[bits&3].R;
01294                                         dataTmp[m][pixelsCount + (j*wtmp+k)*4 +1]= c[bits&3].G;
01295                                         dataTmp[m][pixelsCount + (j*wtmp+k)*4 +2]= c[bits&3].B;
01296                                         dataTmp[m][pixelsCount + (j*wtmp+k)*4 +3]= (uint8) alpha[codeAlpha[4*j+k]];
01297                                         bits>>=2;
01298                                 }
01299                         }
01300 
01301                 }
01302 
01303                 // Copy result into the mipmap level.
01304                 if(wtmp==width && htmp==height)
01305                 {
01306                         // For mipmaps level >4 pixels.
01307                         _Data[m]= dataTmp[m];
01308                 }
01309                 else
01310                 {
01311                         // For last mipmaps, level <4 pixels.
01312                         _Data[m].resize(width*height*4);
01313                         CRGBA   *src= (CRGBA*)&dataTmp[m][0];
01314                         CRGBA   *dst= (CRGBA*)&_Data[m][0];
01315                         uint    x,y;
01316                         for(y=0;y<height;y++)
01317                         {
01318                                 for(x=0;x<width;x++)
01319                                         dst[y*width+x]= src[y*wtmp+x];
01320                         }
01321                 }
01322 
01323                 // Next mipmap size.
01324                 width = (width+1)/2;
01325                 height = (height+1)/2;
01326         }
01327         PixelFormat = RGBA;
01328         return true;
01329 
01330 }

void NLMISC::CBitmap::flipH  ) 
 

Horizontal flip (all the columns are flipped)

Definition at line 2682 of file bitmap.cpp.

References _MipMapCount, buildMipMaps(), getHeight(), getWidth(), PixelFormat, releaseMipMaps(), RGBA, and sint32.

02683 {
02684         if (PixelFormat != RGBA)
02685                 return;
02686 
02687         sint32 nWidth = getWidth(0);
02688         sint32 nHeight = getHeight(0);
02689         sint32 i, j;
02690         NLMISC::CRGBA *pBitmap = (NLMISC::CRGBA*)&_Data[0][0];
02691         bool needRebuild = false;
02692         CRGBA temp;
02693 
02694         if(_MipMapCount>1)
02695                 needRebuild = true;
02696         releaseMipMaps();
02697 
02698         for( i = 0; i < nHeight; ++i )
02699                 for( j = 0; j < nWidth/2; ++j )
02700                 {
02701                         temp = pBitmap[i*nWidth+j];
02702                         pBitmap[i*nWidth+j] = pBitmap[i*nWidth+nWidth-j-1];
02703                         pBitmap[i*nWidth+nWidth-j-1] = temp;
02704                 }
02705 
02706         // Rebuilding mipmaps
02707         if(needRebuild)
02708         {
02709                 buildMipMaps();
02710         }
02711 }

void NLMISC::CBitmap::flipV  ) 
 

Vertical flip (all the rows are flipped)

Definition at line 2714 of file bitmap.cpp.

References _MipMapCount, buildMipMaps(), getHeight(), getWidth(), PixelFormat, releaseMipMaps(), RGBA, and sint32.

02715 {
02716         if (PixelFormat != RGBA)
02717                 return;
02718 
02719         sint32 nWidth = getWidth(0);
02720         sint32 nHeight = getHeight(0);
02721         sint32 i, j;
02722         NLMISC::CRGBA *pBitmap = (NLMISC::CRGBA*)&_Data[0][0];
02723         bool needRebuild = false;
02724         CRGBA temp;
02725 
02726         if(_MipMapCount>1)
02727                 needRebuild = true;
02728         releaseMipMaps();
02729 
02730         for( j = 0; j < nHeight/2; ++j )
02731                 for( i = 0; i < nWidth; ++i )
02732                 {
02733                         temp = pBitmap[j*nWidth+i];
02734                         pBitmap[j*nWidth+i] = pBitmap[(nHeight-j-1)*nWidth+i];
02735                         pBitmap[(nHeight-j-1)*nWidth+i] = temp;
02736                 }
02737 
02738         // Rebuilding mipmaps
02739         if(needRebuild)
02740         {
02741                 buildMipMaps();
02742         }
02743 }

CRGBAF NLMISC::CBitmap::getColor float  x,
float  y
const
 

Get the color in the bitmap given a pixel size The mipmaps must be built. If not just return the bilinear at the given point. The input x and y must be clamped between 0 and 1

Definition at line 2470 of file bitmap.cpp.

References NLMISC::CRGBAF::A, NLMISC::CRGBAF::B, NLMISC::CRGBAF::G, getColorInterp(), getHeight(), getPixelColor(), getPixels(), getWidth(), nlassert, PixelFormat, NLMISC::CRGBAF::R, RGBA, sint32, uint32, x, and y.

02471 {
02472         if (x < 0.0f) x = 0.0f;
02473         if (x > 1.0f) x = 1.0f;
02474         if (y < 0.0f) y = 0.0f;
02475         if (y > 1.0f) y = 1.0f;
02476 
02477         sint32 nWidth = getWidth(0);
02478         sint32 nHeight = getHeight(0);
02479 
02480         if (nWidth == 0 || nHeight == 0) return CRGBAF(0, 0, 0, 0);
02481 
02482         const CObjectVector<uint8> &rBitmap = getPixels(0);
02483         sint32 nX[4], nY[4];
02484 
02485         x *= nWidth-1;
02486         y *= nHeight-1;
02487 
02488         // Integer part of (x,y)
02489         //nX[0] = ((sint32)floor(x-0.5f));
02490         //nY[0] = ((sint32)floor(y-0.5f));
02491         nX[0] = ((sint32)floor(x));
02492         nY[0] = ((sint32)floor(y));
02493 
02494         nX[1] = (nX[0] < (nWidth-1) ? nX[0]+1 : nX[0]);
02495         nY[1] = nY[0];
02496 
02497         nX[2] = nX[0];
02498         nY[2] = (nY[0] < (nHeight-1) ? nY[0]+1 : nY[0]);
02499 
02500         nX[3] = nX[1];
02501         nY[3] = nY[2];
02502 
02503         uint32 i;
02504 
02505         for (i = 0; i < 4; ++i)
02506         {
02507                 nlassert (nX[i] >= 0);
02508                 nlassert (nY[i] >= 0 );
02509                 nlassert (nX[i] < nWidth);
02510                 nlassert (nY[i] < nHeight);
02511         }
02512 
02513         // Decimal part of (x,y)
02514         x = x - (float)nX[0]; 
02515         y = y - (float)nY[0];
02516 
02517         switch (this->PixelFormat)
02518         {
02519                 case RGBA:
02520                 case DXTC1:
02521                 case DXTC1Alpha:
02522                 case DXTC3:
02523                 case DXTC5:
02524                 {                                                                       
02525                         CRGBAF finalVal;
02526                         CRGBA val[4];
02527 
02528                         if (this->PixelFormat == RGBA)
02529                         {
02530                                 for (i = 0; i < 4; ++i)
02531                                 {
02532                                         val[i] = CRGBA (rBitmap[(nX[i]+nY[i]*nWidth)*4+0],
02533                                                                         rBitmap[(nX[i]+nY[i]*nWidth)*4+1],
02534                                                                         rBitmap[(nX[i]+nY[i]*nWidth)*4+2],
02535                                                                         rBitmap[(nX[i]+nY[i]*nWidth)*4+3]);
02536                                 }
02537                         }
02538                         else
02539                         {
02540                                 // slower version : get from DXT
02541                                 for (i = 0; i < 4; ++i)
02542                                 {
02543                                         val[i] = getPixelColor(nX[i], nY[i]);
02544                                 }
02545                         }
02546 
02547                         finalVal.R = getColorInterp (x, y, val[0].R, val[1].R, val[2].R, val[3].R);
02548                         finalVal.G = getColorInterp (x, y, val[0].G, val[1].G, val[2].G, val[3].G);
02549                         finalVal.B = getColorInterp (x, y, val[0].B, val[1].B, val[2].B, val[3].B);
02550                         finalVal.A = getColorInterp (x, y, val[0].A, val[1].A, val[2].A, val[3].A);
02551                         finalVal /= 255.f;
02552 
02553                         return finalVal;                        
02554                 }
02555                 break;
02556                 case Alpha:
02557                 case Luminance:
02558                 {
02559                         
02560                         float finalVal;
02561                         float val[4];
02562 
02563                         for (i = 0; i < 4; ++i)
02564                                 val[i] = rBitmap[(nX[i]+nY[i]*nWidth)];
02565 
02566                         finalVal = getColorInterp (x, y, val[0], val[1], val[2], val[3]);
02567                         finalVal /= 255.f;
02568 
02569                         if (this->PixelFormat == Alpha)
02570                                 return CRGBAF (1.f, 1.f, 1.f, finalVal);
02571                         else // Luminance
02572                                 return CRGBAF (finalVal, finalVal, finalVal, 1.f);
02573                 }
02574                 break;
02575                 default: break;
02576         }
02577 
02578         return CRGBAF (0.0f, 0.0f, 0.0f, 0.0f);
02579 }

float NLMISC::CBitmap::getColorInterp float  x,
float  y,
float  xy00,
float  xy01,
float  xy10,
float  xy11
const [private]
 

Quadratic interpolator

Returns:
the interpolation in (x,y) of the values (xy**)

Definition at line 2459 of file bitmap.cpp.

References NLMISC::clamp(), res, x, and y.

Referenced by getColor().

02460 {
02461         float res =     colorInXY00*(1.0f-x)*(1.0f-y) +
02462                                 colorInXY10*(     x)*(1.0f-y) +
02463                                 colorInXY01*(1.0f-x)*(     y) +
02464                                 colorInXY11*(     x)*(     y);
02465         clamp (res, 0.0f, 255.0f);
02466         return res;
02467 }

CRGBA NLMISC::CBitmap::getDXTC1Texel sint  x,
sint  y,
uint32  numMipMap
const [private]
 

Definition at line 3048 of file bitmap.cpp.

References getDXTCColorFromBlock(), getHeight(), getPixels(), getWidth(), sint, uint, uint32, uint8, w, x, and y.

Referenced by getPixelColor().

03049 {
03050         uint w = getWidth(numMipMap);
03051         uint h = getHeight(numMipMap);
03052         if (w == 0 || h == 0 || (uint) x >= w || (uint) y >= h) return CRGBA::Black; // include negative cases  
03053         uint numRowBlocks   = std::max((w + 3) >> 2, 1u);
03054         const uint8 *pix    = &getPixels(numMipMap)[0];
03055         const uint8 *block  = pix + ((y >> 2) * (numRowBlocks << 3) + ((x >> 2) << 3)); 
03056         return getDXTCColorFromBlock(block, x, y);
03057 }

CRGBA NLMISC::CBitmap::getDXTC3Texel sint  x,
sint  y,
uint32  numMipMap
const [private]
 

Definition at line 3061 of file bitmap.cpp.

References NLMISC::CRGBA::A, getDXTCColorFromBlock(), getHeight(), getPixels(), getWidth(), sint, uint, uint32, uint8, w, x, and y.

Referenced by getPixelColor().

03062 {
03063         uint w = getWidth(numMipMap);
03064         uint h = getHeight(numMipMap);
03065         if (w == 0 || h == 0 || (uint) x >= w || (uint) y >= h) return CRGBA::Black; // include negative cases  
03066         uint numRowBlocks   = std::max((w + 3) >> 2, 1u);
03067         const uint8 *pix    = &getPixels(numMipMap)[0];
03068         const uint8 *block  = pix + ((y >> 2) * (numRowBlocks << 4) + ((x >> 2) << 4)); 
03069         CRGBA result = getDXTCColorFromBlock(block + 8, x, y);
03070         // get alpha part
03071         uint8 alphaByte = block[((y & 3) << 1) + ((x & 2) >> 1)];
03072         result.A = (x & 1) ?  (alphaByte & 0xf0) : (alphaByte << 4);
03073         return result;
03074 }

CRGBA NLMISC::CBitmap::getDXTC5Texel sint  x,
sint  y,
uint32  numMipMap
const [private]
 

Definition at line 3077 of file bitmap.cpp.

References NLMISC::CRGBA::A, getDXTCColorFromBlock(), getHeight(), getPixels(), getWidth(), sint, uint, uint32, uint8, w, x, and y.

Referenced by getPixelColor().

03078 {
03079         uint w = getWidth(numMipMap);
03080         uint h = getHeight(numMipMap);
03081         if (w == 0 || h == 0 || (uint) x >= w || (uint) y >= h) return CRGBA::Black; // include negative cases  
03082         uint numRowBlocks   = std::max((w + 3) >> 2, 1u);
03083         const uint8 *pix    = &getPixels(numMipMap)[0];
03084         const uint8 *block  = pix + ((y >> 2) * (numRowBlocks << 4) + ((x >> 2) << 4)); 
03085         CRGBA result = getDXTCColorFromBlock(block + 8, x, y);
03086         // get alpha part
03087         uint8 alpha0 = block[0];
03088         uint8 alpha1 = block[1];
03089         
03090         uint alphaIndex;
03091         uint tripletIndex = (x & 3) + ((y & 3) << 2);
03092         if (tripletIndex < 8)
03093         {
03094                 alphaIndex = (((uint32 &) block[2]) >> (tripletIndex * 3)) & 7;
03095         }
03096         else
03097         {
03098                 alphaIndex = (((uint32 &) block[5]) >> ((tripletIndex - 8) * 3)) & 7; // we can read a dword there because there are color datas following he alpha datas
03099         }
03100 
03101         if (alpha0 > alpha1)
03102         {
03103                 switch (alphaIndex)
03104                 {
03105                         case 0: result.A = alpha0; break;
03106                         case 1: result.A = alpha1; break;
03107                         case 2: result.A = (uint8) ((6 * (uint) alpha0 + (uint) alpha1) / 7); break;
03108                         case 3: result.A = (uint8) ((5 * (uint) alpha0 + 2 * (uint) alpha1) / 7); break;
03109                         case 4: result.A = (uint8) ((4 * (uint) alpha0 + 3 * (uint) alpha1) / 7); break;
03110                         case 5: result.A = (uint8) ((3 * (uint) alpha0 + 4 * (uint) alpha1) / 7); break;
03111                         case 6: result.A = (uint8) ((2 * (uint) alpha0 + 5 * (uint) alpha1) / 7); break;
03112                         case 7: result.A = (uint8) (((uint) alpha0 + (uint) 6 * alpha1) / 7); break;
03113                 }
03114         }
03115         else
03116         {
03117                 switch (alphaIndex)
03118                 {
03119                         case 0: result.A = alpha0; break;
03120                         case 1: result.A = alpha1; break;
03121                         case 2: result.A = (uint8) ((4 * (uint) alpha0 + (uint) alpha1) / 5); break;
03122                         case 3: result.A = (uint8) ((3 * (uint) alpha0 + 2 * (uint) alpha1) / 5); break;
03123                         case 4: result.A = (uint8) ((2 * (uint) alpha0 + 3 * (uint) alpha1) / 5); break;
03124                         case 5: result.A = (uint8) (((uint) alpha0 + 4 * (uint) alpha1) / 5); break;
03125                         case 6: result.A = 0;   break;
03126                         case 7: result.A = 255; break;
03127                 }
03128         }
03129         return result;  
03130 }

CRGBA NLMISC::CBitmap::getDXTCColorFromBlock const uint8 block,
sint  x,
sint  y
[static, private]
 

Definition at line 2990 of file bitmap.cpp.

References NLMISC::CRGBA::A, NLMISC::CRGBA::blendFromui(), NLMISC::CRGBA::set(), sint, uint, uint16, uint8, uncompress(), x, and y.

Referenced by getDXTC1Texel(), getDXTC3Texel(), and getDXTC5Texel().

02991 {
02992         uint16  col0;
02993         uint16  col1;
02994         memcpy(&col0, block, sizeof(uint16));
02995         memcpy(&col1, block + 2, sizeof(uint16));
02996         uint    colIndex = (block[4 + (y & 3)] >> ((x & 3) << 1)) & 3;
02997         CRGBA   result, c0, c1;
02998         if (col0 > col1)
02999         {       
03000                 switch(colIndex)
03001                 {
03002                         case 0:
03003                                 uncompress(col0, result);                               
03004                         break;
03005                         case 1:
03006                                 uncompress(col1, result);
03007                         break;
03008                         case 2:
03009                                 uncompress(col0, c0);
03010                                 uncompress(col1, c1);
03011                                 result.blendFromui(c0, c1, 85);
03012                         break;
03013                         case 3:
03014                                 uncompress(col0, c0);
03015                                 uncompress(col1, c1);
03016                                 result.blendFromui(c0, c1, 171);
03017                         break;
03018                 }
03019                 result.A = 255;
03020         }
03021         else
03022         {
03023                 switch(colIndex)
03024                 {
03025                         case 0:
03026                                 uncompress(col0, result);
03027                                 result.A = 255;
03028                         break;
03029                         case 1:
03030                                 uncompress(col1, result);
03031                                 result.A = 255;
03032                         break;
03033                         case 2:
03034                                 uncompress(col0, c0);
03035                                 uncompress(col1, c1);
03036                                 result.blendFromui(c0, c1, 128);
03037                                 result.A = 255;
03038                         break;
03039                         case 3:
03040                                 result.set(0, 0, 0, 0);                         
03041                         break;
03042                 }
03043         }       
03044         return result;
03045 }

uint32 NLMISC::CBitmap::getHeight uint32  numMipMap = 0  )  const [virtual]
 

Return the image height, or a mipmap height.

Parameters:
mipMap mipmap level
Returns:
image height (0 if mipmap not found)

Definition at line 1388 of file bitmap.cpp.

References uint32, and w.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CLodCharacterTmpBitmap::build(), NL3D::CCoarseMeshBuild::buildBitmap(), NL3D::CTextureFile::buildBitmapFromFile(), NL3D::CFontManager::computeString(), NL3D::CFastHLSModifier::convertDDSBitmap(), draw2dLine(), NL3D::CCoarseMeshBuild::expand(), NL3D::CDriverGL::fillBuffer(), flipH(), flipV(), NL3D::CPatchDLMContext::generate(), getColor(), getDXTC1Texel(), getDXTC3Texel(), getDXTC5Texel(), getRGBAPixel(), getSize(), NL3D::GetTextureSize(), NL3D::CTileBank::getTileNoiseMap(), NL3D::CZoneLighter::lightWater(), NL3D::CShapeBank::processWSUploadTexture(), RenderTriangle(), rot90CCW(), rot90CW(), NL3D::CHLSColorTexture::setBitmap(), NL3D::CDriverGL::setupTextureEx(), NL3D::CDriverGL::uploadTexture(), and NL3D::CAsyncTextureManager::uploadTexturePart().

01389 {
01390         if(mipMap==0) return _Height;
01391         
01392         uint32 w = _Width;
01393         uint32 h = _Height;
01394         uint32 m = 0;
01395 
01396         do
01397         {
01398                 m++;
01399                 w = (w+1)/2;
01400                 h = (h+1)/2;
01401                 if(m==mipMap) return h;
01402         }
01403         while(w!=1 || h!=1);
01404 
01405         return 0;
01406 }

uint32 NLMISC::CBitmap::getMipMapCount  )  const [inline]
 

Return the number of mipmaps. Level0 is a mipmap...

Returns:
number of mipmaps. 0 if no image at all. 1 if no mipmaping (for the base level).

Definition at line 369 of file bitmap.h.

References _MipMapCount, and uint32.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CShapeBank::processWSUploadTexture(), NL3D::CHLSColorTexture::setBitmap(), NL3D::CDriverGL::setupTextureEx(), NL3D::CDriverGL::uploadTexture(), NL3D::CAsyncTextureManager::uploadTexturePart(), and NL3D::CAsyncTextureManager::validDXTCMipMap().

00370         {
00371                 return _MipMapCount; 
00372         }

CRGBA NLMISC::CBitmap::getPixelColor sint  x,
sint  y,
uint32  numMipMap = 0
const
 

Get the pixel at the given coorrdinate. Works in RGBA and DXTC modes. Outside of the bitmap it returns Black (or if mipmap is not found)

Definition at line 3134 of file bitmap.cpp.

References getDXTC1Texel(), getDXTC3Texel(), getDXTC5Texel(), getRGBAPixel(), nlstop, PixelFormat, RGBA, sint, uint32, x, and y.

Referenced by getColor().

03135 {
03136         
03137         switch (PixelFormat)
03138         {
03139                 case RGBA:      
03140                         return getRGBAPixel(x, y, numMipMap);           
03141                 case DXTC1:
03142                 case DXTC1Alpha: 
03143                         return getDXTC1Texel(x, y, numMipMap);
03144                 case DXTC3:
03145                         return getDXTC3Texel(x, y, numMipMap);
03146                 case DXTC5:
03147                         return getDXTC5Texel(x, y, numMipMap);
03148                 default:
03149                         nlstop;
03150                 break;
03151         }
03152         return CRGBA::Black;
03153 }

TType NLMISC::CBitmap::getPixelFormat  )  const [inline]
 

Return the format of pixels stored at the present time in the object buffer.

Returns:
Pixel format (rgba luminance alpha alphaLuminance dxtc1 dxtc1Alpha dxtc3 dxtc5)

Definition at line 335 of file bitmap.h.

References PixelFormat.

Referenced by NL3D::CFastHLSModifier::convertDDSBitmap(), NL3D::CFastHLSModifier::convertRGBABitmap(), NL3D::CTextureGrouped::doGenerate(), NL3D::CDriverGL::fillBuffer(), NL3D::getGlSrcTextureFormat(), NL3D::CDriverGL::getGlTextureFormat(), NL3D::CShapeBank::processWSUploadTexture(), NL3D::CTextureFar::rebuildPatch(), NL3D::CHLSColorTexture::setBitmap(), NL3D::CDriverGL::setupTextureEx(), NL3D::CAsyncTextureManager::update(), NL3D::CDriverGL::uploadTexture(), NL3D::CAsyncTextureManager::uploadTexturePart(), and NL3D::CAsyncTextureManager::validDXTCMipMap().

00336         {
00337                 return PixelFormat; 
00338         }

const CObjectVector<uint8>& NLMISC::CBitmap::getPixels uint32  numMipMap = 0  )  const [inline]
 

Definition at line 313 of file bitmap.h.

References uint32.

00314         {
00315                 //nlassert (numMipMap<=_MipMapCount);
00316                 return _Data[numMipMap]; 
00317         }

CObjectVector<uint8>& NLMISC::CBitmap::getPixels uint32  numMipMap = 0  )  [inline]
 

Return the pixels buffer of the image, or of one of its mipmap. Return a reference of an array in pixel format get with getPixelFormat().

Returns:
CObjectVector<uint8>& RGBA pixels

Definition at line 308 of file bitmap.h.

References uint32.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CLodCharacterTmpBitmap::build(), NL3D::CTextureFile::buildBitmapFromFile(), NL3D::CHLSColorTexture::buildColorVersion(), NL3D::CFastHLSModifier::convertDDSBitmapDXTC1Or1A(), NL3D::CFastHLSModifier::convertDDSBitmapDXTC3Or5(), NL3D::CFastHLSModifier::convertRGBABitmap(), NL3D::CTextureDLM::copyRect(), NL3D::CTextureFont::CTextureFont(), NL3D::CTextureMem::doGenerate(), NL3D::CTextureEmboss::doGenerate(), NL3D::CTextureBump::doGenerate(), draw2dLine(), NL3D::CTextureFont::dumpTextureFont(), NL3D::CCoarseMeshBuild::expand(), NL3D::CDriverGL::fillBuffer(), NL3D::CTextureDLM::fillRect(), NL3D::CDriverGL::getBufferPart(), getColor(), getDXTC1Texel(), getDXTC3Texel(), getDXTC5Texel(), getRGBAPixel(), NL3D::CTileBank::getTileNoiseMap(), NL3D::CZoneLighter::lightWater(), NL3D::CTextureDLM::modulateAndfillRect565(), NL3D::CTextureDLM::modulateAndfillRect8888(), NL3D::CTextureDLM::modulateConstantAndfillRect(), NL3D::CTextureFar::rebuildPatch(), RenderTriangle(), NL3D::CHLSColorTexture::setBitmap(), NL3D::CDriverGL::setupTextureEx(), and NL3D::CDriverGL::uploadTexture().

00309         { 
00310                 //nlassert (numMipMap<=_MipMapCount);
00311                 return _Data[numMipMap];
00312         }

CRGBA NLMISC::CBitmap::getRGBAPixel sint  x,
sint  y,
uint32  numMipMap
const [private]
 

Definition at line 2980 of file bitmap.cpp.

References getHeight(), getPixels(), getWidth(), sint, uint, uint32, uint8, w, x, and y.

Referenced by getPixelColor().

02981 {
02982         uint w = getWidth(numMipMap);
02983         uint h = getHeight(numMipMap);
02984         if (w == 0 || (uint) x >= w || (uint) y >= h) return CRGBA::Black; // include negative cases
02985         const uint8 *pix = &getPixels(numMipMap)[(x + y * w) << 2];
02986         return CRGBA(pix[0], pix[1], pix[2], pix[3]);
02987 }

uint32 NLMISC::CBitmap::getSize uint32  numMipMap = 0  )  const
 

Return the size (in pixels) of the image: <=> getHeight()*getWidth().

Parameters:
mipMap mipmap level
Returns:
image size (0 if mipmap not found)

Definition at line 1412 of file bitmap.cpp.

References getHeight(), getWidth(), and uint32.

Referenced by NL3D::CShapeBank::processWSUploadTexture(), NL3D::CDriverGL::setupTextureEx(), NL3D::CAsyncTextureManager::update(), and NL3D::CAsyncTextureManager::uploadTexturePart().

01413 {
01414         return getHeight(numMipMap)*getWidth(numMipMap);
01415 }

uint32 NLMISC::CBitmap::getWidth uint32  numMipMap = 0  )  const [virtual]
 

Return the image width, or a mipmap width.

Parameters:
mipMap mipmap level
Returns:
image width (0 if mipmap not found)

Definition at line 1363 of file bitmap.cpp.

References uint32, and w.

Referenced by NL3D::CHLSColorTexture::addMask(), NL3D::CShadowMapManager::allocateTexture(), NL3D::CLodCharacterTmpBitmap::build(), NL3D::CCoarseMeshBuild::buildBitmap(), NL3D::CTextureFile::buildBitmapFromFile(), NL3D::CFontManager::computeString(), NL3D::CFastHLSModifier::convertDDSBitmap(), NL3D::CTextureDLM::copyRect(), draw2dLine(), NL3D::CCoarseMeshBuild::expand(), NL3D::CDriverGL::fillBuffer(), NL3D::CTextureDLM::fillRect(), flipH(), flipV(), NL3D::CPatchDLMContext::generate(), getColor(), getDXTC1Texel(), getDXTC3Texel(), getDXTC5Texel(), getRGBAPixel(), getSize(), NL3D::GetTextureSize(), NL3D::CTileBank::getTileNoiseMap(), NL3D::CZoneLighter::lightWater(), NL3D::CTextureDLM::modulateAndfillRect565(), NL3D::CTextureDLM::modulateAndfillRect8888(), NL3D::CTextureDLM::modulateConstantAndfillRect(), NL3D::CShapeBank::processWSUploadTexture(), RenderTriangle(), rot90CCW(), rot90CW(), NL3D::CHLSColorTexture::setBitmap(), NL3D::CDriverGL::setupTextureEx(), NL3D::CDriverGL::uploadTexture(), and NL3D::CAsyncTextureManager::uploadTexturePart().

01364 {
01365         if(mipMap==0) return _Width;
01366         
01367         uint32 w = _Width;
01368         uint32 h = _Height;
01369         uint32 m = 0;
01370         
01371         do
01372         {
01373                 m++;
01374                 w = (w+1)/2;
01375                 h = (h+1)/2;
01376                 if(m==mipMap) return w;
01377         }
01378         while(w!=1 || h!=1);
01379 
01380         return 0;
01381 }

bool NLMISC::CBitmap::isGrayscaleAsAlpha  )  const [inline]
 

Tell if the bitmap loads grayscale bitmap as alpha or luminance format.

Returns:
true if the bitmap loads grayscale bitmaps as alpha, false if it loads grayscale bitmaps as luminance.

Definition at line 483 of file bitmap.h.

References _LoadGrayscaleAsAlpha.

00484         {
00485                 return _LoadGrayscaleAsAlpha;
00486         }

uint8 NLMISC::CBitmap::load NLMISC::IStream f,
uint  mipMapSkip = 0
 

Read a bitmap(TGA or DDS) from an IStream. Bitmap supported are DDS (DXTC1, DXTC1 with Alpha, DXTC3, DXTC5, and uncompressed TGA (24 and 32 bits).

Parameters:
IStream The stream must be in reading mode.
mipMapSkip if the file is a DDS with mipMap. N=mipMapSkip mipmaps are skipped.
Returns:
image depth (24 or 32), or 0 if load failed
Exceptions:
ESeekFailed : seek has failed

Definition at line 109 of file bitmap.cpp.

References NLMISC::IStream::begin, NLMISC::DDS, depth, height, NLMISC::IStream::isReading(), nlassert, readDDS(), readTGA(), NLMISC::IStream::seek(), NLMISC::IStream::serial(), uint, uint16, uint32, uint8, and width.

Referenced by NL3D::CTextureFile::buildBitmapFromFile(), and NL3D::CTextureMem::doGenerate().

00110 {
00111         nlassert(f.isReading()); 
00112         
00113         // testing if DDS
00114         uint32 fileType = 0;;
00115         f.serial(fileType);
00116         if(fileType == DDS)
00117         {
00118 #ifdef NEL_ALL_BITMAP_WHITE
00119                 uint8 result = readDDS(f, mipMapSkip);
00120                 MakeWhite (*this);
00121                 return result;
00122 #else // NEL_ALL_BITMAP_WHITE
00123                 return readDDS(f, mipMapSkip);
00124 #endif // NEL_ALL_BITMAP_WHITE
00125         }
00126         // assuming it's TGA
00127         else 
00128         {
00129                 NLMISC::IStream::TSeekOrigin origin= f.begin;
00130                 if(!f.seek (0, origin))
00131                 {
00132                         throw ESeekFailed();
00133                 }
00134 
00135                 // Reading header, 
00136                 // To make sure that the bitmap is TGA, we check imageType and imageDepth.
00137                 uint8   lengthID;
00138                 uint8   cMapType;
00139                 uint8   imageType;
00140                 uint16  tgaOrigin;
00141                 uint16  length;
00142                 uint8   depth;
00143                 uint16  xOrg;
00144                 uint16  yOrg;
00145                 uint16  width;
00146                 uint16  height;
00147                 uint8   imageDepth;
00148                 uint8   desc;
00149                 
00150                 f.serial(lengthID);
00151                 f.serial(cMapType);
00152                 f.serial(imageType);
00153                 if(imageType!=2 && imageType!=3 && imageType!=10 && imageType!=11) return 0;
00154                 f.serial(tgaOrigin);
00155                 f.serial(length);
00156                 f.serial(depth);
00157                 f.serial(xOrg);
00158                 f.serial(yOrg);
00159                 f.serial(width);
00160                 f.serial(height);
00161                 f.serial(imageDepth);
00162                 if(imageDepth!=8 && imageDepth!=16 && imageDepth!=24 && imageDepth!=32) return 0;
00163                 f.serial(desc);
00164 
00165                 if(!f.seek (0, origin))
00166                 {
00167                         throw ESeekFailed();
00168                 }
00169 #ifdef NEL_ALL_BITMAP_WHITE
00170                 uint8 result = readTGA(f);
00171                 MakeWhite (*this);
00172                 return result;
00173 #else // NEL_ALL_BITMAP_WHITE
00174                 return readTGA(f);
00175 #endif // NEL_ALL_BITMAP_WHITE
00176                 
00177         }       
00178 }

void NLMISC::CBitmap::loadGrayscaleAsAlpha bool  loadAsAlpha  )  [inline]
 

Tell the bitmap to load grayscale bitmap as alpha or luminance format.

Parameters:
loadAsAlpha is true to load grayscale bitmaps as alpha. false to load grayscale bitmaps as luminance. default value is true.

Definition at line 472 of file bitmap.h.

References _LoadGrayscaleAsAlpha.

Referenced by NL3D::CTextureFile::buildBitmapFromFile(), and NL3D::CTileBank::getTileNoiseMap().

00473         {
00474                 _LoadGrayscaleAsAlpha=loadAsAlpha;
00475         }

void NLMISC::CBitmap::loadSize const std::string &  path,
uint32 retWidth,
uint32 retHeight
[static]
 

same than other loadSize(), but with a pathName.

See also:
loadSize()

Definition at line 2671 of file bitmap.cpp.

References loadSize(), NLMISC::CIFile::open(), and uint32.

02672 {
02673         retWidth= 0;
02674         retHeight= 0;
02675 
02676         CIFile          f(path);
02677         if(f.open(path))
02678                 loadSize(f, retWidth, retHeight);
02679 }

void NLMISC::CBitmap::loadSize NLMISC::IStream f,
uint32 width,
uint32 height
[static]
 

Determinate the bitmap size from a bitmap(TGA or DDS) from an IStream. load just header of the file. Bitmap supported are DDS (DXTC1, DXTC1 with Alpha, DXTC3, DXTC5, and uncompressed TGA (24 and 32 bits). NB: at the end, f is seeked to begin.

Parameters:
IStream The stream must be in reading mode.
width the width of the image. 0 if fails.
height the height of the image. 0 if fails.
Exceptions:
ESeekFailed : seek has failed

Definition at line 2582 of file bitmap.cpp.

References NLMISC::DDS, DDSD_LINEARSIZE, depth, height, NLMISC::IStream::isReading(), nlassert, NLMISC::IStream::seek(), NLMISC::IStream::serial(), size, uint, uint16, uint32, uint8, and width.

Referenced by loadSize().

02583 {
02584         retWidth= 0;
02585         retHeight= 0;
02586 
02587 
02588         nlassert(f.isReading()); 
02589         
02590         // testing if DDS
02591         uint32 fileType = 0;
02592         f.serial(fileType);
02593         if(fileType == DDS)
02594         {
02595                 // read entire DDS header.
02596                 uint32 size = 0;
02597                 f.serial(size); // size in Bytes of header(without "DDS")
02598                 uint32 * _DDSSurfaceDesc = new uint32[size]; 
02599                 std::auto_ptr<uint32> _DDSSurfaceDescAuto(_DDSSurfaceDesc);
02600                 _DDSSurfaceDesc[0]= size;
02601 
02602                 for(uint i= 0; i<size/4 - 1; i++)
02603                 {
02604                         f.serial(_DDSSurfaceDesc[i+1]);
02605                 }
02606                 
02607                 // flags determines which members of the header structure contain valid data
02608                 uint32 flags = _DDSSurfaceDesc[1];
02609 
02610                 //verify if file have linearsize set
02611                 if(!(flags & DDSD_LINEARSIZE)) 
02612                 {
02613                         throw EDDSBadHeader();
02614                 }
02615                 
02616                 //-------------- extracting and testing useful info
02617                 retHeight  = _DDSSurfaceDesc[2];
02618                 retWidth = _DDSSurfaceDesc[3];
02619         }
02620         // assuming it's TGA
02621         else 
02622         {
02623                 if(!f.seek (0, NLMISC::IStream::begin))
02624                 {
02625                         throw ESeekFailed();
02626                 }
02627 
02628                 // Reading header, 
02629                 // To make sure that the bitmap is TGA, we check imageType and imageDepth.
02630                 uint8   lengthID;
02631                 uint8   cMapType;
02632                 uint8   imageType;
02633                 uint16  tgaOrigin;
02634                 uint16  length;
02635                 uint8   depth;
02636                 uint16  xOrg;
02637                 uint16  yOrg;
02638                 uint16  width;
02639                 uint16  height;
02640                 uint8   imageDepth;
02641                 uint8   desc;
02642                 
02643                 f.serial(lengthID);
02644                 f.serial(cMapType);
02645                 f.serial(imageType);
02646                 if(imageType!=2 && imageType!=3 && imageType!=10 && imageType!=11) return;
02647                 f.serial(tgaOrigin);
02648                 f.serial(length);
02649                 f.serial(depth);
02650                 f.serial(xOrg);
02651                 f.serial(yOrg);
02652                 f.serial(width);
02653                 f.serial(height);
02654                 f.serial(imageDepth);
02655                 if(imageDepth!=8 && imageDepth!=24 && imageDepth!=32) return;
02656                 f.serial(desc);
02657 
02658                 // Ok, we have width and height.
02659                 retWidth= width;
02660                 retHeight= height;
02661         }
02662 
02663         // reset stream.
02664         if(!f.seek (0, NLMISC::IStream::begin))
02665         {
02666                 throw ESeekFailed();
02667         }
02668 }

bool NLMISC::CBitmap::luminanceToAlpha  )  [private]
 

Definition at line 736 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlpha().

00737 {
00738         uint32 i;
00739 
00740         if(_Width*_Height == 0)  return false;
00741                 
00742         for(uint8 m= 0; m<_MipMapCount; m++)
00743         {
00744                 CObjectVector<uint8> dataTmp;
00745                 dataTmp.resize(_Data[m].size());
00746                 uint    dstId= 0;
00747 
00748                 for(i=0; i<_Data[m].size(); i++)
00749                 {
00750                         dataTmp[dstId++]= _Data[m][i];
00751                 }
00752                 _Data[m] = dataTmp;
00753         }
00754         PixelFormat = Alpha;
00755         return true;
00756 }

bool NLMISC::CBitmap::luminanceToAlphaLuminance  )  [private]
 

Definition at line 579 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlphaLuminance().

00580 {
00581         uint32 i;
00582 
00583         if(_Width*_Height == 0)  return false;
00584                 
00585         for(uint8 m= 0; m<_MipMapCount; m++)
00586         {
00587                 CObjectVector<uint8> dataTmp;
00588                 dataTmp.resize(_Data[m].size()*2);
00589                 uint    dstId= 0;
00590 
00591                 for(i=0; i<_Data[m].size(); i++)
00592                 {
00593                         dataTmp[dstId++]= _Data[m][i];
00594                         dataTmp[dstId++]= 255;
00595                 }
00596                 _Data[m] = dataTmp;
00597         }
00598         PixelFormat = AlphaLuminance;
00599         return true;
00600 }

bool NLMISC::CBitmap::luminanceToRGBA  )  [private]
 

Definition at line 462 of file bitmap.cpp.

References _MipMapCount, PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToRGBA().

00463 {
00464         uint32 i;
00465 
00466         if(_Width*_Height == 0)  return false;
00467         
00468         for(uint8 m= 0; m<_MipMapCount; m++)
00469         {
00470                 CObjectVector<uint8> dataTmp;
00471                 dataTmp.resize(_Data[m].size()*4);
00472                 uint    dstId= 0;
00473 
00474                 for(i=0; i<_Data[m].size(); i++)
00475                 {
00476                         dataTmp[dstId++]= _Data[m][i];
00477                         dataTmp[dstId++]= _Data[m][i];
00478                         dataTmp[dstId++]= _Data[m][i];
00479                         dataTmp[dstId++]= 255;
00480                 }
00481                 _Data[m] = dataTmp;
00482         }
00483         PixelFormat = RGBA;
00484         return true;
00485 }

void NLMISC::CBitmap::makeDummy  ) 
 

Make a dummy "?" texture. Usefull for file not found. Mode is rgba.

Definition at line 184 of file bitmap.cpp.

References _MipMapCount, NLMISC::CObjectVector< uint8 >::getPtr(), PixelFormat, NLMISC::CObjectVector< uint8 >::resize(), RGBA, NLMISC::CRGBA::set(), sint, and uint8.

Referenced by NL3D::CTextureFile::buildBitmapFromFile(), NL3D::CreateDummyMesh(), NL3D::CTextureMultiFile::doGenerate(), NL3D::CTextureMem::doGenerate(), NL3D::CTextureGrouped::doGenerate(), NL3D::CTextureEmboss::doGenerate(), NL3D::CTextureBump::doGenerate(), and NL3D::CTextureBlend::doGenerate().

00185 {
00186         static  const uint8     bitmap[1024]= {  
00187                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
00188                 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
00189                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00190                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00191                 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
00192                 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
00193                 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,
00194                 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,
00195                 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,
00196                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00197                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00198                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00199                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00200                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00201                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00202                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
00203                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
00204                 0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,
00205                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00206                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00207                 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
00208                 0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,
00209                 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,
00210                 0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,0,0,0,0,0,
00211                 0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,0,0,0,0,
00212                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00213                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00214                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00215                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00216                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00217                 0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,0,0,0,
00218                 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
00219         }; 
00220 
00221         PixelFormat = RGBA;
00222         _MipMapCount = 1;
00223         _Width= 32;
00224         _Height= 32;
00225         _Data[0].resize(_Width*_Height*sizeof(NLMISC::CRGBA));
00226         NLMISC::CRGBA   *pix= (NLMISC::CRGBA*)(_Data[0].getPtr());
00227 
00228         for(sint i=0;i<(sint)(_Width*_Height);i++)
00229         {
00230                 if(bitmap[i])
00231                         pix[i].set(255,255,255,255);
00232                 else
00233                         pix[i].set(0x80,0x80,0x80,0x40);
00234         }
00235 
00236 }

uint8 NLMISC::CBitmap::readDDS NLMISC::IStream f,
uint  mipMapSkip
[private]
 

Read a DDS from an IStream. The bitmap is readen as a set of bytes and stocked compressed. Width and Height are multiple of 4.

Parameters:
IStream The stream must be in reading mode.
Returns:
image depth
Exceptions:
EDDSBadHeader : surface is header is not valid.

Definition at line 244 of file bitmap.cpp.

References _MipMapCount, DDSD_LINEARSIZE, DXTC1HEADER, DXTC3HEADER, DXTC5HEADER, NLMISC::getPowerOf2(), min, PixelFormat, NLMISC::CObjectVector< uint8 >::resize(), NLMISC::IStream::seek(), NLMISC::IStream::serial(), NLMISC::IStream::serialBuffer(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, uint8, and w.

Referenced by load().

00245 {
00246         //------------------ Reading Header ------------------------
00247 
00248         //-------------- reading entire header
00249         
00250         uint32 size = 0;
00251         f.serial(size); // size in Bytes of header(without "DDS")
00252          uint32 * _DDSSurfaceDesc = new uint32[size]; 
00253          std::auto_ptr<uint32> _DDSSurfaceDescAuto(_DDSSurfaceDesc);
00254         _DDSSurfaceDesc[0]= size;
00255 
00256 #ifdef NL_LITTLE_ENDIAN
00257         f.serialBuffer((uint8*)(_DDSSurfaceDesc+1), size-4);
00258 #else
00259         for(uint i= 0; i<size/4 - 1; i++)
00260         {
00261                 f.serial(_DDSSurfaceDesc[i+1]);
00262         }
00263 #endif
00264         
00265         // flags determines which members of the header structure contain valid data
00266         uint32 flags = _DDSSurfaceDesc[1];
00267 
00268         //verify if file have linearsize set
00269         if(!(flags & DDSD_LINEARSIZE)) 
00270     {
00271                 throw EDDSBadHeader();
00272         }
00273         
00274         //-------------- extracting and testing useful info
00275 
00276         _Height = _DDSSurfaceDesc[2];
00277         _Width  = _DDSSurfaceDesc[3];
00278         _MipMapCount= (uint8) _DDSSurfaceDesc[6];
00279         // If no mipmap.
00280         if(_MipMapCount==0)
00281                 _MipMapCount=1;
00282         switch (_DDSSurfaceDesc[20])
00283         {
00284         case DXTC1HEADER:
00285                 PixelFormat=DXTC1;
00286                 break;
00287         case DXTC3HEADER:
00288                 PixelFormat=DXTC3;
00289                 break;
00290         case DXTC5HEADER:
00291                 PixelFormat=DXTC5;
00292                 break;
00293         }
00294         
00295         flags = _DDSSurfaceDesc[19]; //PixelFormat flags
00296         
00297         if(PixelFormat==DXTC1 && _DDSSurfaceDesc[21]>0) //AlphaBitDepth
00298         {
00299                 PixelFormat = DXTC1Alpha;
00300         }
00301         
00302         if(PixelFormat!= DXTC1 && PixelFormat!= DXTC1Alpha && PixelFormat!= DXTC3 && PixelFormat!= DXTC5)
00303         {
00304                 throw EDDSBadHeader();
00305         }
00306 
00307         // compute the min power of 2 between width and height
00308         uint    minSizeLevel= min(_Width, _Height);
00309         minSizeLevel= getPowerOf2(minSizeLevel);
00310 
00311         //------------- manage mipMapSkip 
00312         if(_MipMapCount>1 && mipMapSkip>0 && minSizeLevel>2)
00313         {
00314                 // Keep at least the level where width and height are at leat 4.
00315                 mipMapSkip= min(mipMapSkip, minSizeLevel-2);
00316                 // skip any mipmap
00317                 uint    seekSize= 0;
00318                 while(mipMapSkip>0)
00319                 {
00320                         uint32 mipMapSz;
00321                         if(PixelFormat==DXTC1 || PixelFormat==DXTC1Alpha)
00322                                 mipMapSz = _Width*_Height/2;
00323                         else
00324                                 mipMapSz = _Width*_Height;
00325 
00326                         // add to how many to skip
00327                         seekSize+= mipMapSz;
00328 
00329                         // Size of final bitmap is reduced.
00330                         _Width>>=1;
00331                         _Height>>=1;
00332                         _MipMapCount--;
00333                         mipMapSkip--;
00334                 }
00335                 // skip data in file
00336                 if(seekSize>0)
00337                 {
00338                         if(!f.seek(seekSize, IStream::current))
00339                         {
00340                                 throw ESeekFailed();
00341                         }
00342                 }
00343 
00344         }
00345 
00346         //------------- preload all the mipmaps (one serialBuffer() is faster)
00347         uint32 w = _Width;
00348         uint32 h = _Height;
00349         uint32  totalSize= 0;
00350 
00351         uint8   m;
00352         for(m= 0; m<_MipMapCount; m++)
00353         {
00354                 uint32 wtmp, htmp;
00355                 if(w<4)
00356                         wtmp = 4;
00357                 else
00358                         wtmp = w;
00359                 if(h < 4)
00360                         htmp = 4;
00361                 else
00362                         htmp = h;
00363                 
00364                 uint32 mipMapSz;
00365                 if(PixelFormat==DXTC1 || PixelFormat==DXTC1Alpha)
00366                         mipMapSz = wtmp*htmp/2;
00367                 else
00368                         mipMapSz = wtmp*htmp;
00369 
00370 
00371                 _Data[m].resize(mipMapSz);
00372                 totalSize+= mipMapSz;
00373 
00374                 w = (w+1)/2;
00375                 h = (h+1)/2;
00376         }
00377 
00378         // Read all the data in one block.
00379         vector<uint8>   pixData;
00380         pixData.resize(totalSize);
00381         f.serialBuffer(&(*pixData.begin()), totalSize);
00382 
00383 
00384         //------------- reading mipmap levels from pixData
00385         
00386         uint32 pixIndex= 0;
00387 
00388         for(m= 0; m<_MipMapCount; m++)
00389         {
00390                 uint32  mipMapSz= _Data[m].size();
00391                 memcpy(_Data[m].getPtr(), &(pixData[pixIndex]), mipMapSz);
00392                 pixIndex+= mipMapSz;
00393         }
00394 
00395         //------------- End
00396 
00397         switch(PixelFormat)
00398         {
00399                 case DXTC1  : return 24;
00400                 case DXTC1Alpha : return 32;
00401                 case DXTC3  : return 32;
00402                 case DXTC5  : return 32;
00403                 default  : break;
00404         }
00405 
00406         return 0;
00407 }

uint8 NLMISC::CBitmap::readTGA NLMISC::IStream f  )  [private]
 

Read a TGA from an IStream. TGA pictures can be in 24 or 32 bits, RLE or uncompressed

Parameters:
f IStream (must be a reading stream)
Returns:
image depth if succeed, 0 else

Definition at line 1800 of file bitmap.cpp.

References _LoadGrayscaleAsAlpha, _MipMapCount, NLMISC::IStream::begin, depth, NLMISC::IStream::end, NLMISC::IStream::getPos(), height, imageSize, NLMISC::IStream::isReading(), nlinfo, PixelFormat, r, NLMISC::CObjectVector< uint8 >::resize(), RGBA, NLMISC::IStream::seek(), NLMISC::IStream::serial(), NLMISC::IStream::serialBuffer(), sint32, size, uint, uint16, uint32, uint8, width, x, and y.

Referenced by load().

01801 {
01802         if(!f.isReading()) return 0;
01803 
01804         uint32                  size;
01805         uint32                  x,y;
01806         sint32                  slsize;
01807         uint8                   *scanline;
01808         uint8                   r,g,b;
01809         sint32                  i,j,k;
01810 
01811         // TGA file header fields
01812         uint8   lengthID;
01813         uint8   cMapType;
01814         uint8   imageType;
01815         uint16  origin;
01816         uint16  length;
01817         uint8   depth;
01818         uint16  xOrg;
01819         uint16  yOrg;
01820         uint16  width;
01821         uint16  height;
01822         uint8   imageDepth;
01823         uint8   desc;
01824 
01825         // Image/Color map data
01826         uint8 *imageID;
01827         
01828         
01829         
01830         // Determining whether file is in Original or New TGA format
01831         
01832         bool newTgaFormat;
01833         uint32 extAreaOffset;
01834         uint32 devDirectoryOffset;
01835         char signature[16];
01836 
01837         f.seek (0, f.end);
01838         newTgaFormat = false;
01839         if (f.getPos() >= 26)
01840         {
01841                 f.seek (-26, f.end);
01842                 f.serial(extAreaOffset);
01843                 f.serial(devDirectoryOffset);
01844                 for(i=0; i<16; i++)
01845                 {
01846                         f.serial(signature[i]);
01847                 }
01848                 if(strncmp(signature,"TRUEVISION-XFILE",16)==0)
01849                         newTgaFormat = true;
01850         }
01851 
01852 
01853 
01854         // Reading TGA file header
01855         f.seek (0, f.begin);
01856                 
01857         f.serial(lengthID);
01858         f.serial(cMapType);
01859         f.serial(imageType);
01860         f.serial(origin);
01861         f.serial(length);
01862         f.serial(depth);
01863         f.serial(xOrg);
01864         f.serial(yOrg);
01865         f.serial(width);
01866         f.serial(height);
01867         f.serial(imageDepth);
01868         f.serial(desc);
01869 
01870         if(cMapType!=0)
01871         {
01872                 nlinfo("readTga : color-map not supported");
01873         }
01874 
01875         if(lengthID>0)
01876         {
01877                 imageID = new uint8[lengthID];
01878                 for(i=0; i<lengthID; i++)
01879                         f.serial(imageID[i]);
01880         }
01881 
01882 
01883 
01884         // Reading TGA image data
01885         
01886         _Width = width;
01887         _Height = height;
01888         size = _Width * _Height * (imageDepth/8);
01889         
01890         switch(imageType)
01891         {
01892                 // Uncompressed RGB or RGBA
01893                 case 2:
01894                 {
01895                         _Data[0].resize(_Width*_Height*4);
01896                         uint8 upSideDown = ((desc & (1 << 5))==0);
01897                         slsize = _Width * imageDepth / 8;
01898 
01899                         scanline = new uint8[slsize];
01900                         if(!scanline)
01901                         {
01902                                 throw EAllocationFailure();
01903                         }
01904 
01905                         for(y=0; y<_Height;y++)
01906                         {
01907                                 // Serial buffer: more efficient way to load.
01908                                 f.serialBuffer (scanline, slsize);
01909 
01910                                 if(imageDepth==24 || imageDepth==32)
01911                                 {
01912                                         sint32 mult = 3;
01913                                         if(imageDepth==16)
01914                                         {
01915                                                 mult = 2;
01916                                         }
01917                                         if(imageDepth==32)  
01918                                         {
01919                                                 mult = 4;
01920                                         }
01921                                         if(imageDepth!=16)
01922                                         {
01923                                                 for(x=0; x<_Width; x++)
01924                                                 {
01925                                                         // RGB(A)
01926                                                         r = scanline[x*mult+0];
01927                                                         g = scanline[x*mult+1];
01928                                                         b = scanline[x*mult+2];
01929                                                         // Switching to BGR(A)
01930                                                         scanline[x*mult+0] = b;
01931                                                         scanline[x*mult+1] = g;
01932                                                         scanline[x*mult+2] = r;
01933                                                 }
01934                                         }
01935                                 }
01936                                 
01937                                 k=0;
01938                                 for(i=0; i<width; i++) 
01939                                 {
01940                                         if(upSideDown)
01941                                         {
01942                                                 if(imageDepth==16)
01943                                                 {
01944                                                         uint16 toto = (uint16)scanline[k++];
01945                                                         toto |= scanline[k++]<<8;
01946                                                         uint _r = toto>>10;
01947                                                         uint _g = (toto>>5)&0x1f;
01948                                                         uint _b = toto&0x1f;
01949                                                         _Data[0][(height-y-1)*width*4 + 4*i] = (_r<<3) | (_r>>2);
01950                                                         _Data[0][(height-y-1)*width*4 + 4*i + 1] = (_g<<3) | (_g>>2);
01951                                                         _Data[0][(height-y-1)*width*4 + 4*i + 2] = (_b<<3) | (_b>>2);
01952                                                         _Data[0][(height-y-1)*width*4 + 4*i + 3] = 255;
01953                                                 }
01954                                                 else
01955                                                 {
01956                                                         _Data[0][(height-y-1)*width*4 + 4*i] = scanline[k++];
01957                                                         _Data[0][(height-y-1)*width*4 + 4*i + 1] = scanline[k++];
01958                                                         _Data[0][(height-y-1)*width*4 + 4*i + 2] = scanline[k++];
01959                                                         if(imageDepth==32)
01960                                                                 _Data[0][(height-y-1)*width*4 + 4*i + 3] = scanline[k++];
01961                                                         else
01962                                                                 _Data[0][(height-y-1)*width*4 + 4*i + 3] = 255;
01963                                                 }
01964                                         }
01965                                         else
01966                                         {
01967                                                 if(imageDepth==16)
01968                                                 {
01969                                                         uint16 toto = (uint16)scanline[k++];
01970                                                         toto |= scanline[k++]<<8;
01971                                                         int _r = toto>>10;
01972                                                         int _g = toto&(0x3e0)>>5;
01973                                                         int _b = toto&0x1f;
01974                                                         _Data[0][y*width*4 + 4*i] = (_r<<3) | (_r>>2);
01975                                                         _Data[0][y*width*4 + 4*i + 1] = (_g<<3) | (_g>>2);
01976                                                         _Data[0][y*width*4 + 4*i + 2] = (_b<<3) | (_b>>2);
01977                                                         _Data[0][y*width*4 + 4*i + 3] = 255;
01978                                                 }
01979                                                 else
01980                                                 {
01981                                                         _Data[0][y*width*4 + 4*i] = scanline[k++];
01982                                                         _Data[0][y*width*4 + 4*i + 1] = scanline[k++];
01983                                                         _Data[0][y*width*4 + 4*i + 2] = scanline[k++];
01984                                                         if(imageDepth==32)
01985                                                                 _Data[0][y*width*4 + 4*i + 3] = scanline[k++];
01986                                                         else
01987                                                                 _Data[0][y*width*4 + 4*i + 3] = 255;
01988                                                 }
01989                                         }       
01990                                 }
01991                         }
01992 
01993                         PixelFormat = RGBA;
01994                         delete scanline;
01995                 };
01996                 break;
01997                 
01998                 // Uncompressed Grayscale bitmap
01999                 case 3:
02000                 {
02001                         _Data[0].resize(_Width*_Height);
02002                         uint8 upSideDown = ((desc & (1 << 5))==0);
02003                         slsize = _Width;
02004 
02005                         scanline = new uint8[slsize];
02006                         if(!scanline)
02007                         {
02008                                 throw EAllocationFailure();
02009                         }
02010 
02011                         for(y=0; y<_Height;y++)
02012                         {
02013                                 // Serial buffer: more efficient way to load.
02014                                 f.serialBuffer (scanline, slsize);
02015 
02016                                 k=0;
02017                                 for(i=0; i<width; i++) 
02018                                 {
02019                                         if(upSideDown)
02020                                                 _Data[0][(height-y-1)*width + i] = scanline[k++];
02021                                         else
02022                                                 _Data[0][y*width + i] = scanline[k++];
02023                                 }
02024                         }
02025 
02026                         PixelFormat = _LoadGrayscaleAsAlpha?Alpha:Luminance;
02027                         delete scanline;
02028                 };
02029                 break;
02030 
02031                 // Compressed RGB or RGBA
02032                 case 10:
02033                 {
02034                         uint8 packet;
02035                         uint8 pixel[4];
02036                         uint32 imageSize = width*height;
02037                         uint32 readSize = 0;
02038                         _Data[0].resize(_Width*_Height*4);
02039                         uint    dstId= 0;
02040 
02041                         while(readSize < imageSize)
02042                         {
02043                                 f.serial(packet);
02044                                 if((packet & 0x80) > 0) // packet RLE 
02045                                 { 
02046                                         for(i=0; i<imageDepth/8; i++)
02047                                         {
02048                                                 f.serial(pixel[i]);
02049                                         }
02050                                         for (i=0; i < (packet & 0x7F) + 1; i++)
02051                                         {
02052                                                 for(j=0; j<imageDepth/8; j++)
02053                                                 {
02054                                                         _Data[0][dstId++]= pixel[j];
02055                                                 }
02056                                                 if(imageDepth==24)
02057                                                 {
02058                                                         _Data[0][dstId++]= 0;
02059                                                 }
02060                                         }
02061                                 }
02062                                 else    // packet Raw 
02063                                 { 
02064                                         for(i=0; i<((packet & 0x7F) + 1); i++)
02065                                         {
02066                                                 for(j=0; j<imageDepth/8; j++)
02067                                                 {
02068                                                         f.serial(pixel[j]);
02069                                                 }
02070                                                 if(imageDepth==32)
02071                                                 {
02072                                                         _Data[0][dstId++]= pixel[2];
02073                                                         _Data[0][dstId++]= pixel[1];
02074                                                         _Data[0][dstId++]= pixel[0];
02075                                                         _Data[0][dstId++]= pixel[3];
02076                                                 }
02077                                                 if(imageDepth==24)
02078                                                 {
02079                                                         _Data[0][dstId++]= pixel[2];
02080                                                         _Data[0][dstId++]= pixel[1];
02081                                                         _Data[0][dstId++]= pixel[0];
02082                                                         _Data[0][dstId++]= 0;
02083                                                 }
02084                                         }
02085                                 }
02086                                 readSize += (packet & 0x7F) + 1;
02087                         }
02088                         PixelFormat = RGBA;
02089                 };
02090                 break;
02091 
02092                 // Compressed Grayscale bitmap (not tested)
02093                 case 11:
02094                 {
02095                         uint8 packet;
02096                         uint8 pixel[4];
02097                         uint32 imageSize = width*height;
02098                         uint32 readSize = 0;
02099                         _Data[0].resize(_Width*_Height);
02100                         uint    dstId= 0;
02101 
02102                         while(readSize < imageSize)
02103                         {
02104                                 f.serial(packet);
02105                                 if((packet & 0x80) > 0) // packet RLE 
02106                                 { 
02107                                         f.serial(pixel[0]);
02108                                         for (i=0; i < (packet & 0x7F) + 1; i++)
02109                                         {
02110                                                 _Data[0][dstId++]= pixel[0];
02111                                         }
02112                                 }
02113                                 else    // packet Raw 
02114                                 { 
02115                                         for(i=0; i<((packet & 0x7F) + 1); i++)
02116                                         {
02117                                                 f.serial(pixel[0]);
02118                                                 _Data[0][dstId++]= pixel[0];
02119                                         }
02120                                 }
02121                                 readSize += (packet & 0x7F) + 1;
02122                         }
02123                         PixelFormat = _LoadGrayscaleAsAlpha?Alpha:Luminance;
02124                 };
02125                 break;
02126 
02127                 default:
02128                         return 0;
02129         }
02130 
02131         _MipMapCount = 1;
02132         return(imageDepth);
02133 
02134 }

void NLMISC::CBitmap::releaseMipMaps  ) 
 

Release the mipmaps of the bitmap if they exist. Work for any mode.

See also:
buildMipMaps().

Definition at line 1493 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), NLMISC::MAX_MIPMAP, and sint.

Referenced by NL3D::CAsyncTextureManager::CTextureEntry::createCoarseBitmap(), NL3D::CTextureEmboss::doGenerate(), NL3D::CTextureBump::doGenerate(), flipH(), flipV(), resample(), resize(), rot90CCW(), rot90CW(), and NL3D::CDriverGL::setupTextureEx().

01494 {
01495         if(_MipMapCount<=1) return;
01496 
01497         _MipMapCount=1;
01498         for(sint i=1;i<MAX_MIPMAP;i++)
01499         {
01500                 NLMISC::contReset(_Data[i]); 
01501         }
01502 }

void NLMISC::CBitmap::resample sint32  nNewWidth,
sint32  nNewHeight
 

Resample the bitmap. If mipmaps exist they are deleted, then rebuilt after resampling.

Parameters:
nNewWidth width after resample
nNewHeight height after resample

Definition at line 1508 of file bitmap.cpp.

References _MipMapCount, buildMipMaps(), NLMISC::contReset(), nlassert, PixelFormat, releaseMipMaps(), resamplePicture32(), NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, and sint32.

Referenced by NL3D::CCoarseMeshBuild::buildBitmap(), and NL3D::CDriverGL::setupTextureEx().

01509 {
01510         nlassert(PixelFormat == RGBA);
01511         bool needRebuild = false;
01512 
01513         // Deleting mipmaps
01514         if(_MipMapCount>1)
01515                 needRebuild = true;
01516         releaseMipMaps();
01517 
01518         if(nNewWidth==0 || nNewHeight==0)
01519         {
01520                 _Width = _Height = 0;
01521                 return;
01522         }
01523         
01524         CObjectVector<uint8> pDestui;
01525         pDestui.resize(nNewWidth*nNewHeight*4);
01526         NLMISC::CRGBA *pDestRgba = (NLMISC::CRGBA*)&pDestui[0];
01527 
01528         resamplePicture32 ((NLMISC::CRGBA*)&_Data[0][0], pDestRgba, _Width, _Height, nNewWidth, nNewHeight);
01529         NLMISC::contReset(_Data[0]); // free memory
01530         _Data[0] =  pDestui;
01531         _Width= nNewWidth;
01532         _Height= nNewHeight;
01533 
01534         // Rebuilding mipmaps
01535         if(needRebuild)
01536         {
01537                 buildMipMaps();
01538         }
01539 }

void NLMISC::CBitmap::resamplePicture32 const NLMISC::CRGBA pSrc,
NLMISC::CRGBA pDest,
sint32  nSrcWidth,
sint32  nSrcHeight,
sint32  nDestWidth,
sint32  nDestHeight
[private]
 

The resample function

Parameters:
pSrc CRGBA array
pDest CRGBA array for storing resampled texture
nSrcWidth original width
nSrcHeight original height
nDestWidth width after resample
nDestHeight height after resample

Definition at line 1618 of file bitmap.cpp.

References nlassert, and sint32.

Referenced by resample().

01621 {
01622         if ((nSrcWidth<=0)||(nSrcHeight<=0)||(nDestHeight<=0)||(nDestHeight<=0))
01623                 return;
01624         bool bXMag=(nDestWidth>=nSrcWidth);
01625         bool bYMag=(nDestHeight>=nSrcHeight);
01626         bool bXEq=(nDestWidth==nSrcWidth);
01627         bool bYEq=(nDestHeight==nSrcHeight);
01628         std::vector<NLMISC::CRGBAF> pIterm (nDestWidth*nSrcHeight);
01629         
01630         if (bXMag)
01631         {
01632                 float fXdelta=(float)(nSrcWidth)/(float)(nDestWidth);
01633                 NLMISC::CRGBAF *pItermPtr=&*pIterm.begin();
01634                 sint32 nY;
01635                 for (nY=0; nY<nSrcHeight; nY++)
01636                 {
01637                         const NLMISC::CRGBA *pSrcLine=pSrc;
01638                         float fX=0.f;
01639                         sint32 nX;
01640                         for (nX=0; nX<nDestWidth; nX++)
01641                         {
01642                                 float fVirgule=fX-(float)floor(fX);
01643                                 nlassert (fVirgule>=0.f);
01644                                 NLMISC::CRGBAF vColor;
01645                                 if (fVirgule>=0.5f)
01646                                 {
01647                                         if (fX<(float)(nSrcWidth-1))
01648                                         {
01649                                                 NLMISC::CRGBAF vColor1 (pSrcLine[(sint32)floor(fX)]);
01650                                                 NLMISC::CRGBAF vColor2 (pSrcLine[(sint32)floor(fX)+1]);
01651                                                 vColor=vColor1*(1.5f-fVirgule)+vColor2*(fVirgule-0.5f);
01652                                         }
01653                                         else
01654                                                 vColor=NLMISC::CRGBAF (pSrcLine[(sint32)floor(fX)]);
01655                                 }
01656                                 else
01657                                 {
01658                                         if (fX>=1.f)
01659                                         {
01660                                                 NLMISC::CRGBAF vColor1 (pSrcLine[(sint32)floor(fX)]);
01661                                                 NLMISC::CRGBAF vColor2 (pSrcLine[(sint32)floor(fX)-1]);
01662                                                 vColor=vColor1*(0.5f+fVirgule)+vColor2*(0.5f-fVirgule);
01663                                         }
01664                                         else
01665                                                 vColor=NLMISC::CRGBAF (pSrcLine[(sint32)floor(fX)]);
01666                                 }
01667                                 *(pItermPtr++)=vColor;
01668                                 fX+=fXdelta;
01669                         }
01670                         pSrc+=nSrcWidth;
01671                 }
01672         }
01673         else if (bXEq)
01674         {
01675                 NLMISC::CRGBAF *pItermPtr=&*pIterm.begin();
01676                 for (sint32 nY=0; nY<nSrcHeight; nY++)
01677                 {
01678                         const NLMISC::CRGBA *pSrcLine=pSrc;
01679                         sint32 nX;
01680                         for (nX=0; nX<nDestWidth; nX++)
01681                                 *(pItermPtr++)=NLMISC::CRGBAF (pSrcLine[nX]);
01682                         pSrc+=nSrcWidth;
01683                 }
01684         }
01685         else
01686         {
01687                 double fXdelta=(double)(nSrcWidth)/(double)(nDestWidth);
01688                 nlassert (fXdelta>1.f);
01689                 NLMISC::CRGBAF *pItermPtr=&*pIterm.begin();
01690                 sint32 nY;
01691                 for (nY=0; nY<nSrcHeight; nY++)
01692                 {
01693                         const NLMISC::CRGBA *pSrcLine=pSrc;
01694                         double fX=0.f;
01695                         sint32 nX;
01696                         for (nX=0; nX<nDestWidth; nX++)
01697                         {
01698                                 NLMISC::CRGBAF vColor (0.f, 0.f, 0.f, 0.f);
01699                                 double fFinal=fX+fXdelta;
01700                                 while (fX<fFinal)
01701                                 {
01702                                         double fNext=(double)floor (fX)+1.f;
01703                                         if (fNext>fFinal)
01704                                                 fNext=fFinal;
01705                                         vColor+=((float)(fNext-fX))*NLMISC::CRGBAF (pSrcLine[(sint32)floor(fX)]);
01706                                         fX=fNext;
01707                                 }
01708                                 nlassert (fX==fFinal);
01709                                 vColor/=(float)fXdelta;
01710                                 *(pItermPtr++)=vColor;
01711                         }
01712                         pSrc+=nSrcWidth;
01713                 }
01714         }
01715                                 
01716         if (bYMag)
01717         {
01718                 double fYdelta=(double)(nSrcHeight)/(double)(nDestHeight);
01719                 sint32 nX;
01720                 for (nX=0; nX<nDestWidth; nX++)
01721                 {
01722                         double fY=0.f;
01723                         sint32 nY;
01724                         for (nY=0; nY<nDestHeight; nY++)
01725                         {
01726                                 double fVirgule=fY-(double)floor(fY);
01727                                 nlassert (fVirgule>=0.f);
01728                                 NLMISC::CRGBAF vColor;
01729                                 if (fVirgule>=0.5f)
01730                                 {
01731                                         if (fY<(double)(nSrcHeight-1))
01732                                         {
01733                                                 NLMISC::CRGBAF vColor1=pIterm[((sint32)floor(fY))*nDestWidth+nX];
01734                                                 NLMISC::CRGBAF vColor2=pIterm[(((sint32)floor(fY))+1)*nDestWidth+nX];
01735                                                 vColor=vColor1*(1.5f-(float)fVirgule)+vColor2*((float)fVirgule-0.5f);
01736                                         }
01737                                         else
01738                                                 vColor=pIterm[((sint32)floor(fY))*nDestWidth+nX];
01739                                 }
01740                                 else
01741                                 {
01742                                         if (fY>=1.f)
01743                                         {
01744                                                 NLMISC::CRGBAF vColor1=pIterm[((sint32)floor(fY))*nDestWidth+nX];
01745                                                 NLMISC::CRGBAF vColor2=pIterm[(((sint32)floor(fY))-1)*nDestWidth+nX];
01746                                                 vColor=vColor1*(0.5f+(float)fVirgule)+vColor2*(0.5f-(float)fVirgule);
01747                                         }
01748                                         else
01749                                                 vColor=pIterm[((sint32)floor(fY))*nDestWidth+nX];
01750                                 }
01751                                 pDest[nX+nY*nDestWidth]=vColor;
01752                                 fY+=fYdelta;
01753                         }
01754                 }
01755         }
01756         else if (bYEq)
01757         {
01758                 for (sint32 nX=0; nX<nDestWidth; nX++)
01759                 {
01760                         sint32 nY;
01761                         for (nY=0; nY<nDestHeight; nY++)
01762                         {
01763                                 pDest[nX+nY*nDestWidth]=pIterm[nY*nDestWidth+nX];
01764                         }
01765                 }
01766         }
01767         else
01768         {
01769                 double fYdelta=(double)(nSrcHeight)/(double)(nDestHeight);
01770                 nlassert (fYdelta>1.f);
01771                 sint32 nX;
01772                 for (nX=0; nX<nDestWidth; nX++)
01773                 {
01774                         double fY=0.f;
01775                         sint32 nY;
01776                         for (nY=0; nY<nDestHeight; nY++)
01777                         {
01778                                 NLMISC::CRGBAF vColor (0.f, 0.f, 0.f, 0.f);
01779                                 double fFinal=fY+fYdelta;
01780                                 while ((fY<fFinal)&&((sint32)fY!=nSrcHeight))
01781                                 {
01782                                         double fNext=(double)floor (fY)+1.f;
01783                                         if (fNext>fFinal)
01784                                                 fNext=fFinal;
01785                                         vColor+=((float)(fNext-fY))*pIterm[((sint32)floor(fY))*nDestWidth+nX];
01786                                         fY=fNext;
01787                                 }
01788                                 vColor/=(float)fYdelta;
01789                                 pDest[nX+nY*nDestWidth]=vColor;
01790                         }
01791                 }
01792         }
01793 }

void NLMISC::CBitmap::reset TType  type = RGBA  ) 
 

Reset the buffer. Mipmaps are deleted and bitmap is not valid anymore.

Parameters:
type is the new type used for this texture

Definition at line 1599 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< uint8 >::resize(), type, and uint.

Referenced by NL3D::CHLSColorTexture::buildColorVersion(), NL3D::CDriverGL::getBufferPart(), and NL3D::ITexture::release().

01600 {
01601         for(uint i=0; i<_MipMapCount; i++)
01602         {
01603                 NLMISC::contReset(_Data[i]);
01604                 _Data[i].resize(0);
01605         }
01606         _Width = _Height = 0;
01607         _MipMapCount= 1;
01608         
01609         // Change pixel format
01610         PixelFormat=type;
01611 }

void NLMISC::CBitmap::resize sint32  nNewWidth,
sint32  nNewHeight,
TType  newType = DonTKnow,
bool  resetTo0 = true
 

Resize the bitmap. If mipmaps exist they are deleted and not rebuilt. This is not a crop. Pixels are lost after resize.

Parameters:
nNewWidth width after resize
nNewHeight height after resize
newType is the new type of the bitmap. If don_t_know, keep the same pixel format that before.
resetTo0 by default the vector are filled by 0. set false to gain performances.

Definition at line 1545 of file bitmap.cpp.

References DonTKnow, PixelFormat, releaseMipMaps(), resizeMipMap(), and sint32.

Referenced by blend(), NL3D::CHLSColorTexture::buildColorVersion(), NL3D::CTextureFont::CTextureFont(), NL3D::CTextureMem::doGenerate(), NL3D::CTextureGrouped::doGenerate(), NL3D::CTextureCross::doGenerate(), NL3D::CTextureFont::dumpTextureFont(), NL3D::CCoarseMeshBuild::expand(), and NL3D::CDriverGL::getBufferPart().

01546 {
01547         // Deleting mipmaps
01548         releaseMipMaps();
01549 
01550         // Change type of bitmap ?
01551         if (newType!=DonTKnow)
01552                 PixelFormat=newType;
01553 
01554         _Width = nNewWidth;
01555         _Height = nNewHeight;
01556 
01557         // resize the level 0 only.
01558         resizeMipMap(0, nNewWidth, nNewHeight, resetTo0);
01559 }

void NLMISC::CBitmap::resizeMipMap uint32  numMipMap,
sint32  nNewWidth,
sint32  nNewHeight,
bool  resetTo0 = true
 

ADVANCED USE Resize a single mipmap level. resize() should have been called before. This is not a crop. Pixels are lost after resize. No validity check is made. It is the user responsabitility fo setup correct mipmap size.

Parameters:
numMipMap id of the mipmap
nNewWidth width after resize
nNewHeight height after resize
resetTo0 by default the vector are filled by 0. set false to gain performances.

Definition at line 1565 of file bitmap.cpp.

References bitPerPixels, NLMISC::contReset(), NLMISC::CObjectVector< uint8 >::fill(), NLMISC::MAX_MIPMAP, nlassert, PixelFormat, NLMISC::CObjectVector< uint8 >::resize(), sint32, and uint32.

Referenced by NL3D::CHLSColorTexture::buildColorVersion(), and resize().

01566 {
01567         nlassert(numMipMap<MAX_MIPMAP);
01568 
01569         // free memory
01570         NLMISC::contReset(_Data[numMipMap]);
01571 
01572         // DXTC compressed??
01573         //bool  isDXTC= PixelFormat==DXTC1 || PixelFormat==DXTC1Alpha || PixelFormat==DXTC3 || PixelFormat==DXTC5;
01574         // if yes, must round up width and height to 4, for allocation
01575         nNewWidth= 4*((nNewWidth+3)/4);
01576         nNewHeight= 4*((nNewHeight+3)/4);
01577 
01578         // resize the buffer
01579         _Data[numMipMap].resize (((uint32)(nNewWidth*nNewHeight)*bitPerPixels[PixelFormat])/8);
01580 
01581         // Fill 0?
01582         if( resetTo0 )
01583                 _Data[numMipMap].fill(0);
01584 }

bool NLMISC::CBitmap::rgbaToAlpha  )  [private]
 

Definition at line 708 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlpha().

00709 {
00710         uint32 i;
00711 
00712         if(_Width*_Height == 0)  return false;
00713                 
00714         for(uint8 m= 0; m<_MipMapCount; m++)
00715         {
00716                 CObjectVector<uint8> dataTmp;
00717                 dataTmp.resize(_Data[m].size()/4);
00718                 uint    dstId= 0;
00719 
00720                 for(i=0; i<_Data[m].size(); i+=4)
00721                 {
00722                         dataTmp[dstId++]= _Data[m][i+3];
00723                 }
00724                 NLMISC::contReset(_Data[m]); 
00725                 _Data[m].resize(0);
00726                 _Data[m] = dataTmp;
00727         }
00728         PixelFormat = Alpha;
00729         return true;
00730 }

bool NLMISC::CBitmap::rgbaToAlphaLuminance  )  [private]
 

Definition at line 550 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToAlphaLuminance().

00551 {
00552         uint32 i;
00553 
00554         if(_Width*_Height == 0)  return false;
00555         
00556         for(uint8 m= 0; m<_MipMapCount; m++)
00557         {
00558                 CObjectVector<uint8> dataTmp;
00559                 dataTmp.resize(_Data[m].size()/2);
00560                 uint    dstId= 0;
00561 
00562                 for(i=0; i<_Data[m].size(); i+=4)
00563                 {
00564                         dataTmp[dstId++]= (_Data[m][i]*77 + _Data[m][i+1]*150 + _Data[m][i+2]*28)/255;
00565                         dataTmp[dstId++]= _Data[m][i+3];
00566                 }
00567                 NLMISC::contReset(_Data[m]); 
00568                 _Data[m].resize(0);
00569                 _Data[m] = dataTmp;
00570         }
00571         PixelFormat = AlphaLuminance;
00572         return true;
00573 }

bool NLMISC::CBitmap::rgbaToLuminance  )  [private]
 

Definition at line 635 of file bitmap.cpp.

References _MipMapCount, NLMISC::contReset(), PixelFormat, NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), NLMISC::CObjectVector< uint8 >::size(), size, uint, uint32, and uint8.

Referenced by convertToLuminance().

00636 {
00637         uint32 i;
00638 
00639         if(_Width*_Height == 0)  return false;
00640                 
00641         for(uint8 m= 0; m<_MipMapCount; m++)
00642         {
00643                 CObjectVector<uint8> dataTmp;
00644                 dataTmp.resize(_Data[m].size()/4);
00645                 uint    dstId= 0;
00646 
00647                 for(i=0; i<_Data[m].size(); i+=4)
00648                 {
00649                         dataTmp[dstId++]= (_Data[m][i]*77 + _Data[m][i+1]*150 + _Data[m][i+2]*28)/255;
00650                 }
00651                 NLMISC::contReset(_Data[m]); 
00652                 _Data[m].resize(0);
00653                 _Data[m] = dataTmp;
00654         }
00655         PixelFormat = Luminance;
00656         return true;
00657 }

void NLMISC::CBitmap::rot90CCW  ) 
 

Rotation of the bitmap of 90 degree in counter clockwise

Definition at line 2781 of file bitmap.cpp.

References _MipMapCount, buildMipMaps(), NLMISC::contReset(), getHeight(), getWidth(), PixelFormat, releaseMipMaps(), NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, sint32, and uint32.

02782 {
02783         if (PixelFormat != RGBA)
02784                 return;
02785         sint32 nWidth = getWidth(0);
02786         sint32 nHeight = getHeight(0);
02787         sint32 i, j;
02788         NLMISC::CRGBA *pSrcRgba = (NLMISC::CRGBA*)&_Data[0][0];
02789         bool needRebuild = false;
02790 
02791         if(_MipMapCount>1)
02792                 needRebuild = true;
02793         releaseMipMaps();
02794 
02795         CObjectVector<uint8> pDestui;
02796         pDestui.resize(nWidth*nHeight*4);
02797         NLMISC::CRGBA *pDestRgba = (NLMISC::CRGBA*)&pDestui[0];
02798 
02799         for( j = 0; j < nHeight; ++j )
02800         for( i = 0; i < nWidth;  ++i )
02801                 pDestRgba[j+i*nHeight] = pSrcRgba[nWidth-1-i+j*nWidth];
02802 
02803         uint32 nTemp = _Width;
02804         _Width = _Height;
02805         _Height = nTemp;
02806 
02807         NLMISC::contReset(_Data[0]); // free memory
02808         _Data[0] =  pDestui;
02809         // Rebuilding mipmaps
02810         if(needRebuild)
02811         {
02812                 buildMipMaps();
02813         }
02814 }

void NLMISC::CBitmap::rot90CW  ) 
 

Rotation of the bitmap of 90 degree in clockwise

Definition at line 2746 of file bitmap.cpp.

References _MipMapCount, buildMipMaps(), NLMISC::contReset(), getHeight(), getWidth(), PixelFormat, releaseMipMaps(), NLMISC::CObjectVector< T, EnableObjectBehavior >::resize(), RGBA, sint32, and uint32.

02747 {
02748         if (PixelFormat != RGBA)
02749                 return;
02750         sint32 nWidth = getWidth(0);
02751         sint32 nHeight = getHeight(0);
02752         sint32 i, j;
02753         NLMISC::CRGBA *pSrcRgba = (NLMISC::CRGBA*)&_Data[0][0];
02754         bool needRebuild = false;
02755 
02756         if(_MipMapCount>1)
02757                 needRebuild = true;
02758         releaseMipMaps();
02759 
02760         CObjectVector<uint8> pDestui;
02761         pDestui.resize(nWidth*nHeight*4);
02762         NLMISC::CRGBA *pDestRgba = (NLMISC::CRGBA*)&pDestui[0];
02763 
02764         for( j = 0; j < nHeight; ++j )
02765         for( i = 0; i < nWidth;  ++i )
02766                 pDestRgba[j+i*nHeight] = pSrcRgba[i+(nHeight-1-j)*nWidth];
02767 
02768         uint32 nTemp = _Width;
02769         _Width = _Height;
02770         _Height = nTemp;
02771 
02772         NLMISC::contReset(_Data[0]); // free memory
02773         _Data[0] =  pDestui;
02774         // Rebuilding mipmaps
02775         if(needRebuild)
02776         {
02777                 buildMipMaps();
02778         }
02779 }

void NLMISC::CBitmap::rotateCCW  ) 
 

Rotate a bitmap in CCW mode.

See also:
releaseMipMaps().

Definition at line 2306 of file bitmap.cpp.

References PixelFormat, RGBA, NLMISC::rotateCCW(), uint16, and uint32.

02307 {
02308         // Copy the array
02309         CObjectVector<uint8> copy=_Data[0];
02310 
02311         switch (PixelFormat)
02312         {
02313         case RGBA:
02314                 NLMISC::rotateCCW ((uint32*)&(_Data[0][0]), (uint32*)&(copy[0]), _Width, _Height);
02315                 break;
02316         case Luminance:
02317         case Alpha:
02318                 NLMISC::rotateCCW (&_Data[0][0], &copy[0], _Width, _Height);
02319                 break;
02320         case AlphaLuminance:
02321                 NLMISC::rotateCCW ((uint16*)&(_Data[0][0]), (uint16*)&(copy[0]), _Width, _Height);;
02322                 break;
02323         default: break;
02324         }
02325 
02326         uint32 tmp=_Width;
02327         _Width=_Height;
02328         _Height=tmp;
02329         _Data[0]=copy;
02330 }

void NLMISC::CBitmap::setMipMapCount uint32  mmc  ) 
 

ADVANCED USE To use in conjunction with resizeMipMap. Setup the correct total number of mipmap No validity check is made. It is the user responsabitility fo setup correct mipmap count.

Definition at line 1590 of file bitmap.cpp.

References _MipMapCount, uint32, and uint8.

Referenced by NL3D::CHLSColorTexture::buildColorVersion().

01591 {
01592         _MipMapCount= uint8(mmc);
01593 }

void NLMISC::CBitmap::uncompress uint16  color,
NLMISC::CRGBA
[inline, static, private]
 

Extracting RGBA infos from a 16bits word. (used by S3TC decompression)

Parameters:
color a 16bits integer
r a CRGBA

Definition at line 1350 of file bitmap.cpp.

References r, and uint16.

Referenced by decompressDXT1(), decompressDXT3(), decompressDXT5(), and getDXTCColorFromBlock().

01351 {
01352         r.A= 0;
01353         r.R= ((color>>11)&31) << 3; r.R+= r.R>>5;
01354         r.G= ((color>>5)&63) << 2;  r.G+= r.G>>6;
01355         r.B= ((color)&31) << 3;     r.B+= r.B>>5;
01356 }

bool NLMISC::CBitmap::writeJPG NLMISC::IStream f,
uint8  quality = 80
[inline]
 

Write a JPG from the object pixels buffer. If the current pixel format is not rgba then the method does nothing If the pixel format is Alpha then we save in 8 bpp

Parameters:
f IStream (must be a reading stream)
quality 0=very bad quality 100=best quality
Returns:
true if succeed, false else

Definition at line 620 of file bitmap.h.

References nlwarning, and uint8.

00621 {
00622         nlwarning ("You must put #define USE_JPEG before all include in the file where you call writeJPG() if you want jpeg support");
00623         return false;
00624 }

bool NLMISC::CBitmap::writeTGA NLMISC::IStream f,
uint32  d,
bool  upsideDown = false
 

Write a TGA (24 or 32 bits) from the object pixels buffer. If the current pixel format is not rgba then the method does nothing If the pixel format is Alpha then we save in 8 bpp

Parameters:
f IStream (must be a reading stream)
d depth : 8 or 16 or 24 or 32
upsideDown if true, the bitmap will be saved with the upside down
Returns:
true if succeed, false else

Definition at line 2139 of file bitmap.cpp.

References depth, height, NLMISC::IStream::isReading(), PixelFormat, r, RGBA, NLMISC::IStream::serial(), sint32, uint16, uint32, uint8, width, x, and y.

Referenced by NL3D::CTextureFont::dumpTextureFont(), NL3D::CZoneLighter::lightWater(), and NL3D::CNELU::screenshot().

02140 {
02141         if(f.isReading()) return false;
02142         if(d!=24 && d!=32 && d!=16 && d!=8) return false;
02143         if ((PixelFormat != RGBA)&&(PixelFormat != Alpha)&&(PixelFormat != Luminance)) return false;
02144         if ((PixelFormat == Alpha) && (d != 8)) return false;
02145         if ((PixelFormat == Luminance) && (d != 8)) return false;
02146 
02147         sint32  i,j,x,y;
02148         uint8   * scanline;
02149         uint8   r,g,b,a;
02150 
02151         uint8   lengthID = 0;
02152         uint8   cMapType = 0;
02153         uint8   imageType = 2;
02154         uint16  origin = 0;
02155         uint16  length = 0;
02156         uint8   depth = 0;
02157         uint16  xOrg = 0;
02158         uint16  yOrg = 0;
02159         uint16  width = (uint16)_Width;
02160         uint16  height = (uint16)_Height;
02161         uint8   imageDepth = (uint8)d;
02162         uint8   desc = 0;
02163         if (upsideDown)
02164                 desc |= 1<<5;
02165 
02166         if ((PixelFormat == Alpha) || (PixelFormat == Luminance))
02167                 imageType = 3; // Uncompressed grayscale
02168 
02169         f.serial(lengthID);
02170         f.serial(cMapType);
02171         f.serial(imageType);
02172         f.serial(origin);
02173         f.serial(length);
02174         f.serial(depth);
02175         f.serial(xOrg);
02176         f.serial(yOrg);
02177         f.serial(width);
02178         f.serial(height);
02179         f.serial(imageDepth);
02180         f.serial(desc);
02181 
02182         if ((PixelFormat == Alpha)||(PixelFormat == Luminance))
02183                 scanline = new uint8[width];
02184         else
02185                 scanline = new uint8[width*4];
02186         if(!scanline)
02187         {
02188                 throw EAllocationFailure();
02189         }
02190 
02191         for(y=0; y<(sint32)height; y++)
02192         {
02193                 
02194                 uint32 k=0;
02195                 if (PixelFormat == Alpha)
02196                 {
02197                         for(i=0; i<width; ++i) // Alpha
02198                         {
02199                                 scanline[k++] = _Data[0][(height-y-1)*width + i];
02200                         }
02201                 }
02202                 else if (PixelFormat == Luminance)
02203                 {
02204                         for(i=0; i<width; ++i) // Luminance
02205                         {
02206                                 scanline[k++] = _Data[0][(height-y-1)*width + i];
02207                         }
02208                 }
02209                 else
02210                 {
02211                         for(i=0; i<width*4; i+=4) // 4:RGBA
02212                         {
02213                                 if(d==16)
02214                                 {
02215                                         for(j=0; j<(sint32)4; j++)
02216                                         {
02217                                                 scanline[k++] = _Data[0][(height-y-1)*width*4 + i + j];
02218                                         }
02219                                 }
02220                                 else
02221                                 {
02222                                         for(j=0; j<(sint32)d/8; j++)
02223                                         {
02224                                                 scanline[k++] = _Data[0][(height-y-1)*width*4 + i + j];
02225                                         }
02226                                 }
02227                         }
02228                 }
02229                 
02230                 if(d==16)
02231                 {
02232                         for(x=0; x<(sint32)width; x++)
02233                         {
02234                                 r = scanline[x*4+0];
02235                                 g = scanline[x*4+1];
02236                                 b = scanline[x*4+2];
02237                                 int rr = r >>3;
02238                                 int gg = g >>3;
02239                                 int bb = b >>3;
02240                                 uint16 c16 = (rr<<10) | (gg<<5) | bb;
02241                                 scanline[x*2+0] = c16&0xff;
02242                                 scanline[x*2+1] = c16>>8;
02243                         }
02244                 }
02245                 if(d==24)
02246                 {
02247                         for(x=0; x<(sint32)width; x++)
02248                         {
02249                                 r = scanline[x*3+0];
02250                                 g = scanline[x*3+1];
02251                                 b = scanline[x*3+2];
02252                                 scanline[x*3+0] = b;
02253                                 scanline[x*3+1] = g;
02254                                 scanline[x*3+2] = r;
02255                         }
02256                 }
02257                 if(d==32)
02258                 {
02259                         for(x=0; x<(sint32)width; x++)
02260                         {
02261                                 r = scanline[x*4+0];
02262                                 g = scanline[x*4+1];
02263                                 b = scanline[x*4+2];
02264                                 a= scanline[x*4+3];
02265                                 scanline[x*4+0] = b;
02266                                 scanline[x*4+1] = g;
02267                                 scanline[x*4+2] = r;                            
02268                                 scanline[x*4+3] = a;
02269                         }
02270                 }
02271                 
02272                 int finaleSize=width*d/8;
02273                 for(i=0; i<finaleSize; i++)
02274                 {
02275                         f.serial(scanline[i]);
02276                 }               
02277         }
02278         delete scanline;
02279         return true;
02280 }


Field Documentation

CObjectVector<uint8> NLMISC::CBitmap::_Data[MAX_MIPMAP] [protected]
 

Reimplemented in NL3D::CTextureMem.

Definition at line 90 of file bitmap.h.

Referenced by blend().

uint32 NLMISC::CBitmap::_Height [protected]
 

Definition at line 96 of file bitmap.h.

Referenced by blend().

bool NLMISC::CBitmap::_LoadGrayscaleAsAlpha [protected]
 

Definition at line 94 of file bitmap.h.

Referenced by CBitmap(), isGrayscaleAsAlpha(), loadGrayscaleAsAlpha(), and readTGA().

uint8 NLMISC::CBitmap::_MipMapCount [protected]
 

Definition at line 93 of file bitmap.h.

Referenced by alphaLuminanceToAlpha(), alphaLuminanceToLuminance(), alphaLuminanceToRGBA(), alphaToAlphaLuminance(), alphaToRGBA(), buildMipMaps(), CBitmap(), decompressDXT1(), decompressDXT3(), decompressDXT5(), flipH(), flipV(), getMipMapCount(), luminanceToAlpha(), luminanceToAlphaLuminance(), luminanceToRGBA(), makeDummy(), readDDS(), readTGA(), releaseMipMaps(), resample(), reset(), rgbaToAlpha(), rgbaToAlphaLuminance(), rgbaToLuminance(), rot90CCW(), rot90CW(), and setMipMapCount().

uint32 NLMISC::CBitmap::_Width [protected]
 

Definition at line 95 of file bitmap.h.

Referenced by blend().

const uint32 NLMISC::CBitmap::bitPerPixels [static]
 

Initial value:

{
        32,             
        8,              
        8,              
        16,             
        4,              
        4,              
        8,              
        8,              
        16              
}

Definition at line 70 of file bitmap.cpp.

Referenced by blit(), and resizeMipMap().

const uint32 NLMISC::CBitmap::DXTC1HEADER = NL_MAKEFOURCC('D','X', 'T', '1') [static]
 

Definition at line 83 of file bitmap.cpp.

Referenced by readDDS().

const uint32 NLMISC::CBitmap::DXTC3HEADER = NL_MAKEFOURCC('D','X', 'T', '3') [static]
 

Definition at line 84 of file bitmap.cpp.

Referenced by readDDS().

const uint32 NLMISC::CBitmap::DXTC5HEADER = NL_MAKEFOURCC('D','X', 'T', '5') [static]
 

Definition at line 85 of file bitmap.cpp.

Referenced by readDDS().

enum NLMISC::CBitmap::TType NLMISC::CBitmap::PixelFormat
 

Referenced by alphaLuminanceToAlpha(), alphaLuminanceToLuminance(), alphaLuminanceToRGBA(), alphaToAlphaLuminance(), alphaToLuminance(), alphaToRGBA(), blend(), blit(), NL3D::CTextureFile::buildBitmapFromFile(), buildMipMaps(), CBitmap(), convertToAlpha(), convertToAlphaLuminance(), convertToLuminance(), convertToRGBA(), convertToType(), decompressDXT1(), decompressDXT3(), decompressDXT5(), flipH(), flipV(), getColor(), getPixelColor(), getPixelFormat(), luminanceToAlpha(), luminanceToAlphaLuminance(), luminanceToRGBA(), makeDummy(), readDDS(), readTGA(), resample(), reset(), resize(), resizeMipMap(), rgbaToAlpha(), rgbaToAlphaLuminance(), rgbaToLuminance(), rot90CCW(), rot90CW(), rotateCCW(), NL3D::sameDXTCFormat(), and writeTGA().


The documentation for this class was generated from the following files:
Generated on Tue Mar 16 13:03:22 2004 for NeL by doxygen 1.3.6