# HG changeset patch # User sam # Date 1713187336 -25200 # Node ID a3ab9915520974d4da6ffb403ae2e43140337dcc # Parent 75e109bb62ba26e36f231fe81cbfca909c3305f5 did: refacotor for easier user of sRGB-conversion functions diff -r 75e109bb62ba -r a3ab99155209 semicongine/core/color.nim --- a/semicongine/core/color.nim Mon Apr 15 14:36:19 2024 +0700 +++ b/semicongine/core/color.nim Mon Apr 15 20:22:16 2024 +0700 @@ -1,3 +1,4 @@ +import std/math import std/parseutils import std/strformat @@ -36,8 +37,40 @@ discard parseHex(hex[6 .. 7], a) return Vec4f([float32(r), float32(g), float32(b), float32(a)]) / 255'f -func gamma*[T: Vec3f|Vec4f](color: T, gamma: float32): T = - return pow(color, gamma) + +func linear2srgb*(value: SomeFloat): SomeFloat = + clamp( + if (value < 0.0031308): value * 12.92 + else: pow(value, 1.0 / 2.4) * 1.055 - 0.055, + 0, + 1, + ) +func srgb2linear*(value: SomeFloat): SomeFloat = + clamp( + if (value < 0.04045): value / 12.92 + else: pow((value + 0.055) / 1.055, 2.4), + 0, + 1, + ) +func linear2srgb*(value: uint8): uint8 = # also covers GrayPixel + uint8(round(linear2srgb(float(value) / 255.0) * 255)) +func srgb2linear*(value: uint8): uint8 = # also covers GrayPixel + uint8(round(srgb2linear(float(value) / 255.0) * 255)) + +func toSRGB*(value: Vec4f): Vec4f = + newVec4f( + linear2srgb(value.r), + linear2srgb(value.g), + linear2srgb(value.b), + value.a, + ) +func fromSRGB*(value: Vec4f): Vec4f = + newVec4f( + srgb2linear(value.r), + srgb2linear(value.g), + srgb2linear(value.b), + value.a, + ) const Black* = toRGBA "#000000FF" diff -r 75e109bb62ba -r a3ab99155209 semicongine/core/imagetypes.nim --- a/semicongine/core/imagetypes.nim Mon Apr 15 14:36:19 2024 +0700 +++ b/semicongine/core/imagetypes.nim Mon Apr 15 20:22:16 2024 +0700 @@ -3,6 +3,7 @@ import ./vulkanapi import ./vector +import ./color type RGBAPixel* = array[4, uint8] @@ -41,27 +42,9 @@ # colorspace conversion functions -func linear2srgb(value: float): float = - clamp( - if (value < 0.0031308): value * 12.92 - else: pow(value, 1.0 / 2.4) * 1.055 - 0.055, - 0, - 1, - ) -func srgb2linear(value: float): float = - clamp( - if (value < 0.04045): value / 12.92 - else: pow((value + 0.055) / 1.055, 2.4), - 0, - 1, - ) -func linear2srgb(value: uint8): uint8 = # also covers GrayPixel - uint8(round(linear2srgb(float(value) / 255.0) * 255)) -func linear2srgb(value: RGBAPixel): RGBAPixel = +func linear2srgb*(value: RGBAPixel): RGBAPixel = [linear2srgb(value[0]), linear2srgb(value[1]), linear2srgb(value[2]), value[3]] -func srgb2linear(value: uint8): uint8 = # also covers GrayPixel - uint8(round(srgb2linear(float(value) / 255.0) * 255)) -func srgb2linear(value: RGBAPixel): RGBAPixel = +func srgb2linear*(value: RGBAPixel): RGBAPixel = [srgb2linear(value[0]), srgb2linear(value[1]), srgb2linear(value[2]), value[3]] proc asSRGB*[T](image: Image[T]): Image[T] =