Skip to content

Commit

Permalink
Merge pull request #39 from edisile/patch-1
Browse files Browse the repository at this point in the history
Fix Oklab inverse transform and update matrices
  • Loading branch information
treeform committed Feb 2, 2023
2 parents 149d62b + f5b64a8 commit 64eab23
Show file tree
Hide file tree
Showing 2 changed files with 35 additions and 32 deletions.
27 changes: 15 additions & 12 deletions src/chroma/transformations.nim
Expand Up @@ -530,25 +530,28 @@ proc color*(c: ColorPolarLUV): Color {.inline.} =
proc oklab*(c: Color): ColorOklab {.inline.} =
## convert Color to ColorOklab
let
l = cbrt(0.4121656120f * c.r + 0.5362752080f * c.g + 0.0514575653f * c.b)
m = cbrt(0.2118591070f * c.r + 0.6807189584f * c.g + 0.1074065790f * c.b)
s = cbrt(0.0883097947f * c.r + 0.2818474174f * c.g + 0.6302613616f * c.b)
result.L = 0.2104542553f*l + 0.7936177850f*m - 0.0040720468f*s
result.a = 1.9779984951f*l - 2.4285922050f*m + 0.4505937099f*s
result.b = 0.0259040371f*l + 0.7827717662f*m - 0.8086757660f*s
r = ftrans(c.r, 2.4)
g = ftrans(c.g, 2.4)
b = ftrans(c.b, 2.4)
l = cbrt(0.4122214708f * r + 0.5363325363f * g + 0.0514459929f * b)
m = cbrt(0.2119034982f * r + 0.6806995451f * g + 0.1073969566f * b)
s = cbrt(0.0883024619f * r + 0.2817188376f * g + 0.6299787005f * b)
result.L = 0.2104542553f * l + 0.7936177850f * m - 0.0040720468f * s
result.a = 1.9779984951f * l - 2.4285922050f * m + 0.4505937099f * s
result.b = 0.0259040371f * l + 0.7827717662f * m - 0.8086757660f * s

proc color*(c: ColorOklab): Color {.inline.} =
## convert ColorOklab to Color
let
l = c.L + 0.3963377774f * c.a + 0.2158037573f * c.b
m = c.L - 0.1055613458f * c.a - 0.0638541728f * c.b
s = c.L - 0.0894841775f * c.a - 1.2914855480f * c.b
l3 = l*l*l
m3 = m*m*m
s3 = s*s*s
result.r = + 4.0767245293f*l - 3.3072168827f*m + 0.2307590544f*s
result.g = - 1.2681437731f*l + 2.6093323231f*m - 0.3411344290f*s
result.b = - 0.0041119885f*l - 0.7034763098f*m + 1.7068625689f*s
l3 = l * l * l
m3 = m * m * m
s3 = s * s * s
result.r = gtrans(+4.0767416621f * l3 - 3.3077115913f * m3 + 0.2309699292f * s3)
result.g = gtrans(-1.2684380046f * l3 + 2.6097574011f * m3 - 0.3413193965f * s3)
result.b = gtrans(-0.0041960863f * l3 - 0.7034186147f * m3 + 1.7076147010f * s3)
result.a = 1.0

proc oklab*(c: ColorPolarOklab): ColorOklab {.inline.} =
Expand Down
40 changes: 20 additions & 20 deletions tests/test_colors.nim
Expand Up @@ -216,32 +216,32 @@ suite "spaces":

let cOklab = colors.mapIt(it.to(ColorOklab))
let expOklab = [
oklab(0.6059127, -0.0618687, -0.132093335),
oklab(0.7673618, 0.0031948, -0.056107075),
oklab(0.8522680, 0.0036528, -0.029817891),
oklab(0.9129040, 0.0019834, -0.012930225),
oklab(0.9521403, 0.0002312, -0.002724297),
oklab(0.9524956, 0.0026390, 3.44801e-05),
oklab(0.9144257, 0.0145511, 0.001537969),
oklab(0.8536680, 0.0347748, 0.002470664),
oklab(0.7624759, 0.0678392, 0.001605107),
oklab(0.5607032, 0.2017071, -0.033859189)
oklab(0.40672997, -0.02695328, -0.17169085),
oklab(0.56404305, 0.00549200, -0.09741843),
oklab(0.70085692, 0.00688213, -0.05724370),
oklab(0.81447536, 0.00402534, -0.02647555),
oklab(0.89487135, 0.00047883, -0.00551909),
oklab(0.89565080, 0.00560808, 0.00032860),
oklab(0.81843138, 0.02985227, 0.00379938),
oklab(0.70829993, 0.06616995, 0.00769448),
oklab(0.57255679, 0.11003068, 0.01315761),
oklab(0.41695607, 0.16161427, 0.02273411)
]
for i in 0 ..< colors.len:
check cOklab[i].almostEq(expOklab[i])

let cPolarOklab = colors.mapIt(it.to(ColorPolarOklab))
let expPolarOklab = [
polarOklab(0.60591274, 0.14580541, 244.8921356),
polarOklab(0.76736181, 0.05619394, 273.2592468),
polarOklab(0.85226809, 0.03002440, 276.9880981),
polarOklab(0.91290402, 0.01315032, 278.6747741),
polarOklab(0.95214039, 0.00271021, 274.8944396),
polarOklab(0.95249563, 0.00263925, 0.7479323),
polarOklab(0.91442573, 0.01463048, 5.9677457),
polarOklab(0.85366809, 0.03486439, 4.1069898),
polarOklab(0.76247590, 0.06785918, 1.3892900),
polarOklab(0.56070321, 0.20453040, 350.4690856)
polarOklab(0.40672997, 0.17379364, 261.07812500),
polarOklab(0.56404305, 0.09757311, 273.22665405),
polarOklab(0.70085692, 0.05765592, 276.85546875),
polarOklab(0.81447536, 0.02677981, 278.64501953),
polarOklab(0.89487135, 0.00553983, 274.95852661),
polarOklab(0.89565080, 0.00561770, 3.35335946),
polarOklab(0.81843138, 0.03009308, 7.25319290),
polarOklab(0.70829993, 0.06661581, 6.63277388),
polarOklab(0.57255679, 0.11081459, 6.81911993),
polarOklab(0.41695607, 0.16320543, 8.00719738)
]
for i in 0 ..< colors.len:
check cPolarOklab[i].almostEq(expPolarOklab[i])
Expand Down

0 comments on commit 64eab23

Please sign in to comment.