2222#define STB_IMAGE_IMPLEMENTATION
2323#undef STBI_NO_FAILURE_STRINGS
2424
25- #include " Float16.h"
26- #include " half.hpp"
2725#include " stb_image.h"
2826#include " stb_image_resize.h"
2927
@@ -33,6 +31,8 @@ using namespace VTFLib;
3331#undef min
3432#undef max
3533
34+ #include " half.hpp"
35+
3636// Class construction
3737// ------------------
3838CVTFFile::CVTFFile ()
@@ -4358,6 +4358,45 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
43584358 return didConvert;
43594359 }
43604360
4361+ if ( DestFormat == IMAGE_FORMAT_RGBA16161616F )
4362+ {
4363+ if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F || SourceFormat == IMAGE_FORMAT_RGB323232F )
4364+ {
4365+ vlBool hasAlpha = SourceFormat == IMAGE_FORMAT_RGBA32323232F;
4366+
4367+ float *lpSourceFP = reinterpret_cast <float *>( lpSource );
4368+ float *lpLastFP = reinterpret_cast <float *>( lpSource + CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , SourceFormat ) );
4369+ unsigned short *lpDestFP = reinterpret_cast <unsigned short *>( lpDest );
4370+
4371+ for ( ; lpSourceFP < lpLastFP; lpSourceFP += hasAlpha ? 4 : 3 , lpDestFP += 4 )
4372+ {
4373+ float test = lpSourceFP[0 ];
4374+ float test2 = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4375+
4376+ lpDestFP[0 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4377+ lpDestFP[1 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[1 ] );
4378+ lpDestFP[2 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[2 ] );
4379+ lpDestFP[3 ] = hasAlpha ? CVTFFile::FP32ToFP16 ( lpSourceFP[3 ] ) : CVTFFile::FP32ToFP16 ( 1 .f );
4380+ }
4381+
4382+ return vlTrue;
4383+ }
4384+
4385+ auto lpIntermediateRGBA = new vlByte[CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F )];
4386+
4387+ if ( !LDR_TO_HDR ( lpSource, lpIntermediateRGBA, uiWidth, uiHeight, SourceInfo, VTFImageConvertInfo[IMAGE_FORMAT_RGBA32323232F] ) )
4388+ {
4389+ delete[] lpIntermediateRGBA;
4390+ return vlFalse;
4391+ }
4392+
4393+ vlBool didConvert = Convert ( lpIntermediateRGBA, lpDest, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat );
4394+
4395+ delete[] lpIntermediateRGBA;
4396+
4397+ return didConvert;
4398+ }
4399+
43614400 if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F && DestFormat == IMAGE_FORMAT_RGB323232F )
43624401 {
43634402 float *lpSourceFP = reinterpret_cast <float *>( lpSource );
@@ -4390,43 +4429,36 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
43904429 return vlTrue;
43914430 }
43924431
4393- if ( DestFormat == IMAGE_FORMAT_RGBA16161616F )
4432+ if ( DestFormat == IMAGE_FORMAT_RGBA32323232F || DestFormat == IMAGE_FORMAT_RGB323232F )
43944433 {
4395- if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F || SourceFormat == IMAGE_FORMAT_RGB323232F )
4434+ auto lpRGBA8888Data = new vlByte[ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA8888 )];
4435+ if ( !ConvertToRGBA8888 ( lpSource, lpRGBA8888Data, uiWidth, uiHeight, SourceFormat ) )
43964436 {
4397- vlBool hasAlpha = SourceFormat == IMAGE_FORMAT_RGBA32323232F;
4437+ delete[] lpRGBA8888Data;
4438+ return vlFalse;
4439+ }
43984440
4399- float *lpSourceFP = reinterpret_cast <float *>( lpSource );
4400- float *lpLastFP = reinterpret_cast <float *>( lpSource + CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , SourceFormat ) );
4401- unsigned short *lpDestFP = reinterpret_cast <unsigned short *>( lpDest );
4441+ if ( DestFormat == IMAGE_FORMAT_RGBA32323232F )
4442+ LDR_TO_HDR ( lpRGBA8888Data, lpDest, uiWidth, uiHeight, VTFImageConvertInfo[IMAGE_FORMAT_RGBA8888], DestInfo );
4443+ else
4444+ {
4445+ auto lpRGBAFP32Data = new vlByte[ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F )];
44024446
4403- for ( ; lpSourceFP < lpLastFP; lpSourceFP += hasAlpha ? 4 : 3 , lpDestFP += 4 )
4404- {
4405- float test = lpSourceFP[0 ];
4406- float test2 = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4447+ LDR_TO_HDR ( lpRGBA8888Data, lpRGBAFP32Data, uiWidth, uiHeight, VTFImageConvertInfo[IMAGE_FORMAT_RGBA8888], VTFImageConvertInfo[IMAGE_FORMAT_RGBA32323232F] );
44074448
4408- lpDestFP[0 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4409- lpDestFP[1 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[1 ] );
4410- lpDestFP[2 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[2 ] );
4411- lpDestFP[3 ] = hasAlpha ? CVTFFile::FP32ToFP16 ( lpSourceFP[3 ] ) : CVTFFile::FP32ToFP16 ( 1 .f );
4449+ if ( !Convert ( lpRGBAFP32Data, lpSource, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat ) )
4450+ {
4451+ delete[] lpRGBAFP32Data;
4452+ delete[] lpRGBA8888Data;
4453+ return vlFalse;
44124454 }
44134455
4414- return vlTrue ;
4456+ delete[] lpRGBAFP32Data ;
44154457 }
44164458
4417- auto lpIntermediateRGBA = new vlByte[ CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F )] ;
4459+ delete[] lpRGBA8888Data ;
44184460
4419- if ( !LDR_TO_HDR ( lpSource, lpIntermediateRGBA, uiWidth, uiHeight, SourceInfo, VTFImageConvertInfo[IMAGE_FORMAT_RGBA32323232F] ) )
4420- {
4421- delete[] lpIntermediateRGBA;
4422- return vlFalse;
4423- }
4424-
4425- vlBool didConvert = Convert ( lpIntermediateRGBA, lpDest, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat );
4426-
4427- delete[] lpIntermediateRGBA;
4428-
4429- return didConvert;
4461+ return vlTrue;
44304462 }
44314463
44324464 // Do general convertions.
0 commit comments