Image Interlacing
Pixel-Data for all texture formats appears to have the same interlacing mechanism.
The data is divided into 16x8 pixel-chunks, but is arranged in a strange sort of way:
ABCD MNOP YZ...
EFGH QRST ...
IJKL UVWX ...
Then reading each chunk (in that order), grab rows of 16-pixels (like 8 scanlines, top to bottom of chunk) and plot them like so:
1, 17, 33, 49, 5, 21, 37, 53, 9, 25, 41, 57, 13, 29, 45, 61,
2, 18, 34, 50, 6, 22, 38, 54, 10, 26, 42, 58, 14, 30, 46, 62,
3, 19, 35, 51, 7, 23, 39, 55, 11, 27, 43, 59, 15, 31, 47, 63,
4 20, 36, 52, 8, 24, 40, 56, 12, 28, 44, 60, 16, 32, 48, 64
Interlacing is exactly the same, except that the interlacing in columns (numbered above: 1,17,33,49, 5,21,37,53, … ) is determined by the width of the image.
So,
if width = 512, then you get 4 interlaced columns
if width = 256, then you get 2 interlaced columns
if width = 128, then you get 1 interlaced column
(ie, divide image width by 128)
Known FF7:CC Image Formats
Note that the Pixel-data is interlaced for all of these formats, as described above.
IMG Format
Stub
[IMG] contain multiple palletted Images, perhaps sprites or HUD images.
The image palettes are 32bit format R8G8B8A8. Palettes for textures are fairly easy to notice because the alpha channel is pretty much all the time fully solid. For sprites it is slightly harder as they use alot of transparency. – Zande
TEX Format
Note: the FF7:CC [TEX] format is NOT the same as the FF7 PC TEX format.
[TEX] Files are Texture images used by Models, frequently found embedded within [ATEL] and [!] files which use them.
Header: 48 bytes [upto 0x2f]
0x00 magic "TEX"
0x1C DWORD: size Width
0x20 DWORD: size height
Pixel Data: 0x30 offset
(Width * Height) number of bytes, 1 byte per-pixel index (to pallete entry color, below)
Pallete data: (immedietly following Pixel data)
16 bytes of mostly zeros (don't seem important)
255 4-byte chunks [RGBA] (per pallete entry)
GT Format
[GT] Files are Chapter End images, dispersed throughout the [ATEL] Event files in-line with when they are displayed during gameplay.
The “Format-Byte”: - for GT files, this is always “4” = 256 colours and 1-BpP.
For the GT files, the 4th byte in the header tells the colour depth format, if this byte is 3 the palette has 16 colours and 1 nibble per pixel. If the byte has a value of 4, there’s 256 colours and 1 byte per pixel – Zande
Header: 16 bytes
0x00 DWORD: magic "GT"
0x04 format-byte [see notes]
0x08 width (pixels)
0x10 height (pixels)
Pallete Data: start offset = 0x10
255 [RGBA] 4-byte chunks
Pixel Data: immedietly following Pallete [start offset = 0x410]
width * height bytes (index to pallete entry)