Skip to content

Commit 6aab315

Browse files
Fix: fix issue with conversion to FP formats due to missing conversions.
1 parent 79904bb commit 6aab315

1 file changed

Lines changed: 61 additions & 29 deletions

File tree

VTFLib/VTFFile.cpp

Lines changed: 61 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
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
// ------------------
3838
CVTFFile::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

Comments
 (0)