"L. Spiro Engine"
|
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__