@@ -536,7 +536,7 @@ static const char *GetCMPErrorString( CMP_ERROR error )
536
536
537
537
vlBool CVTFFile::Create ( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUInt uiFaces, vlUInt uiSlices, vlByte **lpImageDataRGBA8888, const SVTFCreateOptions &VTFCreateOptions, const VTFImageFormat &SourceFormat )
538
538
{
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 )
540
540
return CreateFloat ( uiWidth, uiHeight, uiFrames, uiFaces, uiSlices, lpImageDataRGBA8888, VTFCreateOptions, SourceFormat );
541
541
return Create ( uiWidth, uiHeight, uiFrames, uiFaces, uiSlices, lpImageDataRGBA8888, VTFCreateOptions );
542
542
}
@@ -893,7 +893,7 @@ vlBool CVTFFile::Create( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUIn
893
893
//
894
894
vlBool CVTFFile::CreateFloat ( vlUInt uiWidth, vlUInt uiHeight, vlUInt uiFrames, vlUInt uiFaces, vlUInt uiSlices, vlByte **lpImageDataFP, const SVTFCreateOptions &VTFCreateOptions, const VTFImageFormat &SourceFormat )
895
895
{
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 ) )
897
897
return false ;
898
898
899
899
vlUInt uiCount = 0 ;
@@ -3906,7 +3906,7 @@ static SVTFImageConvertInfo VTFImageConvertInfo[IMAGE_FORMAT_COUNT] =
3906
3906
{ 64 , 8 , 16 , 16 , 16 , 16 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA16161616F },
3907
3907
{ 64 , 8 , 16 , 16 , 16 , 16 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA16161616 },
3908
3908
{ 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 },
3910
3910
{ 96 , 12 , 32 , 32 , 32 , 0 , 0 , 1 , 2 , -1 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGB323232F },
3911
3911
{ 128 , 16 , 32 , 32 , 32 , 32 , 0 , 1 , 2 , 3 , vlFalse, vlTrue, NULL , NULL , IMAGE_FORMAT_RGBA32323232F },
3912
3912
{},
@@ -4358,43 +4358,33 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
4358
4358
return didConvert;
4359
4359
}
4360
4360
4361
- if ( DestFormat == IMAGE_FORMAT_RGBA16161616F )
4361
+ if ( SourceFormat == IMAGE_FORMAT_R32F )
4362
4362
{
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];
4366
4365
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 );
4370
4367
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 );
4375
4369
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 );
4381
4371
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 ;
4383
4378
}
4384
4379
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 ) )
4388
4381
{
4389
- delete[] lpIntermediateRGBA ;
4382
+ delete[] lpMiddle ;
4390
4383
return vlFalse;
4391
4384
}
4392
4385
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;
4398
4388
}
4399
4389
4400
4390
if ( SourceFormat == IMAGE_FORMAT_RGBA32323232F && DestFormat == IMAGE_FORMAT_RGB323232F )
@@ -4461,6 +4451,83 @@ vlBool CVTFFile::Convert( vlByte *lpSource, vlByte *lpDest, vlUInt uiWidth, vlUI
4461
4451
return vlTrue;
4462
4452
}
4463
4453
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
+
4464
4531
// Do general convertions.
4465
4532
if ( SourceInfo.bIsCompressed || DestInfo.bIsCompressed )
4466
4533
{
0 commit comments