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, то для её кодирования аналогичным образом используется несколько байт, тоже самое можно сказать и о ненулевых последовательностях.
В конце каждой строки ставится нулевой байт (признак конца строки).
Comments (0)
You don't have permission to comment on this page.