1
0
mirror of https://github.com/mon/ifstools.git synced 2024-11-27 18:40:48 +01:00

DXT1 support

This commit is contained in:
Will Toohey 2020-01-28 21:17:39 +10:00
parent e6c22d7394
commit 52bcf6e822

View File

@ -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]