---
title: "ColorSpace"
description: "A [ColorSpace] is used to identify a specific organization of colors. Each color space is
characterized by a [color model][ColorModel] that defines how a color value is represented (for
instance the [RGB][ColorModel.Rgb] color model defines a color value as a triplet of numbers).

Each component of a color must fall within a valid range, specific to each color space, defined
by [getMinValue] and [getMaxValue] This range is commonly `[0..1]`. While it is recommended to
use values in the valid range, a color space always clamps input and output values when
performing operations such as converting to a different color space.

### Using color spaces

This implementation provides a pre-defined set of common color spaces described in the
[ColorSpaces] object.

The documentation of [ColorSpaces] provides a detailed description of the various characteristics
of each available color space.

### Color space conversions

To allow conversion between color spaces, this implementation uses the CIE XYZ profile connection
space (PCS). Color values can be converted to and from this PCS using [toXyz] and [fromXyz].

For color space with a non-RGB color model, the white point of the PCS *must be* the CIE standard
illuminant D50. RGB color spaces use their native white point (D65 for [sRGB][ColorSpaces.Srgb]
for instance and must undergo [chromatic adaptation][Adaptation] as necessary.

Since the white point of the PCS is not defined for RGB color space, it is highly recommended to
use the [connect] method to perform conversions between color spaces. A color space can be
manually adapted to a specific white point using [adapt]. Please refer to the documentation of
[RGB color spaces][Rgb] for more information. Several common CIE standard illuminants are
provided in this class as reference (see [Illuminant.D65] or [Illuminant.D50] for instance).

Here is an example of how to convert from a color space to another:
   // Convert from DCI-P3 to Rec.2020   val connector = ColorSpaces.DciP3.connect(ColorSpaces.BT2020)   val bt2020Values = connector.transform(p3r, p3g, p3b);

You can easily convert to [sRGB][ColorSpaces.Srgb] by omitting the color space parameter:
   // Convert from DCI-P3 to sRGB   val connector = ColorSpaces.DciP3.connect()   val sRGBValues = connector.transform(p3r, p3g, p3b);

Conversions also work between color spaces with different color models:
   // Convert from CIE L*a*b* (color model Lab) to Rec.709 (color model RGB)   val connector = ColorSpaces.CieLab.connect(ColorSpaces.Bt709)

### Color spaces and multi-threading

Color spaces and other related classes ([Connector] for instance) are immutable and stateless.
They can be safely used from multiple concurrent threads."
type: "class"
---

<div class='type'>Class</div>


<a id='references'></a>

<div class='sourceset sourceset-common'>Common</div>


```kotlin
abstract class ColorSpace
internal constructor(
    /**
     * Returns the name of this color space. The name is never null and contains always at least 1
     * character.
     *
     * Color space names are recommended to be unique but are not guaranteed to be. There is no
     * defined format but the name usually falls in one of the following categories:
     * * Generic names used to identify color spaces in non-RGB color models. For instance:
     *   [Generic L*a*b*][ColorSpaces.CieLab].
     * * Names tied to a particular specification. For instance:
     *   [sRGB IEC61966-2.1][ColorSpaces.Srgb] or [SMPTE ST 2065-1:2012 ACES][ColorSpaces.Aces].
     * * Ad-hoc names, often generated procedurally or by the user during a calibration workflow.
     *   These names often contain the make and model of the display.
     *
     * Because the format of color space names is not defined, it is not recommended to
     * programmatically identify a color space by its name alone. Names can be used as a first
     * approximation.
     *
     * It is however perfectly acceptable to display color space names to users in a UI, or in
     * debuggers and logs. When displaying a color space name to the user, it is recommended to add
     * extra information to avoid ambiguities: color model, a representation of the color space's
     * gamut, white point, etc.
     *
     * @return A non-null String of length >= 1
     */
    val name: String,

    /**
     * The color model of this color space.
     *
     * @see ColorModel
     * @see componentCount
     */
    val model: ColorModel,

    /**
     * The ID of this color space. Positive IDs match the color spaces enumerated in [ColorSpaces].
     * A negative ID indicates a color space created by calling one of the public constructors.
     */
    internal val id: Int,
)
```


A `ColorSpace` is used to identify a specific organization of colors. Each color space is
characterized by a `color model` that defines how a color value is represented (for
instance the `RGB` color model defines a color value as a triplet of numbers).

Each component of a color must fall within a valid range, specific to each color space, defined
by `getMinValue` and `getMaxValue` This range is commonly ``0..1``. While it is recommended to
use values in the valid range, a color space always clamps input and output values when
performing operations such as converting to a different color space.

### Using color spaces

This implementation provides a pre-defined set of common color spaces described in the
`ColorSpaces` object.

The documentation of `ColorSpaces` provides a detailed description of the various characteristics
of each available color space.

### Color space conversions

To allow conversion between color spaces, this implementation uses the CIE XYZ profile connection
space (PCS). Color values can be converted to and from this PCS using `toXyz` and `fromXyz`.

For color space with a non-RGB color model, the white point of the PCS *must be* the CIE standard
illuminant D50. RGB color spaces use their native white point (D65 for `sRGB`
for instance and must undergo `chromatic adaptation` as necessary.

Since the white point of the PCS is not defined for RGB color space, it is highly recommended to
use the `connect` method to perform conversions between color spaces. A color space can be
manually adapted to a specific white point using `adapt`. Please refer to the documentation of
`RGB color spaces` for more information. Several common CIE standard illuminants are
provided in this class as reference (see `Illuminant.D65` or `Illuminant.D50` for instance).

Here is an example of how to convert from a color space to another:
   // Convert from DCI-P3 to Rec.2020   val connector = ColorSpaces.DciP3.connect(ColorSpaces.BT2020)   val bt2020Values = connector.transform(p3r, p3g, p3b);

You can easily convert to `sRGB` by omitting the color space parameter:
   // Convert from DCI-P3 to sRGB   val connector = ColorSpaces.DciP3.connect()   val sRGBValues = connector.transform(p3r, p3g, p3b);

Conversions also work between color spaces with different color models:
   // Convert from CIE L*a*b* (color model Lab) to Rec.709 (color model RGB)   val connector = ColorSpaces.CieLab.connect(ColorSpaces.Bt709)

### Color spaces and multi-threading

Color spaces and other related classes (`Connector` for instance) are immutable and stateless.
They can be safely used from multiple concurrent threads.


## Secondary Constructors

```kotlin
constructor(name: String, model: ColorModel) : this(name, model, MinId)
```

## Properties

<div class='sourceset sourceset-common'>Common</div>


```kotlin
val componentCount: Int
```


Returns the number of components that form a color value according to this color space's
color model.

#### Returns

| | |
| --- | --- |
|  | An integer between 1 and 4 |




<div class='sourceset sourceset-common'>Common</div>


```kotlin
abstract val isWideGamut: Boolean
```


Returns whether this color space is a wide-gamut color space. An RGB color space is
wide-gamut if its gamut entirely contains the `sRGB` gamut and if the area
of its gamut is 90% of greater than the area of the `NTSC` gamut.

#### Returns

| | |
| --- | --- |
|  | True if this color space is a wide-gamut color space, false otherwise |




<div class='sourceset sourceset-common'>Common</div>


```kotlin
open val isSrgb: Boolean
```


Indicates whether this color space is the sRGB color space or equivalent to the sRGB color
space.

A color space is considered sRGB if it meets all the following conditions:
* Its color model is `ColorModel.Rgb`. * Its primaries are within 1e-3 of the true `sRGB` primaries.   * Its white point is within 1e-3 of the CIE standard illuminant `D65`.
* Its opto-electronic transfer function is not linear.
* Its electro-optical transfer function is not linear.
* Its transfer functions yield values within 1e-3 of `ColorSpaces.Srgb`.
* Its range is ``0..1``.

This method always returns true for `ColorSpaces.Srgb`.

#### Returns

| | |
| --- | --- |
|  | True if this color space is the sRGB color space (or a close approximation), false otherwise |




## Functions

```kotlin
abstract fun getMinValue(@IntRange(from = 0, to = 3) component: Int): Float
```


Returns the minimum valid value for the specified component of this color space's color
model.

#### Parameters

| | |
| --- | --- |
| component | The index of the component, from `0` to `3`, inclusive. |


#### Returns

| | |
| --- | --- |
|  | A floating point value less than `getMaxValue` |



```kotlin
abstract fun getMaxValue(@IntRange(from = 0, to = 3) component: Int): Float
```


Returns the maximum valid value for the specified component of this color space's color
model.

#### Parameters

| | |
| --- | --- |
| component | The index of the component, from `0` to `3`, inclusive |


#### Returns

| | |
| --- | --- |
|  | A floating point value greater than `getMinValue` |



```kotlin
@Size(3)
    fun toXyz(r: Float, g: Float, b: Float): FloatArray
```


Converts a color value from this color space's model to tristimulus CIE XYZ values. If the
color model of this color space is not `RGB`, it is assumed that the target
CIE XYZ space uses a `D50` standard illuminant.

This method is a convenience for color spaces with a model of 3 components
(`RGB` or `ColorModel.Lab` for instance). With color spaces using fewer or
more components, use `toXyz` instead.

#### Parameters

| | |
| --- | --- |
| r | The first component of the value to convert from (typically R in RGB) |
| g | The second component of the value to convert from (typically G in RGB) |
| b | The third component of the value to convert from (typically B in RGB) |


#### Returns

| | |
| --- | --- |
|  | A new array of 3 floats, containing tristimulus XYZ values |



```kotlin
@Size(min = 3) abstract fun toXyz(@Size(min = 3) v: FloatArray): FloatArray
```


Converts a color value from this color space's model to tristimulus CIE XYZ values. If the
color model of this color space is not `RGB`, it is assumed that the target
CIE XYZ space uses a `D50` standard illuminant.

The specified array's length must be at least equal to to the number of color components as
returned by `ColorModel.componentCount`.

#### Parameters

| | |
| --- | --- |
| v | An array of color components containing the color space's color value to convert to XYZ, and large enough to hold the resulting tristimulus XYZ values, at least 3 values. |


#### Returns

| | |
| --- | --- |
|  | The array passed in parameter `v`. |



```kotlin
@Size(min = 3)
    fun fromXyz(x: Float, y: Float, z: Float): FloatArray
```


Converts tristimulus values from the CIE XYZ space to this color space's color model.

#### Parameters

| | |
| --- | --- |
| x | The X component of the color value |
| y | The Y component of the color value |
| z | The Z component of the color value |


#### Returns

| | |
| --- | --- |
|  | A new array whose size is equal to the number of color components as returned by `ColorModel.componentCount`. |



```kotlin
@Size(min = 3) abstract fun fromXyz(@Size(min = 3) v: FloatArray): FloatArray
```


Converts tristimulus values from the CIE XYZ space to this color space's color model. The
resulting value is passed back in the specified array.

The specified array's length must be at least equal to to the number of color components as
returned by `ColorModel.componentCount`, and its first 3 values must be the XYZ components to
convert from.

#### Parameters

| | |
| --- | --- |
| v | An array of color components containing the XYZ values to convert from, and large enough to hold the number of components of this color space's model. The minimum size is 3, but most color spaces have 4 components. |


#### Returns

| | |
| --- | --- |
|  | The array passed in parameter `v`. |



## Companion Object



