Difference between revisions of "FF7/TEX format"

From Final Fantasy Inside
< FF7
Jump to navigation Jump to search
my_wiki>Aali
(TEX Texture Data Format for PC by Mirex (Edits by Aali))
my_wiki>Aali
(TEX Texture Data Format for PC by Mirex (Edits by Aali))
Line 26: Line 26:
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x00 </td>
 
0x00 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Version, must be 1, or FF7 won't load the file </td>
 
Version, must be 1, or FF7 won't load the file </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x04 </td>
 
0x04 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x08 </td>
 
0x08 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Color key flag </td>
 
Color key flag </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x0C </td>
 
0x0C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x10 </td>
 
0x10 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x14 </td>
 
0x14 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Minimum bits per color (D3D driver uses these to determine which texture format to convert to on load) </td>
 
Minimum bits per color (D3D driver uses these to determine which texture format to convert to on load) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x18 </td>
 
0x18 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Maximum bits per color </td>
 
Maximum bits per color </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x1C </td>
 
0x1C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Minimum alpha bits </td>
 
Minimum alpha bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x20 </td>
 
0x20 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Maximum alpha bits </td>
 
Maximum alpha bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x24 </td>
 
0x24 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Minimum bits per pixel </td>
 
Minimum bits per pixel </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x28 </td>
 
0x28 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Maximum bits per pixel </td>
 
Maximum bits per pixel </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x2C </td>
 
0x2C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x30 </td>
 
0x30 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of palettes </td>
 
Number of palettes </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x34 </td>
 
0x34 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of colors per palette </td>
 
Number of colors per palette </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x38 </td>
 
0x38 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Bit depth </td>
 
Bit depth </td>
 
</tr>
 
</tr>
Line 179: Line 179:
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x44 </td>
 
0x44 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Pitch or bytes per row, usually ignored and assumed to be bytes per pixel * width </td>
 
Pitch or bytes per row, usually ignored and assumed to be bytes per pixel * width </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x48 </td>
 
0x48 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x4C </td>
 
0x4C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Palette flag (this indicates the presence of a palette) </td>
 
Palette flag (this indicates the presence of a palette) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x50 </td>
 
0x50 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Bits per index, always 0 for non-paletted images </td>
 
Bits per index, always 0 for non-paletted images </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x54 </td>
 
0x54 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Indexed-to-8bit flag, never used in FF7 </td>
 
Indexed-to-8bit flag, never used in FF7 </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x58 </td>
 
0x58 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Palette size, always palettes * colors per palette </td>
 
Palette size, always palettes * colors per palette </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x5C </td>
 
0x5C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of colors per palette (again, may be 0 sometimes, the other value will be used anyway) </td>
 
Number of colors per palette (again, may be 0 sometimes, the other value will be used anyway) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x60 </td>
 
0x60 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Runtime data, ignored on load </td>
 
Runtime data, ignored on load </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x64 </td>
 
0x64 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Bits per pixel </td>
 
Bits per pixel </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x68 </td>
 
0x68 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Bytes per pixel, always use this to determine how much data to read, if this is 1 you read 1 byte per pixel, regardless of bit depth </td>
 
Bytes per pixel, always use this to determine how much data to read, if this is 1 you read 1 byte per pixel, regardless of bit depth </td>
 
</tr>
 
</tr>
Line 275: Line 275:
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x6C </td>
 
0x6C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of red bits </td>
 
Number of red bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x70 </td>
 
0x70 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of green bits </td>
 
Number of green bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x74 </td>
 
0x74 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of blue bits </td>
 
Number of blue bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x78 </td>
 
0x78 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Number of alpha bits </td>
 
Number of alpha bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x7C </td>
 
0x7C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Red bitmask </td>
 
Red bitmask </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x80 </td>
 
0x80 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Green bitmask </td>
 
Green bitmask </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x84 </td>
 
0x84 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Blue bitmask </td>
 
Blue bitmask </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x88 </td>
 
0x88 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Alpha bitmask </td>
 
Alpha bitmask </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x8C </td>
 
0x8C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Red shift </td>
 
Red shift </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x90 </td>
 
0x90 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Green shift </td>
 
Green shift </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x94 </td>
 
0x94 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Blue shift </td>
 
Blue shift </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x98 </td>
 
0x98 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Alpha shift </td>
 
Alpha shift </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0x9C </td>
 
0x9C </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Always 8 - Number of red bits (Not sure what the point of these fields is, they're always ignored anyway) </td>
 
Always 8 - Number of red bits (Not sure what the point of these fields is, they're always ignored anyway) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xA0 </td>
 
0xA0 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
8 - Number of green bits </td>
 
8 - Number of green bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xA4 </td>
 
0xA4 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
8 - Number of blue bits </td>
 
8 - Number of blue bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xA8 </td>
 
0xA8 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
8 - Number of alpha bits </td>
 
8 - Number of alpha bits </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xAC </td>
 
0xAC </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Red max </td>
 
Red max </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xB0 </td>
 
0xB0 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Green max </td>
 
Green max </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xB4 </td>
 
0xB4 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Blue max </td>
 
Blue max </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xB8 </td>
 
0xB8 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Alpha max </td>
 
Alpha max </td>
 
</tr>
 
</tr>
Line 461: Line 461:
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xBC </td>
 
0xBC </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Color key array flag (this indicates the presence of a color key array) </td>
 
Color key array flag (this indicates the presence of a color key array) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xC0 </td>
 
0xC0 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Runtime data </td>
 
Runtime data </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xC4 </td>
 
0xC4 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Reference alpha (more on this later) </td>
 
Reference alpha (more on this later) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xC8 </td>
 
0xC8 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xCC </td>
 
0xCC </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xD0 </td>
 
0xD0 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Palette index (runtime data) </td>
 
Palette index (runtime data) </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xD4 </td>
 
0xD4 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Runtime data </td>
 
Runtime data </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xD8 </td>
 
0xD8 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Runtime data </td>
 
Runtime data </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xDC </td>
 
0xDC </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xE0 </td>
 
0xE0 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
0xE4 </td>
 
0xE4 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
0xE4 </td>
 
<td style="border: 1px solid red;">
 
4 bytes (long) </td>
 
<td style="border: 1px solid red;">
 
Unknown </td>
 
</tr>
 
 
 
<tr>
 
<td style="border: 1px solid red;">
 
 
0xE8 </td>
 
0xE8 </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
4 bytes (long) </td>
 
4 bytes (long) </td>
<td style="border: 1px solid red;">
+
<td style="border: 1px solid black;">
 
Unknown </td>
 
Unknown </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border-style: solid none solid solid; border-color: red; border-width: 1px; vertical-align: top;">
+
<td style="border-style: solid none solid solid; border-color: black; border-width: 1px; vertical-align: top;">
</td><td colspan="2" style="border-style: solid solid solid none; border-color: red; border-width: 1px;">
+
</td><td colspan="2" style="border-style: solid solid solid none; border-color: black; border-width: 1px;">
 
Palette data (ignore this section if palette flag is 0)  </td>
 
Palette data (ignore this section if palette flag is 0)  </td>
 
</tr>
 
</tr>
  
 
<tr>
 
<tr>
<td style="border: 1px solid red; vertical-align: top;">
+
<td style="border: 1px solid black; vertical-align: top;">
 
0xEC </td>
 
0xEC </td>
<td style="border: 1px solid red; vertical-align: top;">
+
<td style="border: 1px solid black; vertical-align: top;">
 
Palette size * 4 </td>
 
Palette size * 4 </td>
<td style="border: 1px solid red; vertical-align: top;">
+
<td style="border: 1px solid black; vertical-align: top;">
 
The raw palette data, always in 32-bit BGRA format</td>
 
The raw palette data, always in 32-bit BGRA format</td>
 
</tr>
 
</tr>

Revision as of 18:59, 29 June 2009

TEX Texture Data Format for PC by Mirex (Edits by Aali)

FF7 PC texture consists of header, an optional palette and bitmap data. Usually data are stored like palletized picture, with bitmap pixels referencing to palette. Color 0 (in palette its usually black) is usually used as transparent color.

Pixel values of 0 may or may not be transparent, depending on the color key status, more on that later. This also applies to non-paletted formats.

When bit depth is 16 then data are stored as packed RGB in style RGB555, which means 5 bits per color in one 2 byte entry. I'm not sure if it is used in FF7 at all, its probably used in FF8.

The tex format is actually very flexible and can take almost any non-paletted format as long as you describe it properly in the header.

Offset Size Description
Header
0x00 4 bytes (long) Version, must be 1, or FF7 won't load the file
0x04 4 bytes (long) Unknown
0x08 4 bytes (long) Color key flag
0x0C 4 bytes (long) Unknown
0x10 4 bytes (long) Unknown
0x14 4 bytes (long) Minimum bits per color (D3D driver uses these to determine which texture format to convert to on load)
0x18 4 bytes (long) Maximum bits per color
0x1C 4 bytes (long) Minimum alpha bits
0x20 4 bytes (long) Maximum alpha bits
0x24 4 bytes (long) Minimum bits per pixel
0x28 4 bytes (long) Maximum bits per pixel
0x2C 4 bytes (long) Unknown
0x30 4 bytes (long) Number of palettes
0x34 4 bytes (long) Number of colors per palette
0x38 4 bytes (long) Bit depth
0x3C 4 bytes (long) Image Width
0x40 4 bytes (long) Image Height
0x44 4 bytes (long) Pitch or bytes per row, usually ignored and assumed to be bytes per pixel * width
0x48 4 bytes (long) Unknown
0x4C 4 bytes (long) Palette flag (this indicates the presence of a palette)
0x50 4 bytes (long) Bits per index, always 0 for non-paletted images
0x54 4 bytes (long) Indexed-to-8bit flag, never used in FF7
0x58 4 bytes (long) Palette size, always palettes * colors per palette
0x5C 4 bytes (long) Number of colors per palette (again, may be 0 sometimes, the other value will be used anyway)
0x60 4 bytes (long) Runtime data, ignored on load
0x64 4 bytes (long) Bits per pixel
0x68 4 bytes (long) Bytes per pixel, always use this to determine how much data to read, if this is 1 you read 1 byte per pixel, regardless of bit depth
Pixel format (all 0 for paletted images)
0x6C 4 bytes (long) Number of red bits
0x70 4 bytes (long) Number of green bits
0x74 4 bytes (long) Number of blue bits
0x78 4 bytes (long) Number of alpha bits
0x7C 4 bytes (long) Red bitmask
0x80 4 bytes (long) Green bitmask
0x84 4 bytes (long) Blue bitmask
0x88 4 bytes (long) Alpha bitmask
0x8C 4 bytes (long) Red shift
0x90 4 bytes (long) Green shift
0x94 4 bytes (long) Blue shift
0x98 4 bytes (long) Alpha shift
0x9C 4 bytes (long) Always 8 - Number of red bits (Not sure what the point of these fields is, they're always ignored anyway)
0xA0 4 bytes (long) 8 - Number of green bits
0xA4 4 bytes (long) 8 - Number of blue bits
0xA8 4 bytes (long) 8 - Number of alpha bits
0xAC 4 bytes (long) Red max
0xB0 4 bytes (long) Green max
0xB4 4 bytes (long) Blue max
0xB8 4 bytes (long) Alpha max
End of pixel format
0xBC 4 bytes (long) Color key array flag (this indicates the presence of a color key array)
0xC0 4 bytes (long) Runtime data
0xC4 4 bytes (long) Reference alpha (more on this later)
0xC8 4 bytes (long) Unknown
0xCC 4 bytes (long) Unknown
0xD0 4 bytes (long) Palette index (runtime data)
0xD4 4 bytes (long) Runtime data
0xD8 4 bytes (long) Runtime data
0xDC 4 bytes (long) Unknown
0xE0 4 bytes (long) Unknown
0xE4 4 bytes (long) Unknown
0xE8 4 bytes (long) Unknown
Palette data (ignore this section if palette flag is 0)
0xEC Palette size * 4 The raw palette data, always in 32-bit BGRA format
Pixel data
Varies Read width * height * "bytes per pixel" bytes of data. If there's a palette, every pixel is an index into that palette, otherwise use the pixel format specification.
Color key array
Varies

Number of palettes * 1 bytes.

Color keying: If the color key flag is zero, no color keying is performed and the color key array is ignored. Otherwise, the current palette index is used to retrieve a single byte from the color key array, this is the new color key flag, zero means don't do color keying. If there is no color key array (and the color key flag is not zero), you should always color key.

Reference alpha: Only applies to paletted images, if the alpha value sampled from the palette is 0xFE, this value should be replaced with the reference alpha.