Fix #12220: Add Decompress Bc5 to Squish
This Commit fixes the corrupted file preview described in #12220. Added DecompressColourBc5 function to squish.
This commit is contained in:
parent
92a8a505a0
commit
e021097c80
5 changed files with 246 additions and 1 deletions
8
thirdparty/README.md
vendored
8
thirdparty/README.md
vendored
|
@ -365,6 +365,7 @@ Files extracted from upstream source:
|
||||||
- celt/ and silk/ subfolders
|
- celt/ and silk/ subfolders
|
||||||
- COPYING
|
- COPYING
|
||||||
|
|
||||||
|
|
||||||
## pcre2
|
## pcre2
|
||||||
|
|
||||||
- Upstream: http://www.pcre.org/
|
- Upstream: http://www.pcre.org/
|
||||||
|
@ -378,6 +379,7 @@ Files extracted from upstream source:
|
||||||
- src/pcre2_jit_*.c and src/sljit/*
|
- src/pcre2_jit_*.c and src/sljit/*
|
||||||
- AUTHORS and COPYING
|
- AUTHORS and COPYING
|
||||||
|
|
||||||
|
|
||||||
## pvrtccompressor
|
## pvrtccompressor
|
||||||
|
|
||||||
- Upstream: https://bitbucket.org/jthlim/pvrtccompressor
|
- Upstream: https://bitbucket.org/jthlim/pvrtccompressor
|
||||||
|
@ -389,12 +391,14 @@ Files extracted from upstream source:
|
||||||
- all .cpp and .h files apart from `main.cpp`
|
- all .cpp and .h files apart from `main.cpp`
|
||||||
- LICENSE.TXT
|
- LICENSE.TXT
|
||||||
|
|
||||||
|
|
||||||
## recastnavigation
|
## recastnavigation
|
||||||
|
|
||||||
- Upstream: https://github.com/recastnavigation/recastnavigation
|
- Upstream: https://github.com/recastnavigation/recastnavigation
|
||||||
- version: git commit ef3ea40f - 2016-02-06
|
- version: git commit ef3ea40f - 2016-02-06
|
||||||
- License: zlib
|
- License: zlib
|
||||||
|
|
||||||
|
|
||||||
## rtaudio
|
## rtaudio
|
||||||
|
|
||||||
- Upstream: http://www.music.mcgill.ca/~gary/rtaudio/
|
- Upstream: http://www.music.mcgill.ca/~gary/rtaudio/
|
||||||
|
@ -416,6 +420,10 @@ Files extracted from upstream source:
|
||||||
|
|
||||||
- all .cpp, .h and .inl files
|
- all .cpp, .h and .inl files
|
||||||
|
|
||||||
|
Important: Some files have Godot-made changes.
|
||||||
|
They are marked with `// -- GODOT start --` and `// -- GODOT end --`
|
||||||
|
comments and a patch is provided in the squish/ folder.
|
||||||
|
|
||||||
|
|
||||||
## tinyexr
|
## tinyexr
|
||||||
|
|
||||||
|
|
143
thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch
vendored
Normal file
143
thirdparty/squish/Add-Decompress-Bc5-to-Squish.patch
vendored
Normal file
|
@ -0,0 +1,143 @@
|
||||||
|
From 7b64cc4c8b0be0443741483bf65909f5140179c0 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Orkun <orkuntezerm@gmail.com>
|
||||||
|
Date: Sun, 19 Nov 2017 02:24:31 +0300
|
||||||
|
Subject: [PATCH] Fix #12220: Add Decompress Bc5 to Squish
|
||||||
|
|
||||||
|
This Commit fixes the corrupted file preview described in #12220.
|
||||||
|
Added DecompressColourBc5 function to squish.
|
||||||
|
---
|
||||||
|
thirdparty/squish/colourblock.cpp | 85 +++++++++++++++++++++++++++++++++++++++
|
||||||
|
thirdparty/squish/colourblock.h | 3 ++
|
||||||
|
thirdparty/squish/squish.cpp | 8 +++-
|
||||||
|
3 files changed, 95 insertions(+), 1 deletion(-)
|
||||||
|
|
||||||
|
diff --git a/thirdparty/squish/colourblock.cpp b/thirdparty/squish/colourblock.cpp
|
||||||
|
index af8b98036..3de46382c 100644
|
||||||
|
--- a/thirdparty/squish/colourblock.cpp
|
||||||
|
+++ b/thirdparty/squish/colourblock.cpp
|
||||||
|
@@ -211,4 +211,89 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
+// -- Godot start --
|
||||||
|
+void DecompressColourBc5( u8* rgba, void const* block)
|
||||||
|
+{
|
||||||
|
+ // get the block bytes
|
||||||
|
+ u8 const* bytes = reinterpret_cast< u8 const* >( block );
|
||||||
|
+
|
||||||
|
+ // unpack the endpoints
|
||||||
|
+ u8 codes[16];
|
||||||
|
+ int red_0 = bytes[0];
|
||||||
|
+ int red_1 = bytes[1];
|
||||||
|
+
|
||||||
|
+ codes[0] = red_0;
|
||||||
|
+ codes[1] = red_1;
|
||||||
|
+ codes[6] = 0.0f;
|
||||||
|
+ codes[7] = 1.0f;
|
||||||
|
+ // generate the midpoints
|
||||||
|
+ if(red_0 > red_1)
|
||||||
|
+ {
|
||||||
|
+ for( int i = 2; i < 8; ++i )
|
||||||
|
+ {
|
||||||
|
+ codes[i] = ((8-i)*red_0 + (i-1)*red_1)/7;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ for( int i = 2; i < 6; ++i )
|
||||||
|
+ {
|
||||||
|
+ codes[i] = ((6-i)*red_0 + (i-1)*red_1)/5;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ int green_0 = bytes[8];
|
||||||
|
+ int green_1 = bytes[9];
|
||||||
|
+
|
||||||
|
+ codes[0 + 8] = green_0;
|
||||||
|
+ codes[1 + 8] = green_1;
|
||||||
|
+ codes[6 + 8] = 0.0f;
|
||||||
|
+ codes[7 + 8] = 1.0f;
|
||||||
|
+ // generate the midpoints
|
||||||
|
+ if(green_0 > green_1)
|
||||||
|
+ {
|
||||||
|
+ for( int i = 2; i < 8; ++i )
|
||||||
|
+ {
|
||||||
|
+ codes[i + 8] = ((8-i)*green_0 + (i-1)*green_1)/7;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ for( int i = 2; i < 6; ++i )
|
||||||
|
+ {
|
||||||
|
+ codes[i + 8] = ((6-i)*green_0 + (i-1)*green_1)/5;
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ u8 indices[32];
|
||||||
|
+ for( int i = 0; i < 4; ++i )
|
||||||
|
+ {
|
||||||
|
+ u8 packed = bytes[2 + i];
|
||||||
|
+ u8* red_ind = indices + 4*i;
|
||||||
|
+
|
||||||
|
+ red_ind[0] = packed & 0x3;
|
||||||
|
+ red_ind[1] = ( packed >> 2 ) & 0x3;
|
||||||
|
+ red_ind[2] = ( packed >> 4 ) & 0x3;
|
||||||
|
+ red_ind[3] = ( packed >> 6 ) & 0x3;
|
||||||
|
+
|
||||||
|
+ packed = bytes[8 + i];
|
||||||
|
+ u8* green_ind = indices + 4*i + 16;
|
||||||
|
+ green_ind[0] = packed & 0x3;
|
||||||
|
+ green_ind[1] = ( packed >> 2 ) & 0x3;
|
||||||
|
+ green_ind[2] = ( packed >> 4 ) & 0x3;
|
||||||
|
+ green_ind[3] = ( packed >> 6 ) & 0x3;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ // store out the colours
|
||||||
|
+ for( int i = 0; i < 16; ++i )
|
||||||
|
+ {
|
||||||
|
+ rgba[4*i] = codes[indices[i]];
|
||||||
|
+ rgba[4*i +1] = codes[indices[i + 16] + 8];
|
||||||
|
+ rgba[4*i +2] = 0;
|
||||||
|
+ rgba[4*i +3] = 255;
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+// -- GODOT end --
|
||||||
|
+
|
||||||
|
+
|
||||||
|
} // namespace squish
|
||||||
|
diff --git a/thirdparty/squish/colourblock.h b/thirdparty/squish/colourblock.h
|
||||||
|
index fee2cd7c5..3cb9b7e3b 100644
|
||||||
|
--- a/thirdparty/squish/colourblock.h
|
||||||
|
+++ b/thirdparty/squish/colourblock.h
|
||||||
|
@@ -35,6 +35,9 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
|
||||||
|
void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
|
||||||
|
|
||||||
|
void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
|
||||||
|
+// -- GODOT start --
|
||||||
|
+void DecompressColourBc5( u8* rgba, void const* block );
|
||||||
|
+// -- GODOT end --
|
||||||
|
|
||||||
|
} // namespace squish
|
||||||
|
|
||||||
|
diff --git a/thirdparty/squish/squish.cpp b/thirdparty/squish/squish.cpp
|
||||||
|
index 1d22a64ad..fd11a147d 100644
|
||||||
|
--- a/thirdparty/squish/squish.cpp
|
||||||
|
+++ b/thirdparty/squish/squish.cpp
|
||||||
|
@@ -135,7 +135,13 @@ void Decompress( u8* rgba, void const* block, int flags )
|
||||||
|
colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
|
||||||
|
|
||||||
|
// decompress colour
|
||||||
|
- DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
||||||
|
+ // -- GODOT start --
|
||||||
|
+ //DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
||||||
|
+ if(( flags & ( kBc5 ) ) != 0)
|
||||||
|
+ DecompressColourBc5( rgba, colourBlock);
|
||||||
|
+ else
|
||||||
|
+ DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
||||||
|
+ // -- GODOT end --
|
||||||
|
|
||||||
|
// decompress alpha separately if necessary
|
||||||
|
if( ( flags & kDxt3 ) != 0 )
|
||||||
|
--
|
||||||
|
2.13.6
|
||||||
|
|
85
thirdparty/squish/colourblock.cpp
vendored
85
thirdparty/squish/colourblock.cpp
vendored
|
@ -211,4 +211,89 @@ void DecompressColour( u8* rgba, void const* block, bool isDxt1 )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// -- Godot start --
|
||||||
|
void DecompressColourBc5( u8* rgba, void const* block)
|
||||||
|
{
|
||||||
|
// get the block bytes
|
||||||
|
u8 const* bytes = reinterpret_cast< u8 const* >( block );
|
||||||
|
|
||||||
|
// unpack the endpoints
|
||||||
|
u8 codes[16];
|
||||||
|
int red_0 = bytes[0];
|
||||||
|
int red_1 = bytes[1];
|
||||||
|
|
||||||
|
codes[0] = red_0;
|
||||||
|
codes[1] = red_1;
|
||||||
|
codes[6] = 0.0f;
|
||||||
|
codes[7] = 1.0f;
|
||||||
|
// generate the midpoints
|
||||||
|
if(red_0 > red_1)
|
||||||
|
{
|
||||||
|
for( int i = 2; i < 8; ++i )
|
||||||
|
{
|
||||||
|
codes[i] = ((8-i)*red_0 + (i-1)*red_1)/7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( int i = 2; i < 6; ++i )
|
||||||
|
{
|
||||||
|
codes[i] = ((6-i)*red_0 + (i-1)*red_1)/5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int green_0 = bytes[8];
|
||||||
|
int green_1 = bytes[9];
|
||||||
|
|
||||||
|
codes[0 + 8] = green_0;
|
||||||
|
codes[1 + 8] = green_1;
|
||||||
|
codes[6 + 8] = 0.0f;
|
||||||
|
codes[7 + 8] = 1.0f;
|
||||||
|
// generate the midpoints
|
||||||
|
if(green_0 > green_1)
|
||||||
|
{
|
||||||
|
for( int i = 2; i < 8; ++i )
|
||||||
|
{
|
||||||
|
codes[i + 8] = ((8-i)*green_0 + (i-1)*green_1)/7;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for( int i = 2; i < 6; ++i )
|
||||||
|
{
|
||||||
|
codes[i + 8] = ((6-i)*green_0 + (i-1)*green_1)/5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 indices[32];
|
||||||
|
for( int i = 0; i < 4; ++i )
|
||||||
|
{
|
||||||
|
u8 packed = bytes[2 + i];
|
||||||
|
u8* red_ind = indices + 4*i;
|
||||||
|
|
||||||
|
red_ind[0] = packed & 0x3;
|
||||||
|
red_ind[1] = ( packed >> 2 ) & 0x3;
|
||||||
|
red_ind[2] = ( packed >> 4 ) & 0x3;
|
||||||
|
red_ind[3] = ( packed >> 6 ) & 0x3;
|
||||||
|
|
||||||
|
packed = bytes[8 + i];
|
||||||
|
u8* green_ind = indices + 4*i + 16;
|
||||||
|
green_ind[0] = packed & 0x3;
|
||||||
|
green_ind[1] = ( packed >> 2 ) & 0x3;
|
||||||
|
green_ind[2] = ( packed >> 4 ) & 0x3;
|
||||||
|
green_ind[3] = ( packed >> 6 ) & 0x3;
|
||||||
|
}
|
||||||
|
|
||||||
|
// store out the colours
|
||||||
|
for( int i = 0; i < 16; ++i )
|
||||||
|
{
|
||||||
|
rgba[4*i] = codes[indices[i]];
|
||||||
|
rgba[4*i +1] = codes[indices[i + 16] + 8];
|
||||||
|
rgba[4*i +2] = 0;
|
||||||
|
rgba[4*i +3] = 255;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// -- GODOT end --
|
||||||
|
|
||||||
|
|
||||||
} // namespace squish
|
} // namespace squish
|
||||||
|
|
3
thirdparty/squish/colourblock.h
vendored
3
thirdparty/squish/colourblock.h
vendored
|
@ -35,6 +35,9 @@ void WriteColourBlock3( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void*
|
||||||
void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
|
void WriteColourBlock4( Vec3::Arg start, Vec3::Arg end, u8 const* indices, void* block );
|
||||||
|
|
||||||
void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
|
void DecompressColour( u8* rgba, void const* block, bool isDxt1 );
|
||||||
|
// -- GODOT start --
|
||||||
|
void DecompressColourBc5( u8* rgba, void const* block );
|
||||||
|
// -- GODOT end --
|
||||||
|
|
||||||
} // namespace squish
|
} // namespace squish
|
||||||
|
|
||||||
|
|
8
thirdparty/squish/squish.cpp
vendored
8
thirdparty/squish/squish.cpp
vendored
|
@ -135,7 +135,13 @@ void Decompress( u8* rgba, void const* block, int flags )
|
||||||
colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
|
colourBlock = reinterpret_cast< u8 const* >( block ) + 8;
|
||||||
|
|
||||||
// decompress colour
|
// decompress colour
|
||||||
DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
// -- GODOT start --
|
||||||
|
//DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
||||||
|
if(( flags & ( kBc5 ) ) != 0)
|
||||||
|
DecompressColourBc5( rgba, colourBlock);
|
||||||
|
else
|
||||||
|
DecompressColour( rgba, colourBlock, ( flags & kDxt1 ) != 0 );
|
||||||
|
// -- GODOT end --
|
||||||
|
|
||||||
// decompress alpha separately if necessary
|
// decompress alpha separately if necessary
|
||||||
if( ( flags & kDxt3 ) != 0 )
|
if( ( flags & kDxt3 ) != 0 )
|
||||||
|
|
Loading…
Reference in a new issue