diff --git a/docs/plan-medium-wave2.md b/docs/archive/plan-medium-wave2.md similarity index 99% rename from docs/plan-medium-wave2.md rename to docs/archive/plan-medium-wave2.md index 098fdc5..ec0d54c 100644 --- a/docs/plan-medium-wave2.md +++ b/docs/archive/plan-medium-wave2.md @@ -1,6 +1,6 @@ # План: MEDIUM-волна №2 — морфология прозрачности -> Статус: план к выполнению. +> **СТАТУС: ВЫПОЛНЕН 2026-08-23.** ## 1. Зачем diff --git a/docs/plan-easy-wave3.md b/docs/plan-easy-wave3.md new file mode 100644 index 0000000..b202c89 --- /dev/null +++ b/docs/plan-easy-wave3.md @@ -0,0 +1,57 @@ +# План: третья волна EASY — трансформации, свет, SVG + +> Статус: план к выполнению. + +## 1. Что получается + +Одиннадцать новых инструментов: свободные трансформации формы (наклон, поворот на произвольный угол, зум, сдвиг), светокоррекция (гамма, автоконтраст, температура, тонирование), виньетка, эффект «артефактов сжатия» и вход SVG. Каталог вырастает с 58 до ~69. + +Текстовые инструменты и водяные знаки в волну не входят — им нужен рендер текста на канвасе, это отдельная четвёртая волна. + +## 2. Новое ядро + +- **Аффинные трансформации** (`core/affine.ts`): единая функция обратного отображения — для каждого пикселя результата вычисляется исходная координата матрицей и семплируется билинейно (общий семплер, вынесенный из `resize`). Поверх неё: наклон по осям, поворот на произвольный угол (с расширением холста под новые габариты), зум к центру, сдвиг. +- **Свет и цвет** (`core/color.ts` дополнения): гамма-коррекция через LUT, автоконтраст (растяжка по гистограмме яркости с отсечкой хвостов), температура (множители тёплых/холодных каналов), тонирование (умножение RGB на цвет с сохранением яркостного баланса). +- **Виньетка** (`core/effects.ts`): радиальное затемнение от центра, сила слайдером; чистая математика без canvas. +- **IO-расширения** (`core/io.ts`): декодирование SVG из текста/файла через blob-URL и `Image`; раундтрип «закодировать JPEG с качеством Q → декодировать обратно» для эффекта артефактов сжатия. + +## 3. Инструменты — 11 + +- **Геометрия:** `skew-png` (углы X/Y), `rotate-free-png` (любой угол, холст расширяется), `zoom-png` (масштаб ≥100 % к центру), `shift-png` (сдвиг со смещением содержимого). +- **Фильтры:** `vignette-png` (сила затемнения), `jpeg-artifacts-png` (имитация пережатия). +- **Цвет:** `gamma-png` (0.1–3.0), `auto-contrast-png` (без параметров), `temperature-png` (−100 тёплый…+100 холодный или наоборот — подпись честная), `tint-png` (цвет + сила). +- **Конвертация:** `svg-to-png` (текст SVG слева, как base64-режим). + +## 4. Этапы и проверки + +- **A. Ядро** — семплер, аффинный модуль, свет/цвет, эффекты + точные тесты: поворот квадрата на 90° совпадает с существующим `rotate90`, зум ×2 удваивает размеры и центр остаётся центром, гамма 1 — идентичность, автоконтраст растягивает известный диапазон, виньетка симметрична и не трогает центр при нулевой силе. Проверка: `pnpm test/check`. +- **B. IO** — SVG-декод и JPEG-раундтрип. Проверка: сборка; живой прогон на этапе D. +- **C. Реестр** — одиннадцать записей, иконки, тесты целостности. Проверка: `test/build`, страницы в экспорте. +- **D. Итог** — полный прогон, смоук §7. + +## 5. Смоук-чеклист + +1. Наклон X/Y по отдельности и вместе — форма искажается предсказуемо, без чёрных полос при малых углах. +2. Поворот на 30° — холст вырос, углы прозрачны, содержимое повернуто. +3. Зум 200 % — содержимое увеличено к центру, холст прежнего размера, края обрезаны. +4. Сдвиг уводит содержимое за край, противоположный край заполняется фоном. +5. Гамма 0.5 темнее, 2.0 светлее, 1.0 — без изменений. +6. Автоконтраст на тусклом фото вытягивает диапазон. +7. Температура ±50 заметно теплеет/холодеет. +8. Тонирование красным даёт равномерный оттенок, белые области окрашиваются сильнее всего. +9. Виньетка затемняет только края, центр не трогает. +10. Артефакты: качество 10 даёт видимые квадраты JPEG. +11. SVG вставленный слева декодируется в результат справа; битый SVG — баннер. +12. Все новые инструменты работают в цепочке и скачиваются из своих секций. + +## 6. Критерии готовности + +- Одиннадцать инструментов работают и покрыты юнит-тестами ядра (кроме IO-дом-части). +- Аффинные операции опираются на общий билинейный семплер; дублирования сэмплинга нет. +- Каталог ~69 инструментов; `test/check/build` зелёные, смоук §5 пройден. + +## 7. Что сознательно не делаем + +- Рендер текста, водяные знаки, штампы — четвёртая волна (DOM-текст). +- Субпиксельная точность аффинных трансформаций сверх билинейного семплинга. +- Пакетное применение и пресеты.