finally
This commit is contained in:
122
FORMAT.md
Normal file
122
FORMAT.md
Normal file
@@ -0,0 +1,122 @@
|
||||
# Спецификация формата `.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
|
||||
```
|
||||
Reference in New Issue
Block a user