Описание формата STI


EN RU


 

STСI (Sir-Tech's Crazy Image) формат

by pipetz

 

Формат STСI используется для хранения графических объектов в игре Jagged Alliance 2. Каждый STСI файл может содержать одно или несколько изображений. Изображения кодируются с помощью 16-битного (16bppRGB565) или 8-битного (8bppIndexed) алгоритмов. 16-битные файлы содержат всегда только одно изображение, большая часть их находится в папке LOADSCREENS.

 

 

Заголовок (64 байта, структура STCIHeader)

 

Структура STCIHeader описана в Standard Gaming Platform\imgfmt.h.

 

1-4 байты – буквы “STCI” идентификатор формата.

5-8 байты – исходный размер изображений в байтах. Для файлов содержащих несколько изображений здесь хранится бессмысленное большое число.

9-12 байты – размер изображений в байтах после сжатия.  

13-16 байты – номер прозрачного цвета в палитре, всегда равно 0. Имеет смысл только для 8-битных файлов.

17-20 байты – флаги.

  1 бит – всегда равен 0, назначение неясно (STCI_TRANSPARENT).

  2 бит – всегда равен 0, назначение неясно (STCI_ALPHA).

  3 бит – 1 если файл 16-битный (STCI_RGB).

  4 бит – 1 если файл 8-битный (STCI_INDEXED).

  5 бит – 1 если алгоритм сжатия ZLIB (STCI_ZLIB_COMPRESSED).

  6 бит – 1 если алгоритм сжатия ETRLE (STCI_ETRLE_COMPRESSED).

  7-32 биты – всегда равны 0, не используются.

Повидимому, флаги всегда равны 4, 40 или 41.

  4 – для 16-битных файлов.

  40 – для 8-битных неанимированных файлов.

  41 – для 8-битных анимированных файлов.

21-22 байты – высота изображения в пикселях. Имеет смысл только для 16-битных файлов.

23-24 байты – ширина изображения в пикселях. Имеет смысл только для 16-битных файлов.

 

Значение следующих 20 байт разнится в зависимости от алгоритма кодирования.

 

25-44 байты для 16-битных файлов:

 

25-28 байты – маска красного цвета. Повидимому, всегда равна 63488

(00000000 00000000 11111000 00000000) .

29-32 байты – маска зелёного цвета. Повидимому, всегда равна 2016

(00000000 00000000 00000111 11100000) .

33-36 байты – маска синего цвета. Повидимому, всегда равна 31

(00000000 00000000 00000000 00011111) .

37-40 байты – маска альфа канала. Повидимому, всегда равна 0.

41  байт – глубина красного цвета. Повидимому, всегда равна 5.  

42  байт – глубина зелёного цвета. Повидимому, всегда равна 6.

43 байт – глубина синего цвета. Повидимому, всегда равна 5.

44 байт – глубина альфа канала. Повидимому, всегда равна 0.

Значения масок и глубин цветов соответствует алгоритму кодирования 16bppRGB565.

 

25-44 байты для 8-битных файлов:

 

25-28 байты – число цветов в палитре, повидимому всегда равно 256.

29-30 байты – число изображений в файле.

31 байт – глубина красного цвета. Повидимому, всегда равна 8.

32 байт – глубина зелёного цвета. Повидимому, всегда равна 8.

33 байт – глубина синего цвета. Повидимому, всегда равна 8.

34-44 байты – не используются.

Алгоритм кодирования 8-битных файлов – 8bppIndexed c 24-битной палитрой на 256 цветов.

 

45 байт – глубина цвета. Число бит на пиксель. Равен 8 для  8-битных файлов, и 16 для 16-битных.

46-49 байты – размер данных приложения (Application Data) в байтах. Не равно нулю только для анимированных файлов. Повидимому, всегда равно колличеству изображений умноженное на 16.  

49-64 байты – не используются.

 

Повидимому, существует тип STCI файлов, в которых 46-48 байты не используются размер данных приложения при этом сдвигается на три байта. Возможно это зависит от локализации. В .NET StiEditore используется именно такой порядок байт.

 

 

Изображения

 

В 16-битных файлах после заголовка и до конца файла идут данные изображения закодированые в формате 16bppRGB565.

 

В 8-битных файлах после заголовка файла идут  256 * 3 = 768 байт палитры.

После палитры идут заголовки изображений, которые занимают (кол-во изображений) * 16 байт.

 

 

 

Заголовок изображения(16 байт, структура STCISubImage)

 

Структура STCISubImage описана в Standard Gaming Platform\imgfmt.h.

 

1-4 байты – сдвиг в байтах от начала данных изображений до начала данных данного изображения. Для первого изображения равен 0. Для второго – размер первого и т. д.

5-8 байты – размер данных изображения в байтах.

9-10 байты – смещение левого верхнего угла изображения по горизонтали в пикселях.

11-12 байты – смещение левого верхнего угла  изображения по вертикали в пикселях.

Для анимированных файлов смещения отсчитываются от центра изображения тайла, для неанимироанных от левого верхнего угла изображения тайла.  

13-14 байты – высота изображения в пикселях.

15-16 байты – ширина изображения в пикселях.

 

После заголовков изображений идут данные изображений. Каждый байт соответствует порядковому номеру цвета пикселя в палитре. Данные изображений сжаты алгоритмом сжатия ETRLE, о котором ниже. Алгоритмом сжатия ZLIB, повидимому, не использется.

Неанимированные 8-битные файлы на этом заканчиваются

 

У анимированных файлов есть ещё данные приложения (Application Data). Размер – (кол-во изображений) * 16.  

Данные приложения хранятся в структурах AuxObjectData. Aux - повидимому сокращение от "auxiliary" - вспомогательный.

 

Структура AuxObjectData описана в Standard Gaming Platform\imgfmt.h.

 

Для изображений являющихся началом нового ракурса (направления)

1 байт - ориентация стены (ubWallOrientation). Всегда равен 0.

2 байт - количество тайлов (ubNumberOfTiles). Всегда равен 0.

3-4 байт - координаты объекта в тайлах (usTileLocIndex). Всегда равен 0.

5-7 байты - не используются.

8 байт – текущий кадр (ubCurrentFrame). Всегда равен 0.

9 байт – равен числу изображений в данном ракурсе.

10 байт – флаги.

  1 бит - (AUX_FULL_TILE)

  2 бит - 1 если файл анимироанный (AUX_ANIMATED_TILE)

  3 бит - (AUX_DYNAMIC_TILE)

  4 бит - (AUX_INTERACTIVE_TILE)

  5 бит - (AUX_IGNORES_HEIGHT)

  6 бит - (AUX_USES_LAND_Z )

  7-8 бит - не используются.

Данные приложения есть только у анимированных файлов, флаги всегда равны 2.

11-16 байты – не используются.

 

Для изображений не являющихся началом нового ракурса (направления) все значения равны нулю.

 

 

 

Алгоритм сжатия ETRLE

 

Расшифровка аббривиатуры ETRLE не известна. Последние три буквы вероятно означают Run-Length Encoding.

 

Сжимаемая последовательность разбивается на подпоследовательности нулевых и ненулевых байт.  

Каждая последовательность нулевых байт заменяется на один байт, старший бит которого равен 1. А значение равно 128 плюс число нулей в подпоследовательности.  

Перед каждой последовательностью ненулевых байт ставится служебный байт, старший бит которого равен 0. А значение равно числу байт в подпоследовательности.

Если длина нулевой подпоследовательности более 127, то для её кодирования аналогичным образом используется несколько байт, тоже самое можно сказать и о ненулевых последовательностях.  

В конце каждой строки ставится нулевой байт (признак конца строки).