@@ -536,7 +536,7 @@ static const char *GetCMPErrorString( CMP_ERROR error )
536536
537537vlBool CVTFFile::Create ( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUInt uiFaces, vlUInt uiSlices, vlByte **lpImageDataRGBA8888, const SVTFCreateOptions &VTFCreateOptions, const VTFImageFormat &SourceFormat )
538538{
539- if ( VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA32323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGB323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA16161616F )
539+ if ( VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA32323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGB323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA16161616F || VTFCreateOptions. ImageFormat == IMAGE_FORMAT_R32F )
540540 return CreateFloat ( uiWidth, uiHeight, uiFrames, uiFaces, uiSlices, lpImageDataRGBA8888, VTFCreateOptions, SourceFormat );
541541 return Create ( uiWidth, uiHeight, uiFrames, uiFaces, uiSlices, lpImageDataRGBA8888, VTFCreateOptions );
542542}
@@ -893,7 +893,7 @@ vlBool CVTFFile::Create( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUIn
893893//
894894vlBool CVTFFile::CreateFloat ( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUInt uiFaces, vlUInt uiSlices, vlByte **lpImageDataFP, const SVTFCreateOptions &VTFCreateOptions, const VTFImageFormat &SourceFormat )
895895{
896- if ( !( VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA32323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGB323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA16161616F ) )
896+ if ( !( VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA32323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGB323232F || VTFCreateOptions.ImageFormat == IMAGE_FORMAT_RGBA16161616F || VTFCreateOptions. ImageFormat == IMAGE_FORMAT_R32F ) )
897897 return false ;
898898
899899 vlUInt uiCount = 0 ;
@@ -3906,7 +3906,7 @@ static SVTFImageConvertInfo VTFImageConvertInfo[IMAGE_FORMAT_COUNT] =
39063906 { 64 , 8 , 16 , 16 , 16 , 16 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA16161616F },
39073907 { 64 , 8 , 16 , 16 , 16 , 16 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA16161616 },
39083908 { 32 , 4 , 8 , 8 , 8 , 8 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_UVLX8888 },
3909- { 32 , 4 , 32 , 0 , 0 , 0 , 0 , -1 , -1 , -1 , vlFalse, vlFalse , NULL , NULL , IMAGE_FORMAT_R32F },
3909+ { 32 , 4 , 32 , 0 , 0 , 0 , 0 , -1 , -1 , -1 , vlFalse, vlTrue , NULL , NULL , IMAGE_FORMAT_R32F },
39103910 { 96 , 12 , 32 , 32 , 32 , 0 , 0 , 1 , 2 , -1 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGB323232F },
39113911 { 128 , 16 , 32 , 32 , 32 , 32 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA32323232F },
39123912 {},
@@ -4358,43 +4358,33 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
43584358 return didConvert;
43594359 }
43604360
4361- if ( DestFormat == IMAGE_FORMAT_RGBA16161616F )
4361+ if ( SourceFormat == IMAGE_FORMAT_R32F )
43624362 {
4363- if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F || SourceFormat == IMAGE_FORMAT_RGB323232F )
4364- {
4365- vlBool hasAlpha = SourceFormat == IMAGE_FORMAT_RGBA32323232F;
4363+ auto lpMiddleSize = ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F );
4364+ auto lpMiddle = new vlByte[lpMiddleSize];
43664365
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 );
4366+ auto lpMiddleFP = reinterpret_cast <float *>( lpMiddle );
43704367
4371- for ( ; lpSourceFP < lpLastFP; lpSourceFP += hasAlpha ? 4 : 3 , lpDestFP += 4 )
4372- {
4373- float test = lpSourceFP[0 ];
4374- float test2 = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4368+ auto lpLastFP = reinterpret_cast <float *>( lpMiddle + lpMiddleSize );
43754369
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- }
4370+ auto lpSourceFP = reinterpret_cast <float *>( lpSource );
43814371
4382- return vlTrue;
4372+ for ( ; lpMiddleFP < lpLastFP; lpSourceFP++, lpMiddleFP += 4 )
4373+ {
4374+ lpMiddleFP[0 ] = lpSourceFP[0 ];
4375+ lpMiddleFP[1 ] = 0 .f ;
4376+ lpMiddleFP[2 ] = 0 .f ;
4377+ lpMiddleFP[3 ] = 1 .f ;
43834378 }
43844379
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] ) )
4380+ if ( !Convert ( lpMiddle, lpDest, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat ) )
43884381 {
4389- delete[] lpIntermediateRGBA ;
4382+ delete[] lpMiddle ;
43904383 return vlFalse;
43914384 }
43924385
4393- vlBool didConvert = Convert ( lpIntermediateRGBA, lpDest, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat );
4394-
4395- delete[] lpIntermediateRGBA;
4396-
4397- return didConvert;
4386+ delete[] lpMiddle;
4387+ return vlTrue;
43984388 }
43994389
44004390 if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F && DestFormat == IMAGE_FORMAT_RGB323232F )
@@ -4461,6 +4451,83 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
44614451 return vlTrue;
44624452 }
44634453
4454+ if ( DestFormat == IMAGE_FORMAT_R32F )
4455+ {
4456+ if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F || SourceFormat == IMAGE_FORMAT_RGB323232F )
4457+ {
4458+ vlBool hasAlpha = SourceFormat == IMAGE_FORMAT_RGBA32323232F;
4459+
4460+ auto lpSourceFP = reinterpret_cast <float *>( lpSource );
4461+ auto lpLastFP = reinterpret_cast <float *>( lpSource + ComputeImageSize ( uiWidth, uiHeight, 1 , hasAlpha ? IMAGE_FORMAT_RGBA32323232F : IMAGE_FORMAT_RGB323232F ) );
4462+
4463+ auto lpDestFP = reinterpret_cast <float *>( lpDest );
4464+
4465+ for ( ; lpSourceFP < lpLastFP; lpSourceFP += hasAlpha ? 4 : 3 , lpDestFP++ )
4466+ lpDestFP[0 ] = lpSourceFP[0 ];
4467+
4468+ return vlTrue;
4469+ }
4470+
4471+ auto lpMiddleSize = ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F );
4472+ auto lpMiddle = new vlByte[lpMiddleSize];
4473+
4474+ if ( !Convert ( lpSource, lpMiddle, uiWidth, uiHeight, SourceFormat, IMAGE_FORMAT_RGBA32323232F ) )
4475+ {
4476+ delete[] lpMiddle;
4477+ return vlFalse;
4478+ }
4479+
4480+ auto lpSourceFP = reinterpret_cast <float *>( lpMiddle );
4481+ auto lpLastFP = reinterpret_cast <float *>( lpMiddle + lpMiddleSize );
4482+
4483+ auto lpDestFP = reinterpret_cast <float *>( lpDest );
4484+
4485+ for ( ; lpSourceFP < lpLastFP; lpSourceFP += 4 , lpDestFP++ )
4486+ lpDestFP[0 ] = lpSourceFP[0 ];
4487+
4488+ delete[] lpMiddle;
4489+ return vlTrue;
4490+ }
4491+
4492+ if ( DestFormat == IMAGE_FORMAT_RGBA16161616F )
4493+ {
4494+ if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F || SourceFormat == IMAGE_FORMAT_RGB323232F )
4495+ {
4496+ vlBool hasAlpha = SourceFormat == IMAGE_FORMAT_RGBA32323232F;
4497+
4498+ float *lpSourceFP = reinterpret_cast <float *>( lpSource );
4499+ float *lpLastFP = reinterpret_cast <float *>( lpSource + CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , SourceFormat ) );
4500+ unsigned short *lpDestFP = reinterpret_cast <unsigned short *>( lpDest );
4501+
4502+ for ( ; lpSourceFP < lpLastFP; lpSourceFP += hasAlpha ? 4 : 3 , lpDestFP += 4 )
4503+ {
4504+ float test = lpSourceFP[0 ];
4505+ float test2 = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4506+
4507+ lpDestFP[0 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[0 ] );
4508+ lpDestFP[1 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[1 ] );
4509+ lpDestFP[2 ] = CVTFFile::FP32ToFP16 ( lpSourceFP[2 ] );
4510+ lpDestFP[3 ] = hasAlpha ? CVTFFile::FP32ToFP16 ( lpSourceFP[3 ] ) : CVTFFile::FP32ToFP16 ( 1 .f );
4511+ }
4512+
4513+ return vlTrue;
4514+ }
4515+
4516+ auto lpIntermediateRGBA = new vlByte[CVTFFile::ComputeImageSize ( uiWidth, uiHeight, 1 , IMAGE_FORMAT_RGBA32323232F )];
4517+
4518+ if ( !LDR_TO_HDR ( lpSource, lpIntermediateRGBA, uiWidth, uiHeight, SourceInfo, VTFImageConvertInfo[IMAGE_FORMAT_RGBA32323232F] ) )
4519+ {
4520+ delete[] lpIntermediateRGBA;
4521+ return vlFalse;
4522+ }
4523+
4524+ vlBool didConvert = Convert ( lpIntermediateRGBA, lpDest, uiWidth, uiHeight, IMAGE_FORMAT_RGBA32323232F, DestFormat );
4525+
4526+ delete[] lpIntermediateRGBA;
4527+
4528+ return didConvert;
4529+ }
4530+
44644531 // Do general convertions.
44654532 if ( SourceInfo.bIsCompressed || DestInfo.bIsCompressed )
44664533 {
0 commit comments