# Лабораторная работа 2
## Способы и средства хранения и обработки графических данных
### Вариант ИВ1: разработка растрового редактора

## 1. Цель и практический результат

Цель работы - разработать растровый редактор, выполняющий создание, загрузку, редактирование и сохранение графического контейнера с пиксельными данными, а также реализовать базовые инструменты рисования и редактирования фрагментов.

Практический результат:

- разработано настольное приложение `Minint` на `C#` + `Avalonia`;
- реализован собственный бинарный формат контейнера `.minint` с чтением/записью;
- реализованы инструменты `Brush`, `Eraser`, `Fill`, `Select`, `Copy/Cut/Paste`;
- подготовлена документация с UML-диаграммами и приложением исходного кода.

![Скриншот ПО](Screenshot.png)

## 2. Соответствие варианту ИВ1 и замечание по структуре контейнера

По методическим указаниям ИВ1 требуется использовать структуру пикселя и контейнера из одного из вариантов `КВ1–КВ4`.

В текущем проекте фактически реализован палитровый контейнер с `RGBA`-палитрой и индексами пикселей (`MinintContainer`/`MinintDocument`/`MinintLayer`), что не совпадает буквально с описаниями `КВ1–КВ4`, но полностью закрывает функциональные требования ИВ1 (создание, редактирование, загрузка, сохранение, инструменты рисования, работа с фрагментами).

Это ограничение фиксируется в отчёте явно, чтобы не было расхождения между кодом и документацией.

## 3. Выполнение основных требований ИВ1

### 3.1 Создание, загрузка и сохранение контейнера

- создание нового контейнера выполняется через `EditorViewModel.NewContainer(...)`;
- загрузка/сохранение выполняется через `MinintSerializer` (собственная реализация чтения/записи);
- контейнер хранит общие размеры, набор документов (кадров), палитры и слои.

Реализация: `Minint/ViewModels/EditorViewModel.cs`, `Minint.Infrastructure/Serialization/MinintSerializer.cs`, `Minint.Core/Models/*`.

### 3.2 Редактирование единичных пикселей

- инструмент `Brush` изменяет значения пикселей маской радиуса;
- инструмент `Eraser` записывает индекс прозрачного цвета (`0`);
- выбор цвета выполняется через текущий `SelectedColor` и палитру документа.

Реализация: `Minint.Core/Services/Impl/DrawingService.cs`, `Minint/ViewModels/EditorViewModel.cs`.

### 3.3 Непрерывная отрисовка "кистью"

- при перемещении мыши по зажатой кнопке вызывается последовательная обработка точек;
- маска кисти вычисляется как круг по радиусу;
- поддерживается визуальный preview маски инструмента.

Реализация: `Minint/Controls/PixelCanvas.cs`, `Minint/Core/Services/Impl/DrawingService.cs`, `Minint/ViewModels/EditorViewModel.cs`.

### 3.4 Закраска области ("заливка")

- реализован алгоритм flood fill (4-связность);
- заливка ограничена областью одинакового исходного индекса;
- алгоритм работает в границах изображения.

Реализация: `Minint.Core/Services/Impl/FloodFillService.cs`.

### 3.5 Выделение, копирование/вырезание и вставка фрагмента

- реализована рамка выделения (`SelectionRect`);
- данные буфера обмена хранятся в palette-independent виде (`ClipboardFragment`, `RGBA`);
- вставка поддерживает предпросмотр и подтверждение позиции;
- прозрачные пиксели фрагмента при вставке пропускаются.

Реализация: `Minint/ViewModels/EditorViewModel.cs`, `Minint/Controls/PixelCanvas.cs`, `Minint.Core/Services/Impl/FragmentService.cs`.

## 4. Структура контейнера и пикселя

### 4.1 Структура контейнера `.minint`

Контейнер состоит из:

1. Заголовка файла:
   - сигнатура `MININT`;
   - версия формата;
   - ширина и высота;
   - количество документов;
   - резерв.
2. Набора документов:
   - имя документа;
   - задержка кадра;
   - палитра `RGBA`;
   - набор слоёв.
3. Набора слоёв:
   - имя слоя;
   - признак видимости;
   - непрозрачность;
   - массив индексов пикселей.

### 4.2 Структура пикселя

Логически пиксель хранится как индекс в палитре документа (`int` в ОЗУ, переменная ширина 1..4 байта в файле), а итоговый цвет формируется по таблице `RgbaColor`.

## 5. Основные алгоритмы

1. Запись контейнера в бинарный поток (`WriteHeader`, `WriteDocument`, `WriteLayer`).
2. Чтение и валидация контейнера (`ReadHeader`, `ReadDocument`, `ReadLayer`).
3. Круглая кисть по маске радиуса.
4. Очистка пикселей ластиком.
5. Flood fill по очереди.
6. Копирование/вставка фрагмента с отсечением по границам.
7. Композиция слоёв при обновлении холста.

## 6. UML-диаграммы (PlantUML)

### 6.1 Основной рабочий цикл редактора

`Report/lab2/uml/lr2-editor-workflow.puml`

![Основной рабочий цикл](uml/lr2-editor-workflow.png)

### 6.2 Формат контейнера и сериализация

`Report/lab2/uml/lr2-container-serialization.puml`

![Контейнер и сериализация](uml/lr2-container-serialization.png)

### 6.3 Инструменты рисования и заливки

`Report/lab2/uml/lr2-tools-and-fill.puml`

![Инструменты и заливка](uml/lr2-tools-and-fill.png)

### 6.4 Выделение и буфер обмена фрагментов

`Report/lab2/uml/lr2-selection-copy-paste.puml`

![Выделение и copy/paste](uml/lr2-selection-copy-paste.png)

## 7. Проверка работоспособности

Для проверки корректности реализации используются модульные тесты проекта `Minint.Tests`:

- `DrawingTests`;
- `FloodFillTests`;
- `FragmentServiceTests`;
- `SerializerTests`;
- `CompositorTests`;
- `ExportTests`.

## 8. Вывод

В рамках ЛР2 (вариант ИВ1) реализовано рабочее приложение-растровый редактор с собственным контейнером данных и базовым набором инструментов редактирования изображения. Практические требования ИВ1 закрыты на уровне пользовательского сценария и программной реализации.

Отдельно зафиксировано, что выбранная структура контейнера является палитровой и не повторяет буквально формулировки `КВ1–КВ4`; при этом это не противоречит задаче разработки редактора и демонстрирует полноценную обработку графических данных.
