All Downloads are FREE. Search and download functionalities are using the official Maven repository.

commonMain.Color.kt Maven / Gradle / Ivy

package dev.kord.common

import kotlinx.serialization.KSerializer
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.PrimitiveKind
import kotlinx.serialization.descriptors.PrimitiveSerialDescriptor
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder


@Serializable(with = Color.Serializer::class)
public class Color(rgb: Int) {
    public constructor(red: Int, green: Int, blue: Int) : this(rgb(red, green, blue))

    public val rgb: Int = rgb and 0xFFFFFF

    public val red: Int get() = (rgb shr 16) and 0xFF
    public val green: Int get() = (rgb shr 8) and 0xFF
    public val blue: Int get() = (rgb shr 0) and 0xFF

    init {
        require(this.rgb in MIN_COLOR..MAX_COLOR) { "RGB should be in range of $MIN_COLOR..$MAX_COLOR but was ${this.rgb}" }
    }

    override fun toString(): String = "Color(red=$red,green=$green,blue=$blue)"

    override fun hashCode(): Int = rgb.hashCode()

    override fun equals(other: Any?): Boolean {
        val color = other as? Color ?: return false

        return color.rgb == rgb
    }

    public companion object {
        private const val MIN_COLOR = 0
        private const val MAX_COLOR = 0xFFFFFF

        private fun rgb(red: Int, green: Int, blue: Int): Int {
            require(red in 0..255) { "Red should be in range of 0..255 but was $red" }
            require(green in 0..255) { "Green should be in range of 0..255 but was $green" }
            require(blue in 0..255) { "Blue should be in range of 0..255 but was $blue" }


            return red and 0xFF shl 16 or
                (green and 0xFF shl 8) or
                (blue and 0xFF) shl 0
        }
    }

    internal object Serializer : KSerializer {
        override val descriptor: SerialDescriptor
            get() = PrimitiveSerialDescriptor("Kord.color", PrimitiveKind.INT)

        override fun deserialize(decoder: Decoder): Color = Color(decoder.decodeInt())

        override fun serialize(encoder: Encoder, value: Color) {
            encoder.encodeInt(value.rgb)
        }
    }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy