mirror of
https://github.com/mon/ifstools.git
synced 2024-11-27 18:40:48 +01:00
DXT1 support
This commit is contained in:
parent
e6c22d7394
commit
52bcf6e822
@ -6,14 +6,17 @@ from tqdm import tqdm
|
|||||||
|
|
||||||
# header for a standard DDS with DXT5 compression and RGBA pixels
|
# header for a standard DDS with DXT5 compression and RGBA pixels
|
||||||
# gap placed for image height/width insertion
|
# gap placed for image height/width insertion
|
||||||
dxt5_start = b'DDS |\x00\x00\x00\x07\x10\x00\x00'
|
dxt_start = b'DDS |\x00\x00\x00\x07\x10\x00\x00'
|
||||||
dxt5_end = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
dxt_middle = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x04' + \
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
||||||
b'\x00\x00\x00DXT5\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \x00\x00\x00\x04' + \
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00' + \
|
b'\x00\x00\x00'
|
||||||
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
|
||||||
|
dxt_end = b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' + \
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00' + \
|
||||||
|
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
|
||||||
|
|
||||||
def check_size(ifs_img, data, bytes_per_pixel):
|
def check_size(ifs_img, data, bytes_per_pixel):
|
||||||
need = ifs_img.img_size[0] * ifs_img.img_size[1] * bytes_per_pixel
|
need = ifs_img.img_size[0] * ifs_img.img_size[1] * bytes_per_pixel
|
||||||
@ -36,11 +39,13 @@ def decode_argb4444(ifs_img, data):
|
|||||||
r, g, b, a = im.split()
|
r, g, b, a = im.split()
|
||||||
return Image.merge('RGBA', (b, g, r, a))
|
return Image.merge('RGBA', (b, g, r, a))
|
||||||
|
|
||||||
def decode_dxt5(ifs_img, data):
|
def decode_dxt(ifs_img, data, version):
|
||||||
b = BytesIO()
|
b = BytesIO()
|
||||||
b.write(dxt5_start)
|
b.write(dxt_start)
|
||||||
b.write(pack('<2I', ifs_img.img_size[1], ifs_img.img_size[0]))
|
b.write(pack('<2I', ifs_img.img_size[1], ifs_img.img_size[0]))
|
||||||
b.write(dxt5_end)
|
b.write(dxt_middle)
|
||||||
|
b.write(version)
|
||||||
|
b.write(dxt_end)
|
||||||
# the data has swapped endianness for every WORD
|
# the data has swapped endianness for every WORD
|
||||||
l = len(data)//2
|
l = len(data)//2
|
||||||
big = unpack('>{}H'.format(l), data)
|
big = unpack('>{}H'.format(l), data)
|
||||||
@ -48,11 +53,18 @@ def decode_dxt5(ifs_img, data):
|
|||||||
b.write(little)
|
b.write(little)
|
||||||
return Image.open(b)
|
return Image.open(b)
|
||||||
|
|
||||||
|
def decode_dxt5(ifs_img, data):
|
||||||
|
return decode_dxt(ifs_img, data, b'DXT5')
|
||||||
|
|
||||||
|
def decode_dxt1(ifs_img, data):
|
||||||
|
return decode_dxt(ifs_img, data, b'DXT1')
|
||||||
|
|
||||||
|
|
||||||
image_formats = {
|
image_formats = {
|
||||||
'argb8888rev' : {'decoder': decode_argb8888rev, 'encoder': encode_argb8888rev},
|
'argb8888rev' : {'decoder': decode_argb8888rev, 'encoder': encode_argb8888rev},
|
||||||
'argb4444' : {'decoder': decode_argb4444, 'encoder': None},
|
'argb4444' : {'decoder': decode_argb4444, 'encoder': None},
|
||||||
'dxt5' : {'decoder': decode_dxt5, 'encoder': None}
|
'dxt1' : {'decoder': decode_dxt1, 'encoder': None},
|
||||||
|
'dxt5' : {'decoder': decode_dxt5, 'encoder': None},
|
||||||
}
|
}
|
||||||
|
|
||||||
cachable_formats = [key for key, val in image_formats.items() if val['encoder'] is not None]
|
cachable_formats = [key for key, val in image_formats.items() if val['encoder'] is not None]
|
||||||
|
Loading…
Reference in New Issue
Block a user