Изменение применено к основной спеке photos: эффекты, виньетка, зерно, живой предпросмотр, свёрнутые секции панели и редактирование из просмотрщика. Change перемещён в archive.
181 lines
16 KiB
Markdown
181 lines
16 KiB
Markdown
# Spec Delta
|
|
|
|
## MODIFIED Requirements
|
|
|
|
### Requirement: Неразрушающее редактирование фотографии
|
|
Система SHALL поддерживать неразрушающее редактирование фотографий. Параметры правок (свет, цвет и эффекты) SHALL храниться в метаданных фото, а отредактированная версия SHALL создаваться как отдельные объекты (роли `edit`, `edit_thumb`, `edit_medium`, `edit_preview`) рядом с исходными вариантами. Рендер SHALL выполняться по исходному объекту фото, а не по его уменьшенным вариантам. Исходный объект SHALL оставаться неизменным, а скачивание SHALL отдавать оригинал. Сброс правок SHALL удалять и параметры, и отредактированную версию. Правки SHALL применяться только к изображениям.
|
|
|
|
#### Scenario: Сохранение правок
|
|
- **WHEN** пользователь сохраняет правки фото (свет, цвет и/или эффекты)
|
|
- **THEN** параметры сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов
|
|
|
|
#### Scenario: Фоновая подготовка версий
|
|
- **WHEN** правки фото сохранены
|
|
- **THEN** система готовит варианты сетки и полноразмерную версию в фоне и сообщает о готовности
|
|
|
|
#### Scenario: Рендер по оригиналу
|
|
- **WHEN** готовится отредактированная версия фото
|
|
- **THEN** световые и цветовые правки, а также эффекты применяются к пикселям исходного объекта, а не к его уменьшенной копии
|
|
|
|
#### Scenario: Неразрушачность
|
|
- **WHEN** фото отредактировано
|
|
- **THEN** исходный объект и его варианты остаются неизменными
|
|
|
|
#### Scenario: Сброс правок
|
|
- **WHEN** пользователь сбрасывает правки
|
|
- **THEN** параметры и отредактированная версия удаляются, а фото снова показывается в исходном виде
|
|
|
|
#### Scenario: Права на правки
|
|
- **WHEN** правки сохраняет пользователь без прав на это фото
|
|
- **THEN** система отклоняет запрос
|
|
|
|
#### Scenario: Редактирование видео
|
|
- **WHEN** пользователь пытается отредактировать видео
|
|
- **THEN** система отклоняет запрос
|
|
|
|
#### Scenario: Цветовые правки сохраняются и рендерятся
|
|
- **WHEN** пользователь сохраняет цветовые правки фото: баланс белого (температура/оттенок), сочность (vibrance), насыщенность, цветовой микшер по оттенкам, цветокоррекцию (тени/средние тона/света, яркость зон, наложение, баланс) или поканальную коррекцию
|
|
- **THEN** параметры цвета сохраняются в метаданных, отредактированная версия рендерится в фоне, а после рендера фото получает URL отредактированных вариантов
|
|
|
|
#### Scenario: Цветовые правки применяются к пикселям исходного объекта
|
|
- **WHEN** готовится отредактированная версия фото с цветовыми правками
|
|
- **THEN** цветовые правки применяются к пикселям исходного объекта после световых правок, а не к его уменьшенной копии
|
|
|
|
#### Scenario: Пустые цветовые правки не сохраняются
|
|
- **WHEN** в цветовых параметрах заданы только наложение/баланс или оттенок колеса без силы и яркости
|
|
- **THEN** правки считаются пустыми и фото не получает цветовую версию
|
|
|
|
#### Scenario: Пустые правки эффектов не сохраняются
|
|
- **WHEN** во всех эффектах заданы только значения по умолчанию (сила эффекта, виньетки и зерна равна нулю)
|
|
- **THEN** правки считаются пустыми и фото не получает новую отредактированную версию
|
|
|
|
## ADDED Requirements
|
|
|
|
### Requirement: Текстура
|
|
Клиент SHALL позволять настраивать текстуру фото в диапазоне -100..100. Положительные значения SHALL усиливать контраст мелких деталей, отрицательные — ослаблять его. Эффект SHALL применяться к исходному кадру после световых и цветовых правок.
|
|
|
|
#### Scenario: Усиление текстуры
|
|
- **WHEN** пользователь увеличивает значение текстуры
|
|
- **THEN** мелкие детали становятся контрастнее, а общая тональность кадра не меняется
|
|
|
|
#### Scenario: Ослабление текстуры
|
|
- **WHEN** пользователь уменьшает значение текстуры ниже нуля
|
|
- **THEN** мелкие детали сглаживаются
|
|
|
|
#### Scenario: Текстура в пределах допустимого
|
|
- **WHEN** клиент присылает значение текстуры вне диапазона -100..100
|
|
- **THEN** сервер ограничивает его ближайшей границей диапазона
|
|
|
|
### Requirement: Чёткость
|
|
Клиент SHALL позволять настраивать чёткость фото в диапазоне -100..100. Положительные значения SHALL усиливать локальный контраст средних частот, отрицательные — смягчать его. Чёткость SHALL NOT создавать заметных ореолов на границах контрастных объектов. Эффект SHALL применяться после световых и цветовых правок.
|
|
|
|
#### Scenario: Усиление чёткости
|
|
- **WHEN** пользователь увеличивает значение чёткости
|
|
- **THEN** локальный контраст средних тонов растёт, а границы контрастных объектов остаются без заметных ореолов
|
|
|
|
#### Scenario: Ослабление чёткости
|
|
- **WHEN** пользователь уменьшает значение чёткости ниже нуля
|
|
- **THEN** изображение становится мягче
|
|
|
|
### Requirement: Убрать дымку
|
|
Клиент SHALL позволять ослаблять или усиливать дымку в диапазоне -100..100. При положительных значениях сервер SHALL оценивать дымку по кадру и возвращать контраст и насыщенность удалённых участков; отрицательные значения SHALL добавлять дымку.
|
|
|
|
#### Scenario: Удаление дымки
|
|
- **WHEN** пользователь увеличивает значение «Убрать дымку» на кадре с дымкой
|
|
- **THEN** дальние планы становятся контрастнее и насыщеннее
|
|
|
|
#### Scenario: Добавление дымки
|
|
- **WHEN** пользователь уменьшает значение «Убрать дымку» ниже нуля
|
|
- **THEN** кадр становится менее контрастным, как при дымке
|
|
|
|
### Requirement: Виньетка
|
|
Клиент SHALL позволять настраивать виньетку: силу -100..100, среднюю точку и растушёвку 0..100 (по умолчанию 50), округлость -100..100, света 0..100, а также режим «Свет», «Цвет» или «Закарасить». Режим «Свет» SHALL затемнять или осветлять края, «Цвет» — тонировать их выбранным цветом с сохранением светлоты, «Закарасить» — заливать их выбранным цветом.
|
|
|
|
#### Scenario: Затемнение краёв
|
|
- **WHEN** пользователь задаёт положительную силу виньетки в режиме «Свет»
|
|
- **THEN** края кадра затемняются, а центр остаётся без изменений
|
|
|
|
#### Scenario: Осветление краёв
|
|
- **WHEN** пользователь задаёт отрицательную силу виньетки в режиме «Свет»
|
|
- **THEN** края кадра осветляются
|
|
|
|
#### Scenario: Цветная виньетка
|
|
- **WHEN** пользователь выбирает режим «Цвет» или «Закарасить» и задаёт цвет виньетки
|
|
- **THEN** края кадра тонируются или заливаются этим цветом с силой, заданной ползунком виньетки
|
|
|
|
#### Scenario: Геометрия виньетки
|
|
- **WHEN** пользователь меняет среднюю точку, растушёвку или округлость
|
|
- **THEN** меняются размер, мягкость и форма зоны виньетки
|
|
|
|
#### Scenario: Защита светов
|
|
- **WHEN** пользователь увеличивает значение «Света» в режиме «Свет»
|
|
- **THEN** яркие участки в зоне виньетки сохраняют яркость
|
|
|
|
#### Scenario: Нулевая сила виньетки
|
|
- **WHEN** сила виньетки равна нулю
|
|
- **THEN** виньетка не влияет на изображение независимо от остальных параметров
|
|
|
|
### Requirement: Зерно
|
|
Клиент SHALL позволять добавлять зерно с силой, размером и шероховатостью в диапазоне 0..100 (по умолчанию размер 25, шероховатость 50). Зерно SHALL быть детерминированным: повторный рендер одних и тех же параметров SHALL давать одинаковый шум.
|
|
|
|
#### Scenario: Добавление зерна
|
|
- **WHEN** пользователь увеличивает силу зерна
|
|
- **THEN** на изображении появляется шум, заметный в средних тонах
|
|
|
|
#### Scenario: Размер и шероховатость
|
|
- **WHEN** пользователь меняет размер или шероховатость зерна
|
|
- **THEN** меняются крупность и контрастность шума
|
|
|
|
#### Scenario: Детерминированность зерна
|
|
- **WHEN** сервер повторно рендерит фото с теми же параметрами зерна
|
|
- **THEN** рисунок шума совпадает с предыдущим рендером
|
|
|
|
#### Scenario: Нулевая сила зерна
|
|
- **WHEN** сила зерна равна нулю
|
|
- **THEN** зерно не влияет на изображение
|
|
|
|
### Requirement: Живой предпросмотр эффектов
|
|
Клиент SHALL показывать эффекты в просмотрщике до завершения серверного рендера. После готовности серверной версии клиент SHALL показывать её. Предпросмотр пространственных эффектов (текстура, чёткость, дымка) MAY отличаться от серверного рендера деталями, но SHALL передавать характер эффекта.
|
|
|
|
#### Scenario: Эффекты видны сразу
|
|
- **WHEN** пользователь двигает ползунок эффекта
|
|
- **THEN** просмотрщик обновляет изображение без ожидания серверного рендера
|
|
|
|
#### Scenario: Серверная версия заменяет предпросмотр
|
|
- **WHEN** серверный рендер эффектов завершён
|
|
- **THEN** просмотрщик показывает серверную версию
|
|
|
|
#### Scenario: Предпросмотр без WebGL
|
|
- **WHEN** аппаратное ускорение недоступно
|
|
- **THEN** клиент показывает эффекты доступным способом или показывает их после серверного рендера, не блокируя интерфейс
|
|
|
|
### Requirement: Свёрнутые секции редактора
|
|
Редактор SHALL показывать все сворачиваемые секции инструментов свёрнутыми по умолчанию. Клиент SHALL сохранять состояние каждой секции (свёрнута или развёрнута) в браузере пользователя и восстанавливать его при повторном открытии редактора и перезагрузке страницы. Состояние SHALL NOT зависеть от выбранного фото.
|
|
|
|
#### Scenario: Первое открытие редактора
|
|
- **WHEN** пользователь впервые открывает редактор фото
|
|
- **THEN** все секции инструментов («Свет», «Цвет», «Эффекты» и их вложенные блоки) свёрнуты
|
|
|
|
#### Scenario: Состояние запоминается
|
|
- **WHEN** пользователь разворачивает секцию «Эффекты» и перезагружает страницу
|
|
- **THEN** секция «Эффекты» остаётся развёрнутой
|
|
|
|
#### Scenario: Состояние переживает смену фото
|
|
- **WHEN** пользователь переключает фото в редакторе
|
|
- **THEN** свёрнутость секций не меняется
|
|
|
|
### Requirement: Редактирование только из просмотрщика
|
|
Клиент SHALL показывать вкладку «Редактирование» только когда фото открыто в просмотрщике. В режиме сетки правая панель SHALL показывать только «Сведения» и SHALL NOT отображать инструменты редактирования.
|
|
|
|
#### Scenario: Фото выбрано в сетке
|
|
- **WHEN** пользователь выбирает фото в сетке, не открывая просмотрщик
|
|
- **THEN** в правой панели отображается только вкладка «Сведения»
|
|
|
|
#### Scenario: Фото открыто в просмотрщике
|
|
- **WHEN** пользователь открывает фото в просмотрщике
|
|
- **THEN** в правой панели доступны «Сведения» и «Редактирование»
|
|
|
|
#### Scenario: Возврат из просмотрщика в сетку
|
|
- **WHEN** пользователь возвращается из просмотрщика в сетку
|
|
- **THEN** вкладка «Редактирование» скрыта, панель показывает «Сведения»
|