mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-11-11 12:17:14 +03:00
Fix BC6H_SF decoder
This commit is contained in:
parent
b7715d1600
commit
18a3c249b6
|
@ -101,6 +101,8 @@ DXGI_FORMAT_R8G8B8A8_UNORM_SRGB = 29
|
||||||
DXGI_FORMAT_BC5_TYPELESS = 82
|
DXGI_FORMAT_BC5_TYPELESS = 82
|
||||||
DXGI_FORMAT_BC5_UNORM = 83
|
DXGI_FORMAT_BC5_UNORM = 83
|
||||||
DXGI_FORMAT_BC5_SNORM = 84
|
DXGI_FORMAT_BC5_SNORM = 84
|
||||||
|
DXGI_FORMAT_BC6H_UF16 = 95
|
||||||
|
DXGI_FORMAT_BC6H_SF16 = 96
|
||||||
DXGI_FORMAT_BC7_TYPELESS = 97
|
DXGI_FORMAT_BC7_TYPELESS = 97
|
||||||
DXGI_FORMAT_BC7_UNORM = 98
|
DXGI_FORMAT_BC7_UNORM = 98
|
||||||
DXGI_FORMAT_BC7_UNORM_SRGB = 99
|
DXGI_FORMAT_BC7_UNORM_SRGB = 99
|
||||||
|
@ -173,6 +175,14 @@ class DdsImageFile(ImageFile.ImageFile):
|
||||||
self.pixel_format = "BC5S"
|
self.pixel_format = "BC5S"
|
||||||
n = 5
|
n = 5
|
||||||
self.mode = "RGB"
|
self.mode = "RGB"
|
||||||
|
elif dxgi_format == DXGI_FORMAT_BC6H_UF16:
|
||||||
|
self.pixel_format = "BC6"
|
||||||
|
n = 6
|
||||||
|
self.mode = "RGB"
|
||||||
|
elif dxgi_format == DXGI_FORMAT_BC6H_SF16:
|
||||||
|
self.pixel_format = "BC6S"
|
||||||
|
n = 6
|
||||||
|
self.mode = "RGB"
|
||||||
elif dxgi_format in (DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM):
|
elif dxgi_format in (DXGI_FORMAT_BC7_TYPELESS, DXGI_FORMAT_BC7_UNORM):
|
||||||
self.pixel_format = "BC7"
|
self.pixel_format = "BC7"
|
||||||
n = 7
|
n = 7
|
||||||
|
|
|
@ -379,8 +379,7 @@ PyImaging_BcnDecoderNew(PyObject *self, PyObject *args) {
|
||||||
actual = "RGB";
|
actual = "RGB";
|
||||||
break;
|
break;
|
||||||
case 6: /* BC6: 3-channel 16-bit float */
|
case 6: /* BC6: 3-channel 16-bit float */
|
||||||
/* TODO: support 4-channel floating point images */
|
actual = "RGB";
|
||||||
actual = "RGBAF";
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
PyErr_SetString(PyExc_ValueError, "block compression type unknown");
|
PyErr_SetString(PyExc_ValueError, "block compression type unknown");
|
||||||
|
|
|
@ -23,10 +23,6 @@ typedef struct {
|
||||||
UINT8 l;
|
UINT8 l;
|
||||||
} lum;
|
} lum;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
FLOAT32 r, g, b;
|
|
||||||
} rgb32f;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
UINT16 c0, c1;
|
UINT16 c0, c1;
|
||||||
UINT32 lut;
|
UINT32 lut;
|
||||||
|
@ -536,53 +532,53 @@ static const bc6_mode_info bc6_modes[] = {
|
||||||
|
|
||||||
/* Table.F, encoded as a sequence of bit indices */
|
/* Table.F, encoded as a sequence of bit indices */
|
||||||
static const UINT8 bc6_bit_packings[][75] = {
|
static const UINT8 bc6_bit_packings[][75] = {
|
||||||
{116, 132, 176, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17,
|
{116, 132, 180, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17,
|
||||||
18, 19, 20, 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38,
|
18, 19, 20, 21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38,
|
||||||
39, 40, 41, 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65,
|
39, 40, 41, 48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65,
|
||||||
66, 67, 68, 172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128,
|
66, 67, 68, 176, 160, 161, 162, 163, 80, 81, 82, 83, 84, 177, 128,
|
||||||
129, 130, 131, 96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175},
|
129, 130, 131, 96, 97, 98, 99, 100, 178, 144, 145, 146, 147, 148, 179},
|
||||||
{117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 172, 173, 132, 16, 17,
|
{117, 164, 165, 0, 1, 2, 3, 4, 5, 6, 176, 177, 132, 16, 17,
|
||||||
18, 19, 20, 21, 22, 133, 174, 116, 32, 33, 34, 35, 36, 37, 38,
|
18, 19, 20, 21, 22, 133, 178, 116, 32, 33, 34, 35, 36, 37, 38,
|
||||||
175, 177, 176, 48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65,
|
179, 181, 180, 48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65,
|
||||||
66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128,
|
66, 67, 68, 69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128,
|
||||||
129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
129, 130, 131, 96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
||||||
48, 49, 50, 51, 52, 10, 112, 113, 114, 115, 64, 65, 66, 67, 26,
|
48, 49, 50, 51, 52, 10, 112, 113, 114, 115, 64, 65, 66, 67, 26,
|
||||||
172, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, 128, 129, 130, 131,
|
176, 160, 161, 162, 163, 80, 81, 82, 83, 42, 177, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175},
|
96, 97, 98, 99, 100, 178, 144, 145, 146, 147, 148, 179},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
||||||
48, 49, 50, 51, 10, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
48, 49, 50, 51, 10, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 173, 128, 129, 130, 131,
|
26, 160, 161, 162, 163, 80, 81, 82, 83, 42, 177, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 172, 174, 144, 145, 146, 147, 116, 175},
|
96, 97, 98, 99, 176, 178, 144, 145, 146, 147, 116, 179},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
21, 22, 23, 24, 25, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41,
|
||||||
48, 49, 50, 51, 10, 132, 112, 113, 114, 115, 64, 65, 66, 67, 26,
|
48, 49, 50, 51, 10, 132, 112, 113, 114, 115, 64, 65, 66, 67, 26,
|
||||||
172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, 128, 129, 130, 131,
|
176, 160, 161, 162, 163, 80, 81, 82, 83, 84, 42, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 173, 174, 144, 145, 146, 147, 176, 175},
|
96, 97, 98, 99, 177, 178, 144, 145, 146, 147, 180, 179},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 8, 132, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 24, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 176,
|
21, 22, 23, 24, 116, 32, 33, 34, 35, 36, 37, 38, 39, 40, 180,
|
||||||
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131,
|
176, 160, 161, 162, 163, 80, 81, 82, 83, 84, 177, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175},
|
96, 97, 98, 99, 100, 178, 144, 145, 146, 147, 148, 179},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 164, 132, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 174, 116, 32, 33, 34, 35, 36, 37, 38, 39, 175, 176,
|
21, 22, 23, 178, 116, 32, 33, 34, 35, 36, 37, 38, 39, 179, 180,
|
||||||
48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131,
|
176, 160, 161, 162, 163, 80, 81, 82, 83, 84, 177, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 172, 132, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 176, 132, 16, 17, 18, 19, 20,
|
||||||
21, 22, 23, 117, 116, 32, 33, 34, 35, 36, 37, 38, 39, 165, 176,
|
21, 22, 23, 117, 116, 32, 33, 34, 35, 36, 37, 38, 39, 165, 180,
|
||||||
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
|
||||||
69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 173, 128, 129, 130, 131,
|
|
||||||
96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175},
|
|
||||||
{0, 1, 2, 3, 4, 5, 6, 7, 173, 132, 16, 17, 18, 19, 20,
|
|
||||||
21, 22, 23, 133, 116, 32, 33, 34, 35, 36, 37, 38, 39, 177, 176,
|
|
||||||
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
172, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131,
|
69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 177, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 100, 174, 144, 145, 146, 147, 148, 175},
|
96, 97, 98, 99, 100, 178, 144, 145, 146, 147, 148, 179},
|
||||||
{0, 1, 2, 3, 4, 5, 164, 172, 173, 132, 16, 17, 18, 19, 20,
|
{0, 1, 2, 3, 4, 5, 6, 7, 177, 132, 16, 17, 18, 19, 20,
|
||||||
21, 117, 133, 174, 116, 32, 33, 34, 35, 36, 37, 165, 175, 177, 176,
|
21, 22, 23, 133, 116, 32, 33, 34, 35, 36, 37, 38, 39, 181, 180,
|
||||||
|
48, 49, 50, 51, 52, 164, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
|
176, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131,
|
||||||
|
96, 97, 98, 99, 100, 178, 144, 145, 146, 147, 148, 179},
|
||||||
|
{0, 1, 2, 3, 4, 5, 164, 176, 177, 132, 16, 17, 18, 19, 20,
|
||||||
|
21, 117, 133, 178, 116, 32, 33, 34, 35, 36, 37, 165, 179, 181, 180,
|
||||||
48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
48, 49, 50, 51, 52, 53, 112, 113, 114, 115, 64, 65, 66, 67, 68,
|
||||||
69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131,
|
69, 160, 161, 162, 163, 80, 81, 82, 83, 84, 85, 128, 129, 130, 131,
|
||||||
96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
96, 97, 98, 99, 100, 101, 144, 145, 146, 147, 148, 149},
|
||||||
|
@ -681,20 +677,36 @@ bc6_finalize(int v, int sign) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static UINT8
|
||||||
|
bc6_clamp(float value) {
|
||||||
|
if (value < 0.0f) {
|
||||||
|
return 0;
|
||||||
|
} else if (value > 1.0f) {
|
||||||
|
return 255;
|
||||||
|
} else {
|
||||||
|
return (UINT8) (value * 255.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static float
|
||||||
|
bc6_gamma_correct(float value, float gamma) {
|
||||||
|
return powf(1.0f - expf(-value), 1.0f / gamma);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
bc6_lerp(rgb32f *col, int *e0, int *e1, int s, int sign) {
|
bc6_lerp(rgba *col, int *e0, int *e1, int s, int sign) {
|
||||||
int r, g, b;
|
int r, g, b;
|
||||||
int t = 64 - s;
|
int t = 64 - s;
|
||||||
r = (e0[0] * t + e1[0] * s) >> 6;
|
r = (e0[0] * t + e1[0] * s) >> 6;
|
||||||
g = (e0[1] * t + e1[1] * s) >> 6;
|
g = (e0[1] * t + e1[1] * s) >> 6;
|
||||||
b = (e0[2] * t + e1[2] * s) >> 6;
|
b = (e0[2] * t + e1[2] * s) >> 6;
|
||||||
col->r = bc6_finalize(r, sign);
|
col->r = bc6_clamp(bc6_gamma_correct(bc6_finalize(r, sign), 2.2f));
|
||||||
col->g = bc6_finalize(g, sign);
|
col->g = bc6_clamp(bc6_gamma_correct(bc6_finalize(g, sign), 2.2f));
|
||||||
col->b = bc6_finalize(b, sign);
|
col->b = bc6_clamp(bc6_gamma_correct(bc6_finalize(b, sign), 2.2f));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
decode_bc6_block(rgb32f *col, const UINT8 *src, int sign) {
|
decode_bc6_block(rgba *col, const UINT8 *src, int sign) {
|
||||||
UINT16 endpoints[12]; /* storage for r0, g0, b0, r1, ... */
|
UINT16 endpoints[12]; /* storage for r0, g0, b0, r1, ... */
|
||||||
int ueps[12];
|
int ueps[12];
|
||||||
int i, i0, ib2, di, dw, mask, numep, s;
|
int i, i0, ib2, di, dw, mask, numep, s;
|
||||||
|
@ -744,7 +756,7 @@ decode_bc6_block(rgb32f *col, const UINT8 *src, int sign) {
|
||||||
}
|
}
|
||||||
if (sign || info->tr) { /* sign-extend e1,2,3 if signed or deltas */
|
if (sign || info->tr) { /* sign-extend e1,2,3 if signed or deltas */
|
||||||
for (i = 3; i < numep; i += 3) {
|
for (i = 3; i < numep; i += 3) {
|
||||||
bc6_sign_extend(&endpoints[i + 0], info->rb);
|
bc6_sign_extend(&endpoints[i], info->rb);
|
||||||
bc6_sign_extend(&endpoints[i + 1], info->gb);
|
bc6_sign_extend(&endpoints[i + 1], info->gb);
|
||||||
bc6_sign_extend(&endpoints[i + 2], info->bb);
|
bc6_sign_extend(&endpoints[i + 2], info->bb);
|
||||||
}
|
}
|
||||||
|
@ -857,8 +869,8 @@ decode_bcn(
|
||||||
break;
|
break;
|
||||||
case 6:
|
case 6:
|
||||||
while (bytes >= 16) {
|
while (bytes >= 16) {
|
||||||
rgb32f col[16];
|
rgba col[16];
|
||||||
decode_bc6_block(col, ptr, (state->state >> 4) & 1);
|
decode_bc6_block(col, ptr, strcmp(pixel_format, "BC6S") == 0 ? 1 : 0);
|
||||||
put_block(im, state, (const char *)col, sizeof(col[0]), C);
|
put_block(im, state, (const char *)col, sizeof(col[0]), C);
|
||||||
ptr += 16;
|
ptr += 16;
|
||||||
bytes -= 16;
|
bytes -= 16;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user