"L. Spiro Engine"

F:/My Projects/LSEngine/Modules/LSImageLib/Src/LSIImageLib.h

00001 
00016 #ifndef __LSI_IMAGELIB_H__
00017 #define __LSI_IMAGELIB_H__
00018 
00019 // Include the memory library.
00020 #include "LSAMemLib.h"
00021 using namespace ::lsa;
00022 
00023 // Include the compression library.
00024 #include "LSCCompressionLib.h"
00025 using namespace ::lsc;
00026 
00027 // Include the file library.
00028 #include "LSFFileLib.h"
00029 using namespace ::lsf;
00030 
00031 // Include the thread library.
00032 #include "LSHThreadLib.h"
00033 using namespace ::lsh;
00034 
00035 // Include the math library.
00036 #include "LSMMathLib.h"
00037 using namespace ::lsm;
00038 
00039 // Include the standard library.
00040 #include "LSSTDStandardLib.h"
00041 using namespace ::lsstd;
00042 
00043 // Include the standard library.
00044 #include "LSTLib.h"
00045 using namespace ::lstl;
00046 
00047 #include "Float16/LSMFloat16.h"
00048 #include "Vector/LSTLVectorPoD.h"
00049 
00050 
00051 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00052 // MACROS
00053 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00054 /*#define LSI_R_WEIGHT                                                          0.299f
00055 #define LSI_G_WEIGHT                                                            0.587f
00056 #define LSI_B_WEIGHT                                                            0.114f*/
00057 #define LSI_R_WEIGHT                                                            0.212656f
00058 #define LSI_G_WEIGHT                                                            0.715158f
00059 #define LSI_B_WEIGHT                                                            0.072186f
00060 /*#define LSI_R_WEIGHT                                                          0.3086f
00061 #define LSI_G_WEIGHT                                                            0.6094f
00062 #define LSI_B_WEIGHT                                                            0.082f*/
00063 
00067 #define LSI_MAKE_RGBA( R, G, B, A )                                     static_cast<LSUINT32>(((R) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_R )) |             \
00068                                                                                                         ((G) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_G ))     |                                                       \
00069                                                                                                         ((B) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_B )) |                                                   \
00070                                                                                                         ((A) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_A )))
00071 
00075 #define LSI_MAKE_RGBX( R, G, B )                                        static_cast<LSUINT32>(((R) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_R )) |             \
00076                                                                                                         ((G) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_G )) |                                                   \
00077                                                                                                         ((B) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_B )) |                                                   \
00078                                                                                                         (0xFF << CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_A )))
00079                                                                                                         
00083 #define LSI_MAKE_RGB24( R, G, B )                                       static_cast<LSUINT32>(((R) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_R )) |               \
00084                                                                                                         ((G) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_G )) |                                                             \
00085                                                                                                         ((B) << CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_B )))
00086 
00090 #define LSI_R( VAL )                                                            (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_R )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8A8, LSI_PC_R )) - 1UL))
00091 
00094 #define LSI_G( VAL )                                                            (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_G )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8A8, LSI_PC_G )) - 1UL))
00095 
00098 #define LSI_B( VAL )                                                            (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_B )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8A8, LSI_PC_B )) - 1UL))
00099 
00102 #define LSI_A( VAL )                                                            (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8A8, LSI_PC_A )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8A8, LSI_PC_A )) - 1UL))
00103 
00106 #define LSI_R24( VAL )                                                          (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_R )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8, LSI_PC_R )) - 1UL))
00107 
00110 #define LSI_G24( VAL )                                                          (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_G )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8, LSI_PC_G )) - 1UL))
00111 
00114 #define LSI_B24( VAL )                                                          (((VAL) >> CImageLib::GetComponentOffset( LSI_PF_R8G8B8, LSI_PC_B )) & ((1 << CImageLib::GetComponentBits( LSI_PF_R8G8B8, LSI_PC_B )) - 1UL))
00115 
00116 
00117 #pragma warning( push )
00118 
00119 // warning C4127: conditional expression is constant
00120 #pragma warning( disable : 4127 )
00121 
00122 // warning C4293: '>>' : shift count negative or too big, undefined behavior
00123 #pragma warning( disable : 4293 )
00124 
00125 namespace lsi {
00126 
00127         // == Enumerations.
00131         enum LSI_PIXEL_FORMAT {
00132                 LSI_PF_A8,                                                                      
00133                 LSI_PF_R3G3B2,                                                          
00135                 LSI_PF_R5G6B5,                                                          
00136                 LSI_PF_R4G4B4A4,                                                        
00137                 LSI_PF_R5G5B5A1,                                                        
00139                 LSI_PF_R8G8B8,                                                          
00141                 LSI_PF_R8G8B8A8,                                                        
00143                 LSI_PF_R16G16B16A16,                                            
00145                 LSI_PF_TOTAL_INT,                                                       
00147                 LSI_PF_R16G16B16A16F = LSI_PF_TOTAL_INT,        
00148                 LSI_PF_R32G32B32A32F,                                           
00150                 LSI_PF_TOTAL,                                                           
00152                 LSI_PF_DXT1 = 100,                                                      
00153                 LSI_PF_DXT2 = 101,                                                      
00154                 LSI_PF_DXT3 = 102,                                                      
00155                 LSI_PF_DXT4 = 103,                                                      
00156                 LSI_PF_DXT5 = 104,                                                      
00158                 LSI_PF_ANY = 10000,                                                     
00159                 LSI_PF_HIGHEST_INT = LSI_PF_R16G16B16A16,       
00161         };
00162 
00166         enum LSI_PIXEL_COMPONENTS {
00167                 LSI_PC_R,                                                                       
00168                 LSI_PC_G,                                                                       
00169                 LSI_PC_B,                                                                       
00170                 LSI_PC_A,                                                                       
00171                 LSI_PC_INVALID,                                                         
00172         };
00173 
00174 
00181         class CImageLib {
00182         public :
00183                 // == Types.
00187                 typedef CVectorPoD<LSUINT8, LSUINT32>           CTexelBuffer;
00188 
00189 
00190                 // == Functions.
00198                 static LSE_INLINE const LSUINT32 LSE_FCALL      GetComponentBits( LSI_PIXEL_FORMAT _pfFormat, LSI_PIXEL_COMPONENTS _ppComp );
00199 
00207                 static LSE_INLINE const LSUINT32 LSE_FCALL      GetComponentOffset( LSI_PIXEL_FORMAT _pfFormat, LSI_PIXEL_COMPONENTS _ppComp );
00208 
00215                 static LSE_INLINE const LSUINT32 LSE_FCALL      GetTotalComponents( LSI_PIXEL_FORMAT _pfFormat );
00216 
00225                 static LSE_INLINE LSI_PIXEL_COMPONENTS LSE_FCALL
00226                                                                                                         ComponentIndexToComponentType( LSI_PIXEL_FORMAT _pfFormat, LSUINT32 _ui32Index );
00227 
00237                 static LSE_INLINE const LSUINT32 LSE_FCALL      ConvComponent( LSI_PIXEL_FORMAT _pfSrcFormat, LSI_PIXEL_FORMAT _pfDstFormat,
00238                         LSI_PIXEL_COMPONENTS _ppComp, LSUINT32 _ui32Component );
00239 
00246                 static LSE_INLINE const LSUINT32 LSE_FCALL      GetFormatSize( LSI_PIXEL_FORMAT _pfFormat );
00247 
00255                 static LSE_INLINE LSUINT32 LSE_FCALL            GetRowSize( LSI_PIXEL_FORMAT _pfFormat, LSUINT32 _ui32Total );
00256 
00267                 static LSUINT32 LSE_FCALL                                       GetBufferSizeWithPadding( LSI_PIXEL_FORMAT _pfFormat, LSUINT32 _ui32Width, LSUINT32 _ui32Height );
00268 
00278                 static LSUINT64 LSE_FCALL                                       IntegerTexelToIntegerTexel( LSI_PIXEL_FORMAT _pfSrcFormat, LSI_PIXEL_FORMAT _pfDstFormat, LSUINT64 _ui64Color );
00279 
00287                 static LSVOID LSE_FCALL                                         IntegerTexelToFloat32Texel( LSI_PIXEL_FORMAT _pfSrcFormat, LSUINT64 _ui64Color, LSFLOAT _fReturn[4] );
00288 
00297                 static LSUINT64 LSE_FCALL                                       Float32TexelToIntegerTexel( LSI_PIXEL_FORMAT _pfDstFormat, const LSFLOAT _fValue[4] );
00298 
00306                 static LSVOID LSE_FCALL                                         IntegerTexelToFloat16Texel( LSI_PIXEL_FORMAT _pfSrcFormat, LSUINT64 _ui64Color, CFloat16 _f16Return[4] );
00307 
00316                 static LSUINT64 LSE_FCALL                                       Float16TexelToIntegerTexel( LSI_PIXEL_FORMAT _pfDstFormat, const CFloat16 _f16Value[4] );
00317 
00329                 static LSUINT64 LSE_FCALL                                       Float32TexelToIntegerTexel( LSI_PIXEL_FORMAT _pfDstFormat,
00330                         LSFLOAT _fR, LSFLOAT _fG, LSFLOAT _fB, LSFLOAT _fA );
00331 
00343                 static LSE_INLINE LSVOID LSE_CALL                       BatchIntegerTexelToIntegerTexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00344                         LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00345 
00356                 static LSE_INLINE LSVOID LSE_CALL                       BatchIntegerTexelToFloat32Texel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00357                         LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00358 
00369                 static LSE_INLINE LSVOID LSE_CALL                       BatchIntegerTexelToFloat16Texel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00370                         LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00371 
00382                 static LSE_INLINE LSVOID LSE_CALL                       BatchFloat32TexelToIntegerTexel( const LSVOID * _pvSrcBuffer, LSI_PIXEL_FORMAT _pfDstFormat,
00383                         LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00384 
00395                 static LSE_INLINE LSVOID LSE_CALL                       BatchFloat16TexelToIntegerTexel( const LSVOID * _pvSrcBuffer, LSI_PIXEL_FORMAT _pfDstFormat,
00396                         LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00397 
00407                 static LSE_INLINE LSVOID LSE_CALL                       BatchFloatTexelToFloatTexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00408                         LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00409 
00420                 static LSE_INLINE LSVOID LSE_CALL                       BatchAnyTexelToAnytexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00421                         LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
00422 
00423         protected :
00424                 // == Functions.
00431                 template <unsigned _tSrcBits, unsigned _tDstBits, unsigned _tTreat0BitsAsFF>
00432                 static LSE_INLINE LSUINT32 LSE_FCALL            ConvComp( LSUINT32 _ui32Src );
00433 
00434         };
00435 
00436 
00437         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00438         // DEFINITIONS
00439         // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00440         // == Functions.
00448         LSE_INLINE const LSUINT32 LSE_FCALL CImageLib::GetComponentBits( LSI_PIXEL_FORMAT _pfFormat, LSI_PIXEL_COMPONENTS _ppComp ) {
00449                 static const LSUINT32 ui32Bits[LSI_PF_TOTAL_INT][4] = {
00450                         //  LSI_PC_R    LSI_PC_G        LSI_PC_B        LSI_PC_A
00451                         {       0UL,            0UL,            0UL,            8UL             },      // LSI_PF_A8
00452                         {       3UL,            3UL,            2UL,            0UL             },      // LSI_PF_R3G3B2
00453                         {       5UL,            6UL,            5UL,            0UL             },      // LSI_PF_R5G6B5
00454                         {       4UL,            4UL,            4UL,            4UL             },      // LSI_PF_R4G4B4A4
00455                         {       5UL,            5UL,            5UL,            1UL             },      // LSI_PF_R5G5B5A1
00456                         {       8UL,            8UL,            8UL,            0UL             },      // LSI_PF_R8G8B8
00457                         {       8UL,            8UL,            8UL,            8UL             },      // LSI_PF_R8G8B8A8
00458                         {       16UL,           16UL,           16UL,           16UL    },      // LSI_PF_R16G16B16A16
00459                 };
00460                 return ui32Bits[_pfFormat][_ppComp];
00461         }
00462 
00470         LSE_INLINE const LSUINT32 LSE_FCALL CImageLib::GetComponentOffset( LSI_PIXEL_FORMAT _pfFormat, LSI_PIXEL_COMPONENTS _ppComp ) {
00471                 static const LSUINT32 ui32Offsets[LSI_PF_TOTAL_INT][4] = {
00472                         //  LSI_PC_R    LSI_PC_G        LSI_PC_B        LSI_PC_A
00473                         {       0UL,            0UL,            0UL,            0UL             },      // LSI_PF_A8
00474                         {       5UL,            2UL,            0UL,            0UL             },      // LSI_PF_R3G3B2
00475                         {       11UL,           5UL,            0UL,            0UL             },      // LSI_PF_R5G6B5
00476                         {       12UL,           8UL,            4UL,            0UL             },      // LSI_PF_R4G4B4A4
00477                         {       11UL,           6UL,            1UL,            0UL             },      // LSI_PF_R5G5B5A1
00478                         {       16UL,           8UL,            0UL,            0UL             },      // LSI_PF_R8G8B8
00479                         {       24UL,           16UL,           8UL,            0UL             },      // LSI_PF_R8G8B8A8
00480                         {       48UL,           32UL,           16UL,           0UL             },      // LSI_PF_R16G16B16A16
00481                 };
00482                 return ui32Offsets[_pfFormat][_ppComp];
00483         }
00484 
00491         LSE_INLINE const LSUINT32 LSE_FCALL     CImageLib::GetTotalComponents( LSI_PIXEL_FORMAT _pfFormat ) {
00492                 static const LSUINT32 ui32Comp[LSI_PF_TOTAL] = {
00493                         1UL,    // LSI_PF_A8
00494                         3UL,    // LSI_PF_R3G3B2
00495                         3UL,    // LSI_PF_R5G6B5
00496                         4UL,    // LSI_PF_R4G4B4A4
00497                         4UL,    // LSI_PF_R5G5B5A1
00498                         3UL,    // LSI_PF_R8G8B8
00499                         4UL,    // LSI_PF_R8G8B8A8
00500                         4UL,    // LSI_PF_R16G16B16A16
00501                         4UL,    // LSI_PF_R16G16B16A16F
00502                         4UL,    // LSI_PF_R32G32B32A32F
00503                 };
00504                 return ui32Comp[_pfFormat];
00505         }
00506 
00515         LSE_INLINE LSI_PIXEL_COMPONENTS LSE_FCALL CImageLib::ComponentIndexToComponentType( LSI_PIXEL_FORMAT _pfFormat, LSUINT32 _ui32Index ) {
00516                 static const LSI_PIXEL_COMPONENTS pcTable[LSI_PF_TOTAL][4] = {
00517                         //  0                           1                               2                               3
00518                         {       LSI_PC_A,               LSI_PC_INVALID, LSI_PC_INVALID, LSI_PC_INVALID  },      // LSI_PF_A8
00519                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R3G3B2
00520                         {       LSI_PC_B,               LSI_PC_G,               LSI_PC_R,               LSI_PC_INVALID  },      // LSI_PF_R5G6B5
00521                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R4G4B4A4
00522                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R5G5B5A1
00523                         {       LSI_PC_B,               LSI_PC_G,               LSI_PC_R,               LSI_PC_INVALID  },      // LSI_PF_R8G8B8
00524                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R8G8B8A8
00525                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R16G16B16A16
00526                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R16G16B16A16F
00527                         {       LSI_PC_A,               LSI_PC_B,               LSI_PC_G,               LSI_PC_R                },      // LSI_PF_R32G32B32A32F
00528                 };
00529                 return pcTable[_pfFormat][_ui32Index];
00530         }
00531 
00541         LSE_INLINE const LSUINT32 LSE_FCALL     CImageLib::ConvComponent( LSI_PIXEL_FORMAT _pfSrcFormat, LSI_PIXEL_FORMAT _pfDstFormat,
00542                 LSI_PIXEL_COMPONENTS _ppComp, LSUINT32 _ui32Component ) {
00543                 typedef LSUINT32 (LSE_FCALL * PfConverterFunc)( LSUINT32 _ui32Src );
00544                 static const PfConverterFunc pfTable[LSI_PF_TOTAL_INT][LSI_PF_TOTAL_INT][4] = {
00545                         {       // LSI_PF_A8
00546                                 {       // LSI_PF_A8 -> LSI_PF_A8
00547                                         CImageLib::ConvComp<0, 0, false>,       // LSI_PP_R
00548                                         CImageLib::ConvComp<0, 0, false>,       // LSI_PP_G
00549                                         CImageLib::ConvComp<0, 0, false>,       // LSI_PP_B
00550                                         CImageLib::ConvComp<8, 8, true>,        // LSI_PP_A
00551                                 },
00552                                 {       // LSI_PF_A8 -> LSI_PF_R3G3B2
00553                                         CImageLib::ConvComp<0, 3, false>,       // LSI_PP_R
00554                                         CImageLib::ConvComp<0, 3, false>,       // LSI_PP_G
00555                                         CImageLib::ConvComp<0, 2, false>,       // LSI_PP_B
00556                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00557                                 },
00558                                 {       // LSI_PF_A8 -> LSI_PF_R5G6B5
00559                                         CImageLib::ConvComp<0, 5, false>,       // LSI_PP_R
00560                                         CImageLib::ConvComp<0, 6, false>,       // LSI_PP_G
00561                                         CImageLib::ConvComp<0, 5, false>,       // LSI_PP_B
00562                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00563                                 },
00564                                 {       // LSI_PF_A8 -> LSI_PF_R4G4B4A4
00565                                         CImageLib::ConvComp<0, 4, false>,       // LSI_PP_R
00566                                         CImageLib::ConvComp<0, 4, false>,       // LSI_PP_G
00567                                         CImageLib::ConvComp<0, 4, false>,       // LSI_PP_B
00568                                         CImageLib::ConvComp<8, 4, true>,        // LSI_PP_A
00569                                 },
00570                                 {       // LSI_PF_A8 -> LSI_PF_R5G5B5A1
00571                                         CImageLib::ConvComp<0, 5, false>,       // LSI_PP_R
00572                                         CImageLib::ConvComp<0, 5, false>,       // LSI_PP_G
00573                                         CImageLib::ConvComp<0, 5, false>,       // LSI_PP_B
00574                                         CImageLib::ConvComp<8, 1, true>,        // LSI_PP_A
00575                                 },
00576                                 {       // LSI_PF_A8 -> LSI_PF_R8G8B8
00577                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_R
00578                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_G
00579                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_B
00580                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00581                                 },
00582                                 {       // LSI_PF_A8 -> LSI_PF_R8G8B8A8
00583                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_R
00584                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_G
00585                                         CImageLib::ConvComp<0, 8, false>,       // LSI_PP_B
00586                                         CImageLib::ConvComp<8, 8, true>,        // LSI_PP_A
00587                                 },
00588                                 {       // LSI_PF_A8 -> LSI_PF_R16G16B16A16
00589                                         CImageLib::ConvComp<0, 16, false>,      // LSI_PP_R
00590                                         CImageLib::ConvComp<0, 16, false>,      // LSI_PP_G
00591                                         CImageLib::ConvComp<0, 16, false>,      // LSI_PP_B
00592                                         CImageLib::ConvComp<8, 16, true>,       // LSI_PP_A
00593                                 },
00594                         },
00595                         {       // LSI_PF_R3G3B2
00596                                 {       // LSI_PF_R3G3B2 -> LSI_PF_A8
00597                                         CImageLib::ConvComp<3, 0, false>,       // LSI_PP_R
00598                                         CImageLib::ConvComp<3, 0, false>,       // LSI_PP_G
00599                                         CImageLib::ConvComp<2, 0, false>,       // LSI_PP_B
00600                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00601                                 },
00602                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R3G3B2
00603                                         CImageLib::ConvComp<3, 3, false>,       // LSI_PP_R
00604                                         CImageLib::ConvComp<3, 3, false>,       // LSI_PP_G
00605                                         CImageLib::ConvComp<2, 2, false>,       // LSI_PP_B
00606                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00607                                 },
00608                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R5G6B5
00609                                         CImageLib::ConvComp<3, 5, false>,       // LSI_PP_R
00610                                         CImageLib::ConvComp<3, 6, false>,       // LSI_PP_G
00611                                         CImageLib::ConvComp<2, 5, false>,       // LSI_PP_B
00612                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00613                                 },
00614                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R4G4B4A4
00615                                         CImageLib::ConvComp<3, 4, false>,       // LSI_PP_R
00616                                         CImageLib::ConvComp<3, 4, false>,       // LSI_PP_G
00617                                         CImageLib::ConvComp<2, 4, false>,       // LSI_PP_B
00618                                         CImageLib::ConvComp<0, 4, true>,        // LSI_PP_A
00619                                 },
00620                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R5G5B5A1
00621                                         CImageLib::ConvComp<3, 5, false>,       // LSI_PP_R
00622                                         CImageLib::ConvComp<3, 5, false>,       // LSI_PP_G
00623                                         CImageLib::ConvComp<2, 5, false>,       // LSI_PP_B
00624                                         CImageLib::ConvComp<0, 1, true>,        // LSI_PP_A
00625                                 },
00626                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R8G8B8
00627                                         CImageLib::ConvComp<3, 8, false>,       // LSI_PP_R
00628                                         CImageLib::ConvComp<3, 8, false>,       // LSI_PP_G
00629                                         CImageLib::ConvComp<2, 8, false>,       // LSI_PP_B
00630                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00631                                 },
00632                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R8G8B8A8
00633                                         CImageLib::ConvComp<3, 8, false>,       // LSI_PP_R
00634                                         CImageLib::ConvComp<3, 8, false>,       // LSI_PP_G
00635                                         CImageLib::ConvComp<2, 8, false>,       // LSI_PP_B
00636                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00637                                 },
00638                                 {       // LSI_PF_R3G3B2 -> LSI_PF_R16G16B16A16
00639                                         CImageLib::ConvComp<3, 16, false>,      // LSI_PP_R
00640                                         CImageLib::ConvComp<3, 16, false>,      // LSI_PP_G
00641                                         CImageLib::ConvComp<2, 16, false>,      // LSI_PP_B
00642                                         CImageLib::ConvComp<0, 16, true>,       // LSI_PP_A
00643                                 },
00644                         },
00645                         {       // LSI_PF_R5G6B5
00646                                 {       // LSI_PF_R5G6B5 -> LSI_PF_A8
00647                                         CImageLib::ConvComp<5, 0, false>,       // LSI_PP_R
00648                                         CImageLib::ConvComp<6, 0, false>,       // LSI_PP_G
00649                                         CImageLib::ConvComp<5, 0, false>,       // LSI_PP_B
00650                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00651                                 },
00652                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R3G3B2
00653                                         CImageLib::ConvComp<5, 3, false>,       // LSI_PP_R
00654                                         CImageLib::ConvComp<6, 3, false>,       // LSI_PP_G
00655                                         CImageLib::ConvComp<5, 2, false>,       // LSI_PP_B
00656                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00657                                 },
00658                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R5G6B5
00659                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_R
00660                                         CImageLib::ConvComp<6, 6, false>,       // LSI_PP_G
00661                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_B
00662                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00663                                 },
00664                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R4G4B4A4
00665                                         CImageLib::ConvComp<5, 4, false>,       // LSI_PP_R
00666                                         CImageLib::ConvComp<6, 4, false>,       // LSI_PP_G
00667                                         CImageLib::ConvComp<5, 4, false>,       // LSI_PP_B
00668                                         CImageLib::ConvComp<0, 4, true>,        // LSI_PP_A
00669                                 },
00670                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R5G5B5A1
00671                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_R
00672                                         CImageLib::ConvComp<6, 5, false>,       // LSI_PP_G
00673                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_B
00674                                         CImageLib::ConvComp<0, 1, true>,        // LSI_PP_A
00675                                 },
00676                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R8G8B8
00677                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_R
00678                                         CImageLib::ConvComp<6, 8, false>,       // LSI_PP_G
00679                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_B
00680                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00681                                 },
00682                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R8G8B8A8
00683                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_R
00684                                         CImageLib::ConvComp<6, 8, false>,       // LSI_PP_G
00685                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_B
00686                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00687                                 },
00688                                 {       // LSI_PF_R5G6B5 -> LSI_PF_R16G16B16A16
00689                                         CImageLib::ConvComp<5, 16, false>,      // LSI_PP_R
00690                                         CImageLib::ConvComp<6, 16, false>,      // LSI_PP_G
00691                                         CImageLib::ConvComp<5, 16, false>,      // LSI_PP_B
00692                                         CImageLib::ConvComp<0, 16, true>,       // LSI_PP_A
00693                                 },
00694                         },
00695                         {       // LSI_PF_R4G4B4A4
00696                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_A8
00697                                         CImageLib::ConvComp<4, 0, false>,       // LSI_PP_R
00698                                         CImageLib::ConvComp<4, 0, false>,       // LSI_PP_G
00699                                         CImageLib::ConvComp<4, 0, false>,       // LSI_PP_B
00700                                         CImageLib::ConvComp<4, 8, true>,        // LSI_PP_A
00701                                 },
00702                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R3G3B2
00703                                         CImageLib::ConvComp<4, 3, false>,       // LSI_PP_R
00704                                         CImageLib::ConvComp<4, 3, false>,       // LSI_PP_G
00705                                         CImageLib::ConvComp<4, 2, false>,       // LSI_PP_B
00706                                         CImageLib::ConvComp<4, 0, true>,        // LSI_PP_A
00707                                 },
00708                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R5G6B5
00709                                         CImageLib::ConvComp<4, 5, false>,       // LSI_PP_R
00710                                         CImageLib::ConvComp<4, 6, false>,       // LSI_PP_G
00711                                         CImageLib::ConvComp<4, 5, false>,       // LSI_PP_B
00712                                         CImageLib::ConvComp<4, 0, true>,        // LSI_PP_A
00713                                 },
00714                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R4G4B4A4
00715                                         CImageLib::ConvComp<4, 4, false>,       // LSI_PP_R
00716                                         CImageLib::ConvComp<4, 4, false>,       // LSI_PP_G
00717                                         CImageLib::ConvComp<4, 4, false>,       // LSI_PP_B
00718                                         CImageLib::ConvComp<4, 4, true>,        // LSI_PP_A
00719                                 },
00720                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R5G5B5A1
00721                                         CImageLib::ConvComp<4, 5, false>,       // LSI_PP_R
00722                                         CImageLib::ConvComp<4, 5, false>,       // LSI_PP_G
00723                                         CImageLib::ConvComp<4, 5, false>,       // LSI_PP_B
00724                                         CImageLib::ConvComp<4, 1, true>,        // LSI_PP_A
00725                                 },
00726                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R8G8B8
00727                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_R
00728                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_G
00729                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_B
00730                                         CImageLib::ConvComp<4, 0, true>,        // LSI_PP_A
00731                                 },
00732                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R8G8B8A8
00733                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_R
00734                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_G
00735                                         CImageLib::ConvComp<4, 8, false>,       // LSI_PP_B
00736                                         CImageLib::ConvComp<4, 8, true>,        // LSI_PP_A
00737                                 },
00738                                 {       // LSI_PF_R4G4B4A4 -> LSI_PF_R16G16B16A16
00739                                         CImageLib::ConvComp<4, 16, false>,      // LSI_PP_R
00740                                         CImageLib::ConvComp<4, 16, false>,      // LSI_PP_G
00741                                         CImageLib::ConvComp<4, 16, false>,      // LSI_PP_B
00742                                         CImageLib::ConvComp<4, 16, true>,       // LSI_PP_A
00743                                 },
00744                         },
00745                         {       // LSI_PF_R5G5B5A1
00746                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_A8
00747                                         CImageLib::ConvComp<5, 0, false>,       // LSI_PP_R
00748                                         CImageLib::ConvComp<5, 0, false>,       // LSI_PP_G
00749                                         CImageLib::ConvComp<5, 0, false>,       // LSI_PP_B
00750                                         CImageLib::ConvComp<1, 8, true>,        // LSI_PP_A
00751                                 },
00752                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R3G3B2
00753                                         CImageLib::ConvComp<5, 3, false>,       // LSI_PP_R
00754                                         CImageLib::ConvComp<5, 3, false>,       // LSI_PP_G
00755                                         CImageLib::ConvComp<5, 2, false>,       // LSI_PP_B
00756                                         CImageLib::ConvComp<1, 0, true>,        // LSI_PP_A
00757                                 },
00758                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R5G6B5
00759                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_R
00760                                         CImageLib::ConvComp<5, 6, false>,       // LSI_PP_G
00761                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_B
00762                                         CImageLib::ConvComp<1, 0, true>,        // LSI_PP_A
00763                                 },
00764                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R4G4B4A4
00765                                         CImageLib::ConvComp<5, 4, false>,       // LSI_PP_R
00766                                         CImageLib::ConvComp<5, 4, false>,       // LSI_PP_G
00767                                         CImageLib::ConvComp<5, 4, false>,       // LSI_PP_B
00768                                         CImageLib::ConvComp<1, 4, true>,        // LSI_PP_A
00769                                 },
00770                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R5G5B5A1
00771                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_R
00772                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_G
00773                                         CImageLib::ConvComp<5, 5, false>,       // LSI_PP_B
00774                                         CImageLib::ConvComp<1, 1, true>,        // LSI_PP_A
00775                                 },
00776                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R8G8B8
00777                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_R
00778                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_G
00779                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_B
00780                                         CImageLib::ConvComp<1, 0, true>,        // LSI_PP_A
00781                                 },
00782                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R8G8B8A8
00783                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_R
00784                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_G
00785                                         CImageLib::ConvComp<5, 8, false>,       // LSI_PP_B
00786                                         CImageLib::ConvComp<1, 8, true>,        // LSI_PP_A
00787                                 },
00788                                 {       // LSI_PF_R5G5B5A1 -> LSI_PF_R16G16B16A16
00789                                         CImageLib::ConvComp<5, 16, false>,      // LSI_PP_R
00790                                         CImageLib::ConvComp<5, 16, false>,      // LSI_PP_G
00791                                         CImageLib::ConvComp<5, 16, false>,      // LSI_PP_B
00792                                         CImageLib::ConvComp<1, 16, true>,       // LSI_PP_A
00793                                 },
00794                         },
00795                         {       // LSI_PF_R8G8B8
00796                                 {       // LSI_PF_R8G8B8 -> LSI_PF_A8
00797                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_R
00798                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_G
00799                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_B
00800                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00801                                 },
00802                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R3G3B2
00803                                         CImageLib::ConvComp<8, 3, false>,       // LSI_PP_R
00804                                         CImageLib::ConvComp<8, 3, false>,       // LSI_PP_G
00805                                         CImageLib::ConvComp<8, 2, false>,       // LSI_PP_B
00806                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00807                                 },
00808                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R5G6B5
00809                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_R
00810                                         CImageLib::ConvComp<8, 6, false>,       // LSI_PP_G
00811                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_B
00812                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00813                                 },
00814                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R4G4B4A4
00815                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_R
00816                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_G
00817                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_B
00818                                         CImageLib::ConvComp<0, 4, true>,        // LSI_PP_A
00819                                 },
00820                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R5G5B5A1
00821                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_R
00822                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_G
00823                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_B
00824                                         CImageLib::ConvComp<0, 1, true>,        // LSI_PP_A
00825                                 },
00826                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R8G8B8
00827                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_R
00828                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_G
00829                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_B
00830                                         CImageLib::ConvComp<0, 0, true>,        // LSI_PP_A
00831                                 },
00832                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R8G8B8A8
00833                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_R
00834                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_G
00835                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_B
00836                                         CImageLib::ConvComp<0, 8, true>,        // LSI_PP_A
00837                                 },
00838                                 {       // LSI_PF_R8G8B8 -> LSI_PF_R16G16B16A16
00839                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_R
00840                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_G
00841                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_B
00842                                         CImageLib::ConvComp<0, 16, true>,       // LSI_PP_A
00843                                 },
00844                         },
00845                         {       // LSI_PF_R8G8B8A8
00846                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_A8
00847                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_R
00848                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_G
00849                                         CImageLib::ConvComp<8, 0, false>,       // LSI_PP_B
00850                                         CImageLib::ConvComp<8, 8, true>,        // LSI_PP_A
00851                                 },
00852                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R3G3B2
00853                                         CImageLib::ConvComp<8, 3, false>,       // LSI_PP_R
00854                                         CImageLib::ConvComp<8, 3, false>,       // LSI_PP_G
00855                                         CImageLib::ConvComp<8, 2, false>,       // LSI_PP_B
00856                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00857                                 },
00858                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R5G6B5
00859                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_R
00860                                         CImageLib::ConvComp<8, 6, false>,       // LSI_PP_G
00861                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_B
00862                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00863                                 },
00864                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R4G4B4A4
00865                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_R
00866                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_G
00867                                         CImageLib::ConvComp<8, 4, false>,       // LSI_PP_B
00868                                         CImageLib::ConvComp<8, 4, true>,        // LSI_PP_A
00869                                 },
00870                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R5G5B5A1
00871                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_R
00872                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_G
00873                                         CImageLib::ConvComp<8, 5, false>,       // LSI_PP_B
00874                                         CImageLib::ConvComp<8, 1, true>,        // LSI_PP_A
00875                                 },
00876                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R8G8B8
00877                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_R
00878                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_G
00879                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_B
00880                                         CImageLib::ConvComp<8, 0, true>,        // LSI_PP_A
00881                                 },
00882                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R8G8B8A8
00883                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_R
00884                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_G
00885                                         CImageLib::ConvComp<8, 8, false>,       // LSI_PP_B
00886                                         CImageLib::ConvComp<8, 8, true>,        // LSI_PP_A
00887                                 },
00888                                 {       // LSI_PF_R8G8B8A8 -> LSI_PF_R16G16B16A16
00889                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_R
00890                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_G
00891                                         CImageLib::ConvComp<8, 16, false>,      // LSI_PP_B
00892                                         CImageLib::ConvComp<8, 16, true>,       // LSI_PP_A
00893                                 },
00894                         },
00895                         {       // LSI_PF_R16G16B16A16
00896                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_A8
00897                                         CImageLib::ConvComp<16, 0, false>,      // LSI_PP_R
00898                                         CImageLib::ConvComp<16, 0, false>,      // LSI_PP_G
00899                                         CImageLib::ConvComp<16, 0, false>,      // LSI_PP_B
00900                                         CImageLib::ConvComp<16, 8, true>,       // LSI_PP_A
00901                                 },
00902                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R3G3B2
00903                                         CImageLib::ConvComp<16, 3, false>,      // LSI_PP_R
00904                                         CImageLib::ConvComp<16, 3, false>,      // LSI_PP_G
00905                                         CImageLib::ConvComp<16, 2, false>,      // LSI_PP_B
00906                                         CImageLib::ConvComp<16, 0, true>,       // LSI_PP_A
00907                                 },
00908                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R5G6B5
00909                                         CImageLib::ConvComp<16, 5, false>,      // LSI_PP_R
00910                                         CImageLib::ConvComp<16, 6, false>,      // LSI_PP_G
00911                                         CImageLib::ConvComp<16, 5, false>,      // LSI_PP_B
00912                                         CImageLib::ConvComp<16, 0, true>,       // LSI_PP_A
00913                                 },
00914                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R4G4B4A4
00915                                         CImageLib::ConvComp<16, 4, false>,      // LSI_PP_R
00916                                         CImageLib::ConvComp<16, 4, false>,      // LSI_PP_G
00917                                         CImageLib::ConvComp<16, 4, false>,      // LSI_PP_B
00918                                         CImageLib::ConvComp<16, 4, true>,       // LSI_PP_A
00919                                 },
00920                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R5G5B5A1
00921                                         CImageLib::ConvComp<16, 5, false>,      // LSI_PP_R
00922                                         CImageLib::ConvComp<16, 5, false>,      // LSI_PP_G
00923                                         CImageLib::ConvComp<16, 5, false>,      // LSI_PP_B
00924                                         CImageLib::ConvComp<16, 1, true>,       // LSI_PP_A
00925                                 },
00926                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R8G8B8
00927                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_R
00928                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_G
00929                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_B
00930                                         CImageLib::ConvComp<16, 0, true>,       // LSI_PP_A
00931                                 },
00932                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R8G8B8A8
00933                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_R
00934                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_G
00935                                         CImageLib::ConvComp<16, 8, false>,      // LSI_PP_B
00936                                         CImageLib::ConvComp<16, 8, true>,       // LSI_PP_A
00937                                 },
00938                                 {       // LSI_PF_R16G16B16A16 -> LSI_PF_R16G16B16A16
00939                                         CImageLib::ConvComp<16, 16, false>,     // LSI_PP_R
00940                                         CImageLib::ConvComp<16, 16, false>,     // LSI_PP_G
00941                                         CImageLib::ConvComp<16, 16, false>,     // LSI_PP_B
00942                                         CImageLib::ConvComp<16, 16, true>,      // LSI_PP_A
00943                                 },
00944                         },
00945                 };
00946                 return pfTable[_pfSrcFormat][_pfDstFormat][_ppComp]( _ui32Component );
00947         }
00948 
00955         LSE_INLINE const LSUINT32 LSE_FCALL     CImageLib::GetFormatSize( LSI_PIXEL_FORMAT _pfFormat ) {
00956                 static const LSUINT32 ui32Sizes[LSI_PF_TOTAL] = {
00957                         1,      // LSI_PF_A8
00958                         1,      // LSI_PF_R3G3B2
00959                         2,      // LSI_PF_R5G6B5
00960                         2,      // LSI_PF_R4G4B4A4
00961                         2,      // LSI_PF_R5G5B5A1
00962                         3,      // LSI_PF_R8G8B8
00963                         4,      // LSI_PF_R8G8B8A8
00964                         8,      // LSI_PF_R16G16B16A16
00965                         8,      // LSI_PF_R16G16B16A16F
00966                         16,     // LSI_PF_R32G32B32A32F
00967                 };
00968 
00969                 return ui32Sizes[_pfFormat];
00970         }
00971 
00979         LSE_INLINE LSUINT32 LSE_FCALL CImageLib::GetRowSize( LSI_PIXEL_FORMAT _pfFormat, LSUINT32 _ui32Total ) {
00980                 return _ui32Total * GetFormatSize( _pfFormat );
00981         }
00982 
00994         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchIntegerTexelToIntegerTexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
00995                 LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
00996                 if ( _pfSrcFormat == _pfDstFormat ) {
00997                         // Just copy the buffer.
00998                         CStd::MemCpy( _pvDstBuffer, _pvSrcBuffer, GetFormatSize( _pfSrcFormat ) * _ui32Total );
00999                         return;
01000                 }
01001                 // Convert texel-by-texel.
01002                 const LSUINT8 * pui8Src = static_cast<const LSUINT8 *>(_pvSrcBuffer);
01003                 LSUINT8 * pui8Dst = static_cast<LSUINT8 *>(_pvDstBuffer);
01004                 LSUINT32 ui32SrcSize = GetFormatSize( _pfSrcFormat );
01005                 LSUINT32 ui32DstSize = GetFormatSize( _pfDstFormat );
01006 
01007                 for ( ; _ui32Total--; ) {
01008                         // ARM devices have problems reading from misaligned data.
01009 #ifdef LSE_IPHONE
01010                         LSUINT64 ui64Src = (static_cast<LSUINT64>(pui8Src[7]) << 56ULL) |
01011                                 (static_cast<LSUINT64>(pui8Src[6]) << 48ULL) |
01012                                 (static_cast<LSUINT64>(pui8Src[5]) << 40ULL) |
01013                                 (static_cast<LSUINT64>(pui8Src[4]) << 32ULL) |
01014                                 (static_cast<LSUINT64>(pui8Src[3]) << 24ULL) |
01015                                 (static_cast<LSUINT64>(pui8Src[2]) << 16ULL) |
01016                                 (static_cast<LSUINT64>(pui8Src[1]) << 8ULL) |
01017                                 (static_cast<LSUINT64>(pui8Src[0]) << 0ULL);
01018                         LSUINT64 ui64Dst = IntegerTexelToIntegerTexel( _pfSrcFormat, _pfDstFormat, ui64Src );
01019                         pui8Dst[7] = static_cast<LSUINT8>((ui64Dst >> 56ULL) & 0xFF);
01020                         pui8Dst[6] = static_cast<LSUINT8>((ui64Dst >> 48ULL) & 0xFF);
01021                         pui8Dst[5] = static_cast<LSUINT8>((ui64Dst >> 40ULL) & 0xFF);
01022                         pui8Dst[4] = static_cast<LSUINT8>((ui64Dst >> 32ULL) & 0xFF);
01023                         pui8Dst[3] = static_cast<LSUINT8>((ui64Dst >> 24ULL) & 0xFF);
01024                         pui8Dst[2] = static_cast<LSUINT8>((ui64Dst >> 16ULL) & 0xFF);
01025                         pui8Dst[1] = static_cast<LSUINT8>((ui64Dst >> 8ULL) & 0xFF);
01026                         pui8Dst[0] = static_cast<LSUINT8>((ui64Dst >> 0ULL) & 0xFF);
01027 #else
01028                         LSUINT64 ui64Src = (*reinterpret_cast<const LSUINT64 *>(pui8Src));
01029                         LSUINT64 ui64Dst = IntegerTexelToIntegerTexel( _pfSrcFormat, _pfDstFormat, ui64Src );
01030                         (*reinterpret_cast<LSUINT64 *>(pui8Dst)) = ui64Dst;
01031 #endif  // #ifdef LSE_IPHONE
01032                         pui8Src += ui32SrcSize;
01033                         pui8Dst += ui32DstSize;
01034                 }
01035         }
01036 
01047         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchIntegerTexelToFloat32Texel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
01048                 LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01049                 // Convert texel-by-texel.
01050                 const LSUINT8 * pui8Src = static_cast<const LSUINT8 *>(_pvSrcBuffer);
01051                 LSFLOAT * pfDst = static_cast<LSFLOAT *>(_pvDstBuffer);
01052                 LSUINT32 ui32SrcSize = GetFormatSize( _pfSrcFormat );
01053 
01054                 for ( ; _ui32Total--; ) {
01055 #ifdef LSE_IPHONE
01056                         LSUINT64 ui64Src = (static_cast<LSUINT64>(pui8Src[7]) << 56ULL) |
01057                                 (static_cast<LSUINT64>(pui8Src[6]) << 48ULL) |
01058                                 (static_cast<LSUINT64>(pui8Src[5]) << 40ULL) |
01059                                 (static_cast<LSUINT64>(pui8Src[4]) << 32ULL) |
01060                                 (static_cast<LSUINT64>(pui8Src[3]) << 24ULL) |
01061                                 (static_cast<LSUINT64>(pui8Src[2]) << 16ULL) |
01062                                 (static_cast<LSUINT64>(pui8Src[1]) << 8ULL) |
01063                                 (static_cast<LSUINT64>(pui8Src[0]) << 0ULL);
01064 #else
01065                         LSUINT64 ui64Src = (*reinterpret_cast<const LSUINT64 *>(pui8Src));
01066 #endif  // #ifdef LSE_IPHONE
01067                         IntegerTexelToFloat32Texel( _pfSrcFormat, ui64Src, pfDst );
01068                         pfDst += 4;
01069                         pui8Src += ui32SrcSize;
01070                 }
01071         }
01072 
01083         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchIntegerTexelToFloat16Texel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
01084                 LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01085                 // Convert texel-by-texel.
01086                 const LSUINT8 * pui8Src = static_cast<const LSUINT8 *>(_pvSrcBuffer);
01087                 CFloat16 * pf16Dst = static_cast<CFloat16 *>(_pvDstBuffer);
01088                 LSUINT32 ui32SrcSize = GetFormatSize( _pfSrcFormat );
01089 
01090                 for ( ; _ui32Total--; ) {
01091 #ifdef LSE_IPHONE
01092                         LSUINT64 ui64Src = (static_cast<LSUINT64>(pui8Src[7]) << 56ULL) |
01093                                 (static_cast<LSUINT64>(pui8Src[6]) << 48ULL) |
01094                                 (static_cast<LSUINT64>(pui8Src[5]) << 40ULL) |
01095                                 (static_cast<LSUINT64>(pui8Src[4]) << 32ULL) |
01096                                 (static_cast<LSUINT64>(pui8Src[3]) << 24ULL) |
01097                                 (static_cast<LSUINT64>(pui8Src[2]) << 16ULL) |
01098                                 (static_cast<LSUINT64>(pui8Src[1]) << 8ULL) |
01099                                 (static_cast<LSUINT64>(pui8Src[0]) << 0ULL);
01100 #else
01101                         LSUINT64 ui64Src = (*reinterpret_cast<const LSUINT64 *>(pui8Src));
01102 #endif  // #ifdef LSE_IPHONE
01103                         IntegerTexelToFloat16Texel( _pfSrcFormat, ui64Src, pf16Dst );
01104                         pf16Dst += 4;
01105                         pui8Src += ui32SrcSize;
01106                 }
01107         }
01108 
01119         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchFloat32TexelToIntegerTexel( const LSVOID * _pvSrcBuffer, LSI_PIXEL_FORMAT _pfDstFormat,
01120                 LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01121                 // Convert texel-by-texel.
01122                 const LSFLOAT * pfSrc = static_cast<const LSFLOAT *>(_pvSrcBuffer);
01123                 LSUINT8 * pui8Dst = static_cast<LSUINT8 *>(_pvDstBuffer);
01124                 LSUINT32 ui32DstSize = GetFormatSize( _pfDstFormat );
01125 
01126                 for ( ; _ui32Total--; ) {
01127                         (*reinterpret_cast<LSUINT64 *>(pui8Dst)) = Float32TexelToIntegerTexel( _pfDstFormat, pfSrc );
01128                         pfSrc += 4;
01129                         pui8Dst += ui32DstSize;
01130                 }
01131         }
01132 
01143         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchFloat16TexelToIntegerTexel( const LSVOID * _pvSrcBuffer, LSI_PIXEL_FORMAT _pfDstFormat,
01144                 LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01145                 // Convert texel-by-texel.
01146                 const CFloat16 * pf16Src = static_cast<const CFloat16 *>(_pvSrcBuffer);
01147                 LSUINT8 * pui8Dst = static_cast<LSUINT8 *>(_pvDstBuffer);
01148                 LSUINT32 ui32DstSize = GetFormatSize( _pfDstFormat );
01149 
01150                 for ( ; _ui32Total--; ) {
01151                         (*reinterpret_cast<LSUINT64 *>(pui8Dst)) = Float16TexelToIntegerTexel( _pfDstFormat, pf16Src );
01152                         pf16Src += 4;
01153                         pui8Dst += ui32DstSize;
01154                 }
01155         }
01156 
01166         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchFloatTexelToFloatTexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
01167                 LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01168                 if ( _pfSrcFormat == _pfDstFormat ) {
01169                         // Just copy the buffer.
01170                         CStd::MemCpy( _pvDstBuffer, _pvSrcBuffer, GetFormatSize( _pfSrcFormat ) * _ui32Total );
01171                         return;
01172                 }
01173 
01174                 // Convert texel-by-texel.
01175                 if ( _pfSrcFormat == LSI_PF_R16G16B16A16F ) {
01176                         // From 16 to 32.
01177                         const CFloat16 * pf16Src = static_cast<const CFloat16 *>(_pvSrcBuffer);
01178                         LSFLOAT * pfDst = static_cast<LSFLOAT *>(_pvDstBuffer);
01179 
01180                         for ( _ui32Total <<= 2; _ui32Total--; ) {
01181                                 (*pfDst++) = (*pf16Src++);
01182                         }
01183                 }
01184                 else {
01185                         const LSFLOAT * pfSrc = static_cast<const LSFLOAT *>(_pvSrcBuffer);
01186                         CFloat16 * pf16Dst = static_cast<CFloat16 *>(_pvDstBuffer);
01187                         for ( _ui32Total <<= 2; _ui32Total--; ) {
01188                                 (*pf16Dst++) = (*pfSrc++);
01189                         }
01190                 }
01191         }
01192 
01203         LSE_INLINE LSVOID LSE_CALL CImageLib::BatchAnyTexelToAnytexel( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
01204                 LSI_PIXEL_FORMAT _pfDstFormat, LSVOID * _pvDstBuffer, LSUINT32 _ui32Total ) {
01205                 // Same format?
01206                 if ( _pfSrcFormat == _pfDstFormat ) {
01207                         // Just copy.
01208                         CStd::MemCpy( _pvDstBuffer, _pvSrcBuffer, _ui32Total * GetFormatSize( _pfSrcFormat ) );
01209                         return;
01210                 }
01211 
01212                 // Both integer types?
01213                 if ( _pfSrcFormat < LSI_PF_TOTAL_INT && _pfDstFormat < LSI_PF_TOTAL_INT ) {
01214                         BatchIntegerTexelToIntegerTexel( _pfSrcFormat, _pvSrcBuffer, _pfDstFormat, _pvDstBuffer, _ui32Total );
01215                         return;
01216                 }
01217 
01218                 // Both floating types?
01219                 if ( _pfSrcFormat >= LSI_PF_TOTAL_INT && _pfDstFormat >= LSI_PF_TOTAL_INT ) {
01220                         BatchFloatTexelToFloatTexel( _pfSrcFormat, _pvSrcBuffer, _pfDstFormat, _pvDstBuffer, _ui32Total );
01221                         return;
01222                 }
01223 
01224 
01225                 // One side is an integer format and the other side is a float format.
01226                 if ( _pfSrcFormat < LSI_PF_TOTAL_INT ) {
01227                         // Int to float.
01228                         typedef LSVOID (LSE_CALL * PfConvMe)( LSI_PIXEL_FORMAT _pfSrcFormat, const LSVOID * _pvSrcBuffer,
01229                                 LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
01230 
01231                         static const PfConvMe pfConvFuncs[2] = {
01232                                 BatchIntegerTexelToFloat16Texel,
01233                                 BatchIntegerTexelToFloat32Texel
01234                         };
01235                         pfConvFuncs[_pfDstFormat-LSI_PF_TOTAL_INT]( _pfSrcFormat, _pvSrcBuffer, _pvDstBuffer, _ui32Total );
01236                         return;
01237                 }
01238                 // Float to int.
01239                 typedef LSVOID (LSE_CALL * PfConvMe)( const LSVOID * _pvSrcBuffer, LSI_PIXEL_FORMAT _pfDstFormat,
01240                         LSVOID * _pvDstBuffer, LSUINT32 _ui32Total );
01241 
01242                 static const PfConvMe pfConvFuncs[2] = {
01243                         BatchFloat16TexelToIntegerTexel,
01244                         BatchFloat32TexelToIntegerTexel
01245                 };
01246                 pfConvFuncs[_pfSrcFormat-LSI_PF_TOTAL_INT]( _pvSrcBuffer, _pfDstFormat, _pvDstBuffer, _ui32Total );
01247         }
01248 
01255         template <unsigned _tSrcBits, unsigned _tDstBits, unsigned _tTreat0BitsAsFF>
01256         LSE_INLINE LSUINT32 LSE_FCALL CImageLib::ConvComp( LSUINT32 _ui32Src ) {
01257                 // Because this is a template function, if statements will be fully removed when compiled since
01258                 //      they will all resolve to constant expressions.
01259 
01260                 // If the component bits are the same, no conversion takes place.
01261                 if ( _tSrcBits == _tDstBits ) { return _ui32Src; }
01262 
01263                 // If the destination bits are 0, return 0.
01264                 if ( _tDstBits == 0 ) { return 0; }
01265 
01266                 // If the source bits are 0, return either 0 or the highest value possible
01267                 //      for the destination.
01268                 if ( _tSrcBits == 0 ) {
01269                         if ( _tTreat0BitsAsFF ) {
01270                                 return (1 << _tDstBits) - 1;
01271                         }
01272                         return 0;
01273                 }
01274 
01275                 // Both the source and the destination have some bits in them and they are not the same number of
01276                 //      bits.  One will be higher than the other and this changes which shift we have to use.
01277                 if ( _tSrcBits > _tDstBits ) {
01278                         // Shifting down (>>).
01279                         return _ui32Src >> (_tSrcBits - _tDstBits);
01280                 }
01281                 // Destination bits are greater than the source bits.  Normalization is necessary.
01282                 // That - (1 - !_tSrcBits) at the end should be just - 1, but the compiler barfs if _tSrcBits is 0 because it tries
01283                 //      to divide by zero during compile-time.  During run-time, this can never happen, since the function will never get
01284                 //      here if _tSrcBits is 0, but the compiler still tries to resolve the expression below to a constant and it will
01285                 //      divide by zero in doing so.
01286                 // "- (1 - !_tSrcBits)" is necessary to avoid this.
01287                 return static_cast<LSUINT32>(_ui32Src * static_cast<LSFLOAT>(((1 << _tDstBits) - 1) / static_cast<LSFLOAT>((1 << _tSrcBits) - (1 - !_tSrcBits))));
01288         }
01289 
01290 }       // namespace lsi
01291 
01292 #pragma warning( pop )
01293 
01294 #endif  // __LSI_IMAGELIB_H__
 All Classes Namespaces Functions Variables Typedefs Enumerations Enumerator