Closed dom1n1k closed 1 year ago
Очень нравится хак. Пришлёшь PR с результатами бенчмарка.
Только вместо if (color.mode === 'oklch')
лучше сделать COLOR_FN === 'oklch'
. Это константа и JIT-компилятор там вообще выкинет проверку.
proxyColor = rgb(color)
А у culori нет linaer RGB? (странно, он часто нужен)
А у culori нет linaer RGB? (странно, он часто нужен)
Linear sRGB - есть. Linear P3/Rec2020 - нет. Ну в смысле нет в виде отдельных сущностей. Неявным образом внутри конечно есть.
Только вместо if (color.mode === 'oklch') лучше сделать COLOR_FN === 'oklch'
Нет, это не прокатит, потому что mode
в данном случае не режим всего приложения, а тип конкретного цвета, который передали параметром. И там ещё может быть rgb-цвет.
Да, точно :(
Если будет ускорение, я потом подумаю как ещё ускорить. Жду PR.
Пока изучал код, появились соображения. Сразу конкретный пример:
https://github.com/evilmartians/oklch-picker/blob/89638b45390a1be7f391c9a0964c931f1edadb20/lib/colors.ts#L151-L161
Что тут бросается в глаза? В каждую из трех проверочных функций передается исходный цвет, который внутри будет сконвертирован в целевое пространство. Нюанс в том, что в Culori нет прямого перехода из
OKLch
вP3
илиRec2020
. Он в любом случае идет черезsRGB
. В реальности под капотом такие цепочки:Да, двойной проход через
Linear sRGB
. Он избыточен, но такой граф у Culori. Технически можно короче, но это пришлось бы разруливать вручную.Из
LCH
будет вот так:Очевидно, что проходить все три цепочки от начала до конца неэффективно – половина шагов повторяется. Можно закешировать результат последнего общего шага. Примерно так:
Стоимость кеширования практически нулевая, поскольку мы не делаем лишних вычислений. Только сохраняем то, что и так было бы.
Это в качестве примера. Вообще, если честно, я сомневаюсь в необходимости функций
generateGetSpace
иgenerateGetPixel
. Я понимаю, зачем они были сделаны. Но кажется, что это экономия на спичках, когда в комнате есть слон пожирнее. Цветовые преобразования намного дороже, чем пара if-ов.