# Спецификация формата `.minint` (версия 1) ## Общие сведения - Все многобайтовые целые числа — **little-endian**. - Строки — **UTF-8**, с префиксом длины 1 байт (макс. 255 байт). - Формат не использует сжатие — данные хранятся как есть. ## Структура файла ``` ┌──────────────────────────┐ │ Container Header │ 28 байт (фиксированный) ├──────────────────────────┤ │ Document 1 │ (блок переменной длины) ├──────────────────────────┤ │ Document 2 │ ├──────────────────────────┤ │ ... │ ├──────────────────────────┤ │ Document N │ └──────────────────────────┘ ``` ## Container Header (28 байт) | Смещение | Размер | Тип | Описание | |----------|--------|--------|---------------------------------| | 0 | 6 | ASCII | Сигнатура: `MININT` | | 6 | 2 | uint16 | Версия формата (текущая: `1`) | | 8 | 4 | uint32 | Ширина (Width) | | 12 | 4 | uint32 | Высота (Height) | | 16 | 4 | uint32 | Количество документов | | 20 | 8 | — | Зарезервировано (нули) | ## Блок документа Повторяется `DocumentCount` раз, последовательно. ### Заголовок документа | Размер | Тип | Описание | |---------------------|--------|-----------------------------| | 1 | uint8 | Длина имени (NameLen) | | NameLen | UTF-8 | Имя документа | | 4 | uint32 | FrameDelayMs | | 4 | uint32 | Количество цветов (PalCnt) | ### Палитра `PalCnt × 4` байт. Каждый цвет: `[R, G, B, A]` (по 1 байту). Индекс 0 всегда соответствует прозрачному цвету `(0, 0, 0, 0)`. ### Ширина индекса Вычисляется из `PalCnt` (не хранится в файле явно): | PalCnt | Байт на индекс | |---------------------|-----------------| | 1 – 255 | 1 | | 256 – 65 535 | 2 | | 65 536 – 16 777 215 | 3 | | 16 777 216+ | 4 | ### Количество слоёв | Размер | Тип | Описание | |--------|--------|-------------------| | 4 | uint32 | Количество слоёв | ### Блок слоя Повторяется `LayerCount` раз. | Размер | Тип | Описание | |---------------------------|-------|------------------------------------| | 1 | uint8 | Длина имени слоя (LayerNameLen) | | LayerNameLen | UTF-8 | Имя слоя | | 1 | uint8 | Видимость (0 = скрыт, 1 = виден) | | 1 | uint8 | Opacity (0–255) | | Width × Height × ByteWidth | bytes | Индексы палитры, row-major, LE | ## Правила валидации 1. Сигнатура — строго `MININT` (6 байт ASCII). 2. Версия — строго `1` (неизвестные версии отклоняются). 3. Width, Height >= 1; максимум 65 536. 4. DocumentCount >= 1. 5. PaletteCount >= 1. 6. Каждый индекс пикселя < PaletteCount. 7. IsVisible — только 0 или 1. 8. Зарезервированные байты — допускаются ненулевые (forward compatibility). 9. Неожиданный конец файла — ошибка с описанием контекста. ## Пример Контейнер 4×4, 1 документ, 2 цвета (прозрачный + красный), 1 слой: ``` 4D 49 4E 49 4E 54 — "MININT" 01 00 — version 1 04 00 00 00 — width = 4 04 00 00 00 — height = 4 01 00 00 00 — 1 document 00 00 00 00 00 00 00 00 — reserved 05 — name length = 5 44 6F 63 20 31 — "Doc 1" 64 00 00 00 — FrameDelayMs = 100 02 00 00 00 — palette count = 2 00 00 00 00 — color 0: transparent FF 00 00 FF — color 1: red (R=255, G=0, B=0, A=255) 01 00 00 00 — 1 layer 07 — layer name length = 7 4C 61 79 65 72 20 31 — "Layer 1" 01 — visible FF — opacity = 255 00 00 00 00 00 00 00 00 — 16 pixels, all index 0 (transparent) 00 00 00 00 00 00 00 00 ```