diff --git a/MANIFEST.in b/MANIFEST.in index ac7360c93..bc2ab49ad 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -18,54 +18,7 @@ recursive-include PIL *.md recursive-include Scripts *.py recursive-include Scripts *.rst recursive-include Scripts *.sh -recursive-include Tests *.bdf -recursive-include Tests *.bin -recursive-include Tests *.bmp -recursive-include Tests *.bw -recursive-include Tests *.cur -recursive-include Tests *.dcx -recursive-include Tests *.dds -recursive-include Tests *.doc -recursive-include Tests *.eps -recursive-include Tests *.fli -recursive-include Tests *.ggr -recursive-include Tests *.gif -recursive-include Tests *.gpl -recursive-include Tests *.gnuplot -recursive-include Tests *.html -recursive-include Tests *.icc -recursive-include Tests *.icns -recursive-include Tests *.ico -recursive-include Tests *.im -recursive-include Tests *.j2k -recursive-include Tests *.jp2 -recursive-include Tests *.jpg -recursive-include Tests *.lut -recursive-include Tests *.mpo -recursive-include Tests *.msp -recursive-include Tests *.pbm -recursive-include Tests *.pcf -recursive-include Tests *.pcx -recursive-include Tests *.pgm -recursive-include Tests *.pil -recursive-include Tests *.png -recursive-include Tests *.ppm -recursive-include Tests *.psd -recursive-include Tests *.py -recursive-include Tests *.ras -recursive-include Tests *.rgb -recursive-include Tests *.rst -recursive-include Tests *.sgi -recursive-include Tests *.spider -recursive-include Tests *.tar -recursive-include Tests *.tga -recursive-include Tests *.tif -recursive-include Tests *.tiff -recursive-include Tests *.ttf -recursive-include Tests *.txt -recursive-include Tests *.webp -recursive-include Tests *.xbm -recursive-include Tests *.xpm +graft Tests/images recursive-include Tk *.c recursive-include Tk *.rst recursive-include depends *.rst diff --git a/PIL/FtexImagePlugin.py b/PIL/FtexImagePlugin.py new file mode 100644 index 000000000..24e4c0e7d --- /dev/null +++ b/PIL/FtexImagePlugin.py @@ -0,0 +1,97 @@ +""" +A Pillow loader for .ftc and .ftu files (FTEX) +Jerome Leclanche + +The contents of this file are hereby released in the public domain (CC0) +Full text of the CC0 license: + https://creativecommons.org/publicdomain/zero/1.0/ + +Independence War 2: Edge Of Chaos - Texture File Format - 16 October 2001 + +The textures used for 3D objects in Independence War 2: Edge Of Chaos are in a +packed custom format called FTEX. This file format uses file extensions FTC and FTU. +* FTC files are compressed textures (using standard texture compression). +* FTU files are not compressed. +Texture File Format +The FTC and FTU texture files both use the same format, called. This +has the following structure: +{header} +{format_directory} +{data} +Where: +{header} = { u32:magic, u32:version, u32:width, u32:height, u32:mipmap_count, u32:format_count } + +* The "magic" number is "FTEX". +* "width" and "height" are the dimensions of the texture. +* "mipmap_count" is the number of mipmaps in the texture. +* "format_count" is the number of texture formats (different versions of the same texture) in this file. + +{format_directory} = format_count * { u32:format, u32:where } + +The format value is 0 for DXT1 compressed textures and 1 for 24-bit RGB uncompressed textures. +The texture data for a format starts at the position "where" in the file. + +Each set of texture data in the file has the following structure: +{data} = format_count * { u32:mipmap_size, mipmap_size * { u8 } } +* "mipmap_size" is the number of bytes in that mip level. For compressed textures this is the +size of the texture data compressed with DXT1. For 24 bit uncompressed textures, this is 3 * width * height. +Following this are the image bytes for that mipmap level. + +Note: All data is stored in little-Endian (Intel) byte order. +""" + +import struct +from io import BytesIO +from PIL import Image, ImageFile +from PIL.DdsImagePlugin import _dxt1 + + +MAGIC = b"FTEX" +FORMAT_DXT1 = 0 +FORMAT_UNCOMPRESSED = 1 + + +class FtexImageFile(ImageFile.ImageFile): + format = "FTEX" + format_description = "Texture File Format (IW2:EOC)" + + def _open(self): + magic = struct.unpack("