1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
Ë
³òúhAãó
—dZddlmZddlZddlmZddlmZddlm    Z    m
Z
dZ Gd    „d
e«Z Gd „d e
j«Z dd „Ze    je j e e«e    j"e j ddg«y)a 
A Pillow loader for .ftc and .ftu files (FTEX)
Jerome Leclanche <jerome@leclan.ch>
 
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. 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.
é)Ú annotationsN)ÚIntEnum)ÚBytesIOé)ÚImageÚ    ImageFilesFTEXcó—eZdZdZdZy)ÚFormatrrN)Ú__name__Ú
__module__Ú __qualname__ÚDXT1Ú UNCOMPRESSED©óúFH:\Change_password\venv_build\Lib\site-packages\PIL/FtexImagePlugin.pyr
r
As „Ø €D؁Lrr
có$—eZdZdZdZdd„Zdd„Zy)Ú FtexImageFileÚFTEXzTexture File Format (IW2:EOC)cón—t|jjd««s d}t|«‚t    j
d|jjd««t    j
d|jjd««|_t    j
d|jjd««\}}|dk(sJ‚t    j
d|jjd««\}}|jj|«t    j
d|jjd««\}|jj|«}|tjk(r3d|_
tjdd    |jzd
d «g|_n_|tjk(r3d |_
tjd d    |jzd
d «g|_ndt!|«›}t#|«‚|jj%«t'|«|_y)Néznot an FTEX filez<iz<2iérÚRGBAÚbcn)rrr)rÚRGBÚrawz$Invalid texture compression format: )Ú_acceptÚfpÚreadÚ SyntaxErrorÚstructÚunpackÚ_sizeÚseekr
rÚ_moderÚ_TileÚsizeÚtilerÚreprÚ
ValueErrorÚcloser)ÚselfÚmsgÚ mipmap_countÚ format_countÚformatÚwhereÚ mipmap_sizeÚdatas        rÚ_openzFtexImageFile._openJs€Üt—w‘w—|‘| A“Ô'Ø$ˆCܘcÓ"Ð "܏ ‰ d˜DŸG™GŸL™L¨›OÔ,Ü—]‘] 5¨$¯'©'¯,©,°q«/Ó:ˆŒ
Ü%+§]¡]°5¸$¿'¹'¿,¹,Àq»/Ó%JÑ"ˆ lð˜qÒ Ð Ð äŸ ™  e¨T¯W©W¯\©\¸!«_Ó=‰ ˆØ ‰ ‰ UÔÜŸ™ t¨T¯W©W¯\©\¸!«_Ó=‰ˆàw‰w|‰|˜KÓ(ˆà ”V—[‘[Ò  ØˆDŒJÜ"Ÿ™¨°¸¿¹Ñ0BÀAÀtÓLÐMˆDIØ ”v×*Ñ*Ò *؈DŒJÜ"Ÿ™¨°¸¿¹Ñ0BÀAÀuÓMÐNˆDIà8¼¸f»¸ÐGˆCܘS“/Ð !à ‰ ‰ ŒÜ˜$“-ˆrcó—y©Nr)r,Úposs  rÚ    load_seekzFtexImageFile.load_seekis€Ø rN)ÚreturnÚNone)r7Úintr9r:)r r r r0Úformat_descriptionr4r8rrrrrFs„Ø €FØ8Ðó ô> rrcó,—|jt«Sr6)Ú
startswithÚMAGIC)Úprefixs rrrms€Ø × Ñ œUÓ #Ð#rz.ftcz.ftu)r@Úbytesr9Úbool)Ú__doc__Ú
__future__rr!ÚenumrÚiorÚrrr?r
rrÚ register_openr0Úregister_extensionsrrrú<module>rJs~ðñ3õj#ã ÝÝçà€ôˆWôô
$ I×'Ñ'ô$ óN$ð€×ѐM×(Ñ(¨-¸ÔAØ€×ј-×.Ñ.°¸Ð0@ÕAr