[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 ColorLCHABa -> right.second.toRGBa().toLCHABa().mix(l, nt).toRGBa()
is ColorOKLABa -> right.second.toRGBa().toOKLABa().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 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}") else -> error("unsupported color space: ${l::class}")
}.toSRGB() }.toSRGB()
} }

View File

@@ -1,6 +1,7 @@
package org.openrndr.extra.color.spaces package org.openrndr.extra.color.spaces
import org.openrndr.color.* import org.openrndr.color.*
import org.openrndr.math.mixAngle
import kotlin.math.* import kotlin.math.*
data class ColorOKHSLa(val h: Double, val s: Double, val l: Double, val a: Double = 1.0) : 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>, OpacifiableColor<ColorOKHSLa>,
SaturatableColor<ColorOKHSLa>, SaturatableColor<ColorOKHSLa>,
ShadableColor<ColorOKHSLa>, ShadableColor<ColorOKHSLa>,
AlgebraicColor<ColorOKHSLa>,
ConvertibleToColorRGBa { ConvertibleToColorRGBa {
companion object { 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 { override fun toRGBa(): ColorRGBa {
if (l == 1.0) if (l == 1.0) {
{
ColorRGBa(1.0, 1.0, 1.0, a) 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) ColorRGBa(0.0, 0.0, 0.0, a)
} }
val a_ = cos(2*PI*h); val a_ = cos(2 * PI * h);
val b_ = sin(2*PI*h); val b_ = sin(2 * PI * h);
val L = toe_inv(l); val L = toe_inv(l);
val Cs = get_Cs(L, a_, b_); 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_0: Double
val k_1: Double val k_1: Double
val k_2: Double val k_2: Double
if (s < 0.8) if (s < 0.8) {
{ t = 1.25 * s;
t = 1.25*s;
k_0 = 0.0 k_0 = 0.0
k_1 = 0.8*C_0; k_1 = 0.8 * C_0;
k_2 = (1-k_1/C_mid); k_2 = (1 - k_1 / C_mid);
} } else {
else t = 5 * (s - 0.8);
{
t = 5*(s-0.8);
k_0 = C_mid; k_0 = C_mid;
k_1 = 0.2*C_mid*C_mid*1.25*1.25/C_0; k_1 = 0.2 * C_mid * C_mid * 1.25 * 1.25 / C_0;
k_2 = (1 - (k_1)/(C_max - C_mid)); 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: // If we would only use one of the Cs:
//C = s*C_0; //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) 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 package org.openrndr.extra.color.spaces
import org.openrndr.color.* import org.openrndr.color.*
import org.openrndr.math.mixAngle
import kotlin.math.* import kotlin.math.*
@@ -9,6 +10,7 @@ data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, val a: Doubl
OpacifiableColor<ColorOKHSVa>, OpacifiableColor<ColorOKHSVa>,
SaturatableColor<ColorOKHSVa>, SaturatableColor<ColorOKHSVa>,
ShadableColor<ColorOKHSVa>, ShadableColor<ColorOKHSVa>,
AlgebraicColor<ColorOKHSVa>,
ConvertibleToColorRGBa { ConvertibleToColorRGBa {
companion object { companion object {
@@ -88,12 +90,10 @@ data class ColorOKHSVa(val h: Double, val s: Double, val v: Double, val a: Doubl
C *= scale_L; C *= scale_L;
return ColorOKLABa(L, C * a_, C * b_).toRGBa().toSRGB() return ColorOKLABa(L, C * a_, C * b_).toRGBa().toSRGB()
} }
override fun shiftHue(shiftInDegrees: Double): ColorOKHSVa { override fun shiftHue(shiftInDegrees: Double): ColorOKHSVa {
val normalizedShift = shiftInDegrees/360.0 val normalizedShift = shiftInDegrees / 360.0
return copy(h = h + normalizedShift) 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) 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.color.ColorRGBa
import org.openrndr.draw.loadFont import org.openrndr.draw.loadFont
import org.openrndr.extensions.SingleScreenshot import org.openrndr.extensions.SingleScreenshot
import org.openrndr.extra.color.spaces.*
import org.openrndr.extras.color.palettes.rangeTo 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() { fun main() {
application { application {
@@ -27,6 +24,8 @@ fun main() {
"LCh(ab)" to (colorA.toLCHABa()..colorB.toLCHABa() blend stepCount), "LCh(ab)" to (colorA.toLCHABa()..colorB.toLCHABa() blend stepCount),
"OKLab" to (colorA.toOKLABa()..colorB.toOKLABa() blend stepCount), "OKLab" to (colorA.toOKLABa()..colorB.toOKLABa() blend stepCount),
"OKLCh" to (colorA.toOKLCHa()..colorB.toOKLCHa() 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), "HSLUV" to (colorA.toHSLUVa()..colorB.toHSLUVa() blend stepCount),
"XSLUV" to (colorA.toXSLUVa()..colorB.toXSLUVa() blend stepCount), "XSLUV" to (colorA.toXSLUVa()..colorB.toXSLUVa() blend stepCount),
) )

View File

@@ -1,7 +1,7 @@
package org.openrndr.extra.shadestyles package org.openrndr.extra.shadestyles
import org.openrndr.color.ColorRGBa import org.openrndr.color.ColorRGBa
import org.openrndr.extras.color.spaces.ColorOKLABa import org.openrndr.extra.color.spaces.ColorOKLABa
import kotlin.reflect.KClass import kotlin.reflect.KClass
internal fun generateColorTransform(kClass: KClass<*>): String { 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.parameters.DoubleParameter
import org.openrndr.extra.shaderphrases.preprocess import org.openrndr.extra.shaderphrases.preprocess
import org.openrndr.extras.color.phrases.ColorPhraseBook 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.CastableToVector4
import org.openrndr.math.Vector2 import org.openrndr.math.Vector2
import kotlin.reflect.KClass import kotlin.reflect.KClass

View File

@@ -5,7 +5,7 @@ import org.openrndr.color.ColorRGBa
import org.openrndr.color.ConvertibleToColorRGBa import org.openrndr.color.ConvertibleToColorRGBa
import org.openrndr.draw.ShadeStyle import org.openrndr.draw.ShadeStyle
import org.openrndr.extra.parameters.Description 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.CastableToVector4
import org.openrndr.math.Vector2 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.ColorParameter
import org.openrndr.extra.parameters.Description import org.openrndr.extra.parameters.Description
import org.openrndr.extra.parameters.DoubleParameter 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.CastableToVector4
import org.openrndr.math.Vector2 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.shaderphrases.preprocess
import org.openrndr.extra.shapes.phrases.BezierPhraseBook import org.openrndr.extra.shapes.phrases.BezierPhraseBook
import org.openrndr.extras.color.phrases.ColorPhraseBook 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 org.openrndr.math.Vector4
import kotlin.jvm.JvmName import kotlin.jvm.JvmName