# План: третья волна EASY — трансформации, свет, SVG > **СТАТУС: ВЫПОЛНЕН 24.08.2026.** ## 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-текст). - Субпиксельная точность аффинных трансформаций сверх билинейного семплинга. - Пакетное применение и пресеты.