diff --git a/orx-color/src/commonMain/kotlin/palettes/Classics.kt b/orx-color/src/commonMain/kotlin/palettes/Classics.kt index ba8f2853..5e4a6760 100644 --- a/orx-color/src/commonMain/kotlin/palettes/Classics.kt +++ b/orx-color/src/commonMain/kotlin/palettes/Classics.kt @@ -8,6 +8,8 @@ import org.openrndr.extra.color.tools.shiftHue /** * Generate an analogous palette * @param T the color model to use + * @param hueShift Hue degrees between the first and the last color + * @param steps Number of colors to create */ inline fun ColorRGBa.analogous(hueShift: Double, steps: Int = 5): List where T : HueShiftableColor, diff --git a/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt b/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt index 98a941d6..290e1aac 100644 --- a/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt +++ b/orx-color/src/commonMain/kotlin/spaces/TypeAliases.kt @@ -5,6 +5,7 @@ import org.openrndr.color.* typealias RGB = ColorRGBa typealias LAB = ColorLABa typealias LUV = ColorLUVa +typealias HPLuv = ColorHPLUVa typealias HSL = ColorHSLa typealias HSV = ColorHSVa typealias HSLuv = ColorHSLUVa diff --git a/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt b/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt index 0da1c828..f807bad9 100644 --- a/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt +++ b/orx-color/src/commonMain/kotlin/tools/ColorRGBaExtensions.kt @@ -18,6 +18,7 @@ inline fun > ColorRGBa.convertTo(): T { ColorHSLa::class -> this.toHSLa() ColorHSVa::class -> this.toHSVa() ColorRGBa::class -> this + ColorHPLUVa::class -> this.toHPLUVa() ColorHSLUVa::class -> this.toHSLUVa() ColorOKLABa::class -> this.toOKLABa() ColorOKLCHa::class -> this.toOKLCHa() diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt new file mode 100644 index 00000000..1d2ed406 --- /dev/null +++ b/orx-color/src/jvmDemo/kotlin/DemoColorPalette01.kt @@ -0,0 +1,60 @@ +import org.openrndr.application +import org.openrndr.color.ColorRGBa +import org.openrndr.extra.color.palettes.analogous +import org.openrndr.extra.color.palettes.splitComplementary +import org.openrndr.extra.color.palettes.tetradic +import org.openrndr.extra.color.palettes.triadic +import org.openrndr.extra.color.presets.ORANGE +import org.openrndr.extra.color.spaces.* + +/** + * Demonstrates the creation of color palettes using various available methods + */ +fun main() = application { + configure { } + program { + // HueShiftableColor: + // HPLuv HSL HSV LCHab LCHuv XSL XSV XSLuv HSLuv OKHSL OKHSV OKLCH + val palette0 = RGB.PINK.analogous(360.0, 10) + val palette1 = RGB.RED.analogous(240.0, 3) + val palette2 = RGB.YELLOW.triadic() + val palette3 = RGB.CYAN.tetradic() + val palette4 = RGB.CYAN.tetradic(0.5) + val palette5 = RGB.ORANGE.splitComplementary(0.2, true) + extend { + drawer.clear(ColorRGBa.WHITE) + drawer.stroke = ColorRGBa.BLACK.opacify(0.25) + + palette0.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(100.0 + i * 40.0, 80.0, 40.0) + } + + palette1.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(100.0 + i * 40.0, 180.0, 40.0) + } + + palette2.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(380.0 + i * 40.0, 180.0, 40.0) + } + + palette3.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(100.0 + i * 40.0, 280.0, 40.0) + } + + palette4.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(350.0 + i * 40.0, 280.0, 40.0) + } + + palette5.forEachIndexed { i, c -> + drawer.fill = c + drawer.circle(100.0 + i * 40.0, 380.0, 40.0) + } + + } + } +} \ No newline at end of file diff --git a/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt b/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt new file mode 100644 index 00000000..d9eb2b0a --- /dev/null +++ b/orx-color/src/jvmDemo/kotlin/DemoColorPalette02.kt @@ -0,0 +1,31 @@ +import org.openrndr.application +import org.openrndr.extra.color.palettes.analogous +import org.openrndr.extra.color.spaces.HSLuv +import org.openrndr.extra.color.spaces.RGB + +/** + * By default, generated palettes contain colors of varying hue + * but similar brightness and saturation. + * Here we alter the brightness of each color using .shade() for + * an increased dynamic range. + */ +fun main() = application { + program { + val count = 8 + val palette = RGB.PINK.analogous(360.0, count).mapIndexed { i, c -> + c.shade((i + 1.0) / count) + }.reversed() + extend { + drawer.stroke = null + + palette.forEachIndexed { i, c -> + drawer.fill = c + drawer.rectangle( + 0.0, i * height / count.toDouble(), + width.toDouble(), height / count.toDouble() + ) + } + + } + } +} \ No newline at end of file