[orx-color] Make ColorOKHSL, ColorOKHSV AlgabraicCcolor, fix package name

This commit is contained in:
Edwin Jakobs
2021-10-22 07:38:59 +02:00
parent 9608946d35
commit af524b8e42
9 changed files with 65 additions and 34 deletions

View File

@@ -53,6 +53,8 @@ class ColorSequence(val colors: List<Pair<Double, ConvertibleToColorRGBa>>) {
is ColorLCHABa -> right.second.toRGBa().toLCHABa().mix(l, nt).toRGBa()
is ColorOKLABa -> right.second.toRGBa().toOKLABa().mix(l, nt).toRGBa()
is ColorOKLCHa -> right.second.toRGBa().toOKLCHa().mix(l, nt).toRGBa()
is ColorOKHSLa -> right.second.toRGBa().toOKHSLa().mix(l, nt).toRGBa()
is ColorOKHSVa -> right.second.toRGBa().toOKHSVa().mix(l, nt).toRGBa()
else -> error("unsupported color space: ${l::class}")
}.toSRGB()
}

View File

@@ -1,6 +1,7 @@
package org.openrndr.extra.color.spaces
import org.openrndr.color.*
import org.openrndr.math.mixAngle
import kotlin.math.*
data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Double = 1.0) :
@@ -8,6 +9,7 @@ data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Doubl
OpacifiableColor<ColorOKHSLa>,
SaturatableColor<ColorOKHSLa>,
ShadableColor<ColorOKHSLa>,
AlgebraicColor<ColorOKHSLa>,
ConvertibleToColorRGBa {
companion object {
@@ -47,17 +49,13 @@ data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Doubl
}
override fun toRGBa(): ColorRGBa {
if (l == 1.0)
{
if (l == 1.0) {
ColorRGBa(1.0, 1.0, 1.0, a)
}
else if (l == 0.0)
{
} else if (l == 0.0) {
ColorRGBa(0.0, 0.0, 0.0, a)
}
val a_ = cos(2*PI*h);
val b_ = sin(2*PI*h);
val a_ = cos(2 * PI * h);
val b_ = sin(2 * PI * h);
val L = toe_inv(l);
val Cs = get_Cs(L, a_, b_);
@@ -71,22 +69,19 @@ data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Doubl
val k_0: Double
val k_1: Double
val k_2: Double
if (s < 0.8)
{
t = 1.25*s;
if (s < 0.8) {
t = 1.25 * s;
k_0 = 0.0
k_1 = 0.8*C_0;
k_2 = (1-k_1/C_mid);
}
else
{
t = 5*(s-0.8);
k_1 = 0.8 * C_0;
k_2 = (1 - k_1 / C_mid);
} else {
t = 5 * (s - 0.8);
k_0 = C_mid;
k_1 = 0.2*C_mid*C_mid*1.25*1.25/C_0;
k_2 = (1 - (k_1)/(C_max - C_mid));
k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
k_2 = (1 - (k_1) / (C_max - C_mid));
}
C = k_0 + t*k_1/(1-k_2*t);
C = k_0 + t * k_1 / (1 - k_2 * t);
// If we would only use one of the Cs:
//C = s*C_0;
@@ -119,6 +114,24 @@ data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Doubl
return copy(l = l * factor)
}
override fun minus(right: ColorOKHSLa) =
copy(h = h - right.h, s = s - right.s, l = l - right.l, a = a - right.a)
override fun plus(right: ColorOKHSLa) =
copy(h = h + right.h, s = s + right.s, l = l + right.l, a = a + right.a)
override fun times(scale: Double): ColorOKHSLa = copy(h = h * scale, s = s * scale, l = l * scale, a = a * scale)
override fun mix(other: ColorOKHSLa, factor: Double): ColorOKHSLa {
val sx = factor.coerceIn(0.0, 1.0)
return ColorOKHSLa(
mixAngle(h * 360.0, other.h * 360.0, sx) / 360.0,
(1.0 - sx) * s + sx * other.s,
(1.0 - sx) * l + sx * other.l,
(1.0 - sx) * a + sx * other.a
)
}
}
fun ColorRGBa.toOKHSLa() : ColorOKHSLa = ColorOKHSLa.fromColorRGBa(this)
fun ColorRGBa.toOKHSLa(): ColorOKHSLa = ColorOKHSLa.fromColorRGBa(this)

View File

@@ -1,6 +1,7 @@
package org.openrndr.extra.color.spaces
import org.openrndr.color.*
import org.openrndr.math.mixAngle
import kotlin.math.*
@@ -9,6 +10,7 @@ data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, val a: Doubl
OpacifiableColor<ColorOKHSVa>,
SaturatableColor<ColorOKHSVa>,
ShadableColor<ColorOKHSVa>,
AlgebraicColor<ColorOKHSVa>,
ConvertibleToColorRGBa {
companion object {
@@ -88,12 +90,10 @@ data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, val a: Doubl
C *= scale_L;
return ColorOKLABa(L, C * a_, C * b_).toRGBa().toSRGB()
}
override fun shiftHue(shiftInDegrees: Double): ColorOKHSVa {
val normalizedShift = shiftInDegrees/360.0
val normalizedShift = shiftInDegrees / 360.0
return copy(h = h + normalizedShift)
}
@@ -109,6 +109,23 @@ data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, val a: Doubl
return copy(v = v * factor)
}
override fun minus(right: ColorOKHSVa) =
copy(h = h - right.h, s = s - right.s, v = v - right.v, a = a - right.a)
override fun plus(right: ColorOKHSVa) =
copy(h = h + right.h, s = s + right.s, v = v + right.v, a = a + right.a)
override fun times(scale: Double): ColorOKHSVa = copy(h = h * scale, s = s * scale, v = v * scale, a = a * scale)
override fun mix(other: ColorOKHSVa, factor: Double): ColorOKHSVa {
val sx = factor.coerceIn(0.0, 1.0)
return ColorOKHSVa(
mixAngle(h * 360.0, other.h * 360.0, sx) / 360.0,
(1.0 - sx) * s + sx * other.s,
(1.0 - sx) * v + sx * other.v,
(1.0 - sx) * a + sx * other.a
)
}
}
fun ColorRGBa.toOKHSVa() : ColorOKHSVa = ColorOKHSVa.fromColorRGBa(this)
fun ColorRGBa.toOKHSVa(): ColorOKHSVa = ColorOKHSVa.fromColorRGBa(this)

View File

@@ -2,11 +2,8 @@ import org.openrndr.application
import org.openrndr.color.ColorRGBa
import org.openrndr.draw.loadFont
import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.color.spaces.*
import org.openrndr.extras.color.palettes.rangeTo
import org.openrndr.extra.color.spaces.toHSLUVa
import org.openrndr.extra.color.spaces.toOKLABa
import org.openrndr.extra.color.spaces.toOKLCHa
import org.openrndr.extra.color.spaces.toXSLUVa
fun main() {
application {
@@ -27,6 +24,8 @@ fun main() {
"LCh(ab)" to (colorA.toLCHABa()..colorB.toLCHABa() blend stepCount),
"OKLab" to (colorA.toOKLABa()..colorB.toOKLABa() blend stepCount),
"OKLCh" to (colorA.toOKLCHa()..colorB.toOKLCHa() blend stepCount),
"OKHSV" to (colorA.toOKHSVa()..colorB.toOKHSVa() blend stepCount),
"OKHSL" to (colorA.toOKHSLa()..colorB.toOKHSLa() blend stepCount),
"HSLUV" to (colorA.toHSLUVa()..colorB.toHSLUVa() blend stepCount),
"XSLUV" to (colorA.toXSLUVa()..colorB.toXSLUVa() blend stepCount),
)

View File

@@ -1,7 +1,7 @@
package org.openrndr.extra.shadestyles
import org.openrndr.color.ColorRGBa
import org.openrndr.extras.color.spaces.ColorOKLABa
import org.openrndr.extra.color.spaces.ColorOKLABa
import kotlin.reflect.KClass
internal fun generateColorTransform(kClass: KClass<*>): String {

View File

@@ -7,7 +7,7 @@ import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.extra.shaderphrases.preprocess
import org.openrndr.extras.color.phrases.ColorPhraseBook
import org.openrndr.extras.color.spaces.ColorOKLABa
import org.openrndr.extra.color.spaces.ColorOKLABa
import org.openrndr.math.CastableToVector4
import org.openrndr.math.Vector2
import kotlin.reflect.KClass

View File

@@ -5,7 +5,7 @@ import org.openrndr.color.ColorRGBa
import org.openrndr.color.ConvertibleToColorRGBa
import org.openrndr.draw.ShadeStyle
import org.openrndr.extra.parameters.Description
import org.openrndr.extras.color.spaces.ColorOKLABa
import org.openrndr.extra.color.spaces.ColorOKLABa
import org.openrndr.math.CastableToVector4
import org.openrndr.math.Vector2

View File

@@ -6,7 +6,7 @@ import org.openrndr.draw.shadeStyle
import org.openrndr.extra.parameters.ColorParameter
import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter
import org.openrndr.extras.color.spaces.ColorOKLABa
import org.openrndr.extra.color.spaces.ColorOKLABa
import org.openrndr.math.CastableToVector4
import org.openrndr.math.Vector2

View File

@@ -13,7 +13,7 @@ import org.openrndr.draw.ShadeStyleGLSL.Companion.vertexMainConstants
import org.openrndr.extra.shaderphrases.preprocess
import org.openrndr.extra.shapes.phrases.BezierPhraseBook
import org.openrndr.extras.color.phrases.ColorPhraseBook
import org.openrndr.extras.color.spaces.ColorOKLABa
import org.openrndr.extra.color.spaces.ColorOKLABa
import org.openrndr.math.Vector4
import kotlin.jvm.JvmName