Skip to content

Commit 53b65de

Browse files
switch to @texel/color for color conversions
appears to be faster & smaller
1 parent 62e12a2 commit 53b65de

File tree

5 files changed

+42
-55
lines changed

5 files changed

+42
-55
lines changed

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,8 +54,7 @@
5454
"svelte": "^3.54.0 || ^4.0.0 || ^5.0.0"
5555
},
5656
"dependencies": {
57-
"@types/culori": "^2.1.1",
58-
"culori": "^4.0.1"
57+
"@texel/color": "^1.1.4"
5958
},
6059
"devDependencies": {
6160
"@sveltejs/adapter-static": "^3.0.6",

pnpm-lock.yaml

Lines changed: 8 additions & 17 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/lib/ColorSelect.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
} from './constants'
1010
import { render_main_image, render_slider_image } from './render'
1111
import type { RGB, OKlab, OKhsv } from './color'
12-
import { oklab_to_okhsv, rgb_to_oklab, okhsv_to_oklab, oklab_to_rgb } from './color'
12+
import { oklab_to_okhsv, okhsv_to_oklab, rgb_to_okhsv, okhsv_to_rgb } from './color'
1313
1414
export let rgb: RGB | undefined = undefined
1515
export let oklab: OKlab | undefined = undefined
@@ -48,7 +48,7 @@
4848
}
4949
5050
if (rgb) {
51-
return oklab_to_okhsv(rgb_to_oklab(rgb))
51+
return rgb_to_okhsv(rgb)
5252
}
5353
5454
throw 'rgb, oklab, or okhsv required'
@@ -66,7 +66,7 @@
6666
}
6767
6868
if (rgb) {
69-
rgb = oklab_to_rgb(okhsv_to_oklab(color))
69+
rgb = okhsv_to_rgb(color)
7070
dispatch('change', { rgb })
7171
}
7272
}

src/lib/color.ts

Lines changed: 27 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,50 @@
1-
import {
2-
convertOklabToRgb,
3-
convertOkhsvToOklab,
4-
convertRgbToOklab,
5-
convertOklabToOkhsv,
6-
convertOkhslToOklab,
7-
} from 'culori/fn'
8-
1+
import { convert, OKHSL, OKHSV, OKLab, sRGB } from '@texel/color'
92

103
export interface RGB {
11-
r: number
12-
g: number
13-
b: number
4+
r: number
5+
g: number
6+
b: number
147
}
158

169
export interface OKlab {
17-
l: number
18-
a: number
19-
b: number
10+
l: number
11+
a: number
12+
b: number
2013
}
2114

2215
export interface OKhsv {
23-
h: number
24-
s: number
25-
v: number
16+
h: number
17+
s: number
18+
v: number
2619
}
2720

2821
export interface OKhsl {
29-
h: number
30-
s: number
31-
l: number
22+
h: number
23+
s: number
24+
l: number
3225
}
3326

34-
export function oklab_to_rgb(oklab: OKlab): RGB {
35-
return convertOklabToRgb(oklab)
27+
export function oklab_to_okhsv(oklab: OKlab): OKhsv {
28+
const [h, s, v] = convert([oklab.l, oklab.a, oklab.b], OKLab, OKHSV)
29+
return { h: h ?? 0, s, v }
3630
}
3731

38-
export function oklab_to_okhsv(oklab: OKlab): OKhsv {
39-
const { h, s, v } = convertOklabToOkhsv(oklab)
40-
return { h: h ?? 0, s, v }
32+
export function okhsv_to_rgb(okhsv: OKhsv): RGB {
33+
const [r, g, b] = convert([okhsv.h, okhsv.s, okhsv.v], OKHSV, sRGB)
34+
return { r, g, b }
4135
}
4236

4337
export function okhsv_to_oklab(okhsv: OKhsv): OKlab {
44-
return convertOkhsvToOklab(okhsv)
38+
const [l, a, b] = convert([okhsv.h, okhsv.s, okhsv.v], OKHSV, OKLab)
39+
return { l, a, b }
4540
}
4641

47-
export function rgb_to_oklab(rgb: RGB): OKlab {
48-
return convertRgbToOklab(rgb)
42+
export function rgb_to_okhsv(rgb: RGB): OKhsv {
43+
const [h, s, v] = convert([rgb.r, rgb.g, rgb.b], sRGB, OKHSV)
44+
return { h, s, v }
4945
}
5046

51-
export function okhsl_to_oklab(okhsl: OKhsl): OKlab {
52-
return convertOkhslToOklab(okhsl)
47+
export function okhsl_to_rgb(okhsl: OKhsl): RGB {
48+
const [r, g, b] = convert([okhsl.h, okhsl.s, okhsl.l], OKHSL, sRGB)
49+
return { r, g, b }
5350
}

src/lib/render.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { f_shader, v_shader } from './shaders'
22
import { picker_size, slider_width } from './constants'
3-
import { okhsl_to_oklab, oklab_to_rgb } from './color'
3+
import { okhsl_to_rgb } from './color'
44

55
export function render_slider_image(canvas: HTMLCanvasElement) {
66
const ctx = canvas.getContext('2d')!
@@ -10,11 +10,11 @@ export function render_slider_image(canvas: HTMLCanvasElement) {
1010
const a_ = Math.cos(2 * Math.PI * i / picker_size)
1111
const b_ = Math.sin(2 * Math.PI * i / picker_size)
1212

13-
const rgb = oklab_to_rgb(okhsl_to_oklab({
13+
const rgb = okhsl_to_rgb({
1414
h: i / picker_size * 360,
1515
s: 0.9,
1616
l: 0.65 + 0.17 * b_ - 0.08 * a_,
17-
}))
17+
})
1818

1919
for (let j = 0; j < slider_width; j++) {
2020
const index = 4 * (i * slider_width + j)

0 commit comments

Comments
 (0)