Chromium color management

color management protocol

This protocol specifies a way for a client to set the color space and HDR metadata of a surface and to get information about the color spaces and HDR capabilities of outputs.

This protocol is based on a proposed upstream protocol, which we will migrate to once it is approved. It may diverge from the proposed upstream protocol over the course of our development.

color manager singleton

A global interface used for getting color management surface and color management output objects as well as creating color space objects from ICC profiles, parameters, or enumerated names.

create_color_space_from_icc(id: new_id<zcr_color_space_creator_v1>, icc: fd)
Argument
Type
Description
idnew_id<zcr_color_space_creator_v1>
iccfd
create a color space object from ICC profiles

Create a color space object from an ICC profile. This request returns a zcr_color_space_creator_v1 object which either returns an error or the successfully created zcr_color_space_v1 object.

The description of the color space to create is sent in the form of an ICC profile as a file descriptor in the argument icc.

The fd must be seekable and the maximum size of the ICC profile is 4 MB. Violating these requirements will raise an icc_fd protocol error. A compositor must not modify the contents of the file, and the fd may be sealed for writes and size changes.

The file contents must represent a valid ICC profile. The ICC profile version must be 2 or 4, it must be a 3 channel profile and the class must be 'input', 'output', 'abstract' or 'display'. Violating these requirements will not result in a protocol error but raise the zcr_color_space_creator_v1.error event.

See the zcr_color_space_v1 and zcr_color_space_creator_v1 interface for more details about the created object.

See the specification from International Color Consortium for more details about ICC profiles, also known as ISO 15076-1:2010.

create a color space object from well-known names

[Deprecated] Create a color space object from well-known names. This request returns a zcr_color_space_creator_v1 object which either returns an error or the successfully created zcr_color_space_v1 object.

EOTF, chromaticity and whitepoint must not be unknown. Otherwise, or if a given value is not listed in the enumeration, the protocol error bad_enum is raised.

See the zcr_color_space_v1 and zcr_color_space_creator_v1 interface for more details about the created object. Use create_color_space_from_complete_names instead.

create_color_space_from_params(id: new_id<zcr_color_space_creator_v1>, eotf: uint<zcr_color_manager_v1.eotf_names>, primary_r_x: uint, primary_r_y: uint, primary_g_x: uint, primary_g_y: uint, primary_b_x: uint, primary_b_y: uint, white_point_x: uint, white_point_y: uint)
Argument
Type
Description
idnew_id<zcr_color_space_creator_v1>
eotfuint<zcr_color_manager_v1.eotf_names>
EOTF
primary_r_xuint
red primary X * 10000
primary_r_yuint
red primary Y * 10000
primary_g_xuint
green primary X * 10000
primary_g_yuint
green primary Y * 10000
primary_b_xuint
blue primary X * 10000
primary_b_yuint
blue primary Y * 10000
white_point_xuint
white point X * 10000
white_point_yuint
white point Y * 10000
create a color space object from parameters

[Deprecated] Create a color space object from parameters. This request returns a zcr_color_space_creator_v1 object which either returns an error or the successfully created zcr_color_space_v1 object.

EOTF must not be unknown. Otherwise, or if a given EOTF is not listed in the enumeration, the protocol error bad_enum is raised.

The white point must be inside the triangle created by the red, green and blue primaries. Otherwise the bad_param protocol error is raised.

All the chromaticity values are multiplied by 10000 to produce the integers carried by the protocol.

See the zcr_color_space_v1 and zcr_color_space_creator_v1 interface for more details about the created object. Use create_color_space_from_complete_params instead.

get_color_management_output(id: new_id<zcr_color_management_output_v1>, output: object<wl_output>)
Argument
Type
Description
idnew_id<zcr_color_management_output_v1>
outputobject<wl_output>
create a color management interface for a wl_output

This creates a new zcr_color_management_output_v1 object for the given wl_output.

See the zcr_color_management_output_v1 interface for more details.

get_color_management_surface(id: new_id<zcr_color_management_surface_v1>, surface: object<wl_surface>)
Argument
Type
Description
idnew_id<zcr_color_management_surface_v1>
surfaceobject<wl_surface>
create a color management interface for a wl_surface

This creates a new color zcr_color_management_surface_v1 object for the given wl_surface.

See the zcr_color_management_surface_v1 interface for more details.

destroy()
destroy the color manager

Destroy the zcr_color_manager_v1 object. This does not affect any other objects in any way.

create a color space object from well-known names

Create a color space object from well-known names. This request returns a zcr_color_space_creator_v1 object which either returns an error or the successfully created zcr_color_space_v1 object.

EOTF, chromaticity and whitepoint must not be unknown. Otherwise, or if a given value is not listed in the enumeration, the protocol error bad_enum is raised.

This request additionally includes matrix and range information.

See the zcr_color_space_v1 and zcr_color_space_creator_v1 interface for more details about the created object.

Argument
Type
Description
idnew_id<zcr_color_space_creator_v1>
eotfuint<zcr_color_manager_v1.eotf_names>
EOTF
matrixuint<zcr_color_manager_v1.matrix_names>
Color matrix
rangeuint<zcr_color_manager_v1.range_names>
Color range
primary_r_xuint
red primary X * 10000
primary_r_yuint
red primary Y * 10000
primary_g_xuint
green primary X * 10000
primary_g_yuint
green primary Y * 10000
primary_b_xuint
blue primary X * 10000
primary_b_yuint
blue primary Y * 10000
white_point_xuint
white point X * 10000
white_point_yuint
white point Y * 10000
create a color space object from parameters

Create a color space object from parameters. This request returns a zcr_color_space_creator_v1 object which either returns an error or the successfully created zcr_color_space_v1 object.

EOTF must not be unknown. Otherwise, or if a given EOTF is not listed in the enumeration, the protocol error bad_enum is raised.

The white point must be inside the triangle created by the red, green and blue primaries. Otherwise the bad_param protocol error is raised.

All the chromaticity values are multiplied by 10000 to produce the integers carried by the protocol.

This request additionally includes matrix and range information.

See the zcr_color_space_v1 and zcr_color_space_creator_v1 interface for more details about the created object.

Argument
Value
Description
unknown0
unknown EOTF
linear1
Linear transfer function
srgb2
sRGB transfer function
bt20873
BT.2087 transfer function
adobergb4
AdobeRGB transfer function
pq5
Perceptual quantizer / SMPTEST2084
hlgsince 26
hybrid log gamma
bt709since 27
gamma for rec709 encoded videos
extendedsrgb10since 28
sRGB transfer function with headroom for HDR
smpte170msince 59
SMPTE240M transfer function
smpte240msince 510
SMPTE240M transfer function
smptest428_1since 511
SMPTEST428_1 transfer function
logsince 512
LOG transfer function
log_sqrtsince 513
LOG Sqrt transfer function
iec61966_2_4since 514
IEC61966_2_4 transfer function
bt1361_ecgsince 515
BT1361_ECG transfer function
bt2020_10since 516
BT2020_10 transfer function
bt2020_12since 517
BT2020_12 transfer function
scrgb_linear_80_nitssince 518
SCRGB Linear transfer function
gamma18since 519
GAMMA18 transfer function
gamma28since 520
GAMMA28 transfer function
srgb_hdrsince 621
sRGB transfer function
well-known EOTF names

Names that describe a well-known EOTF.

A compositor must support all of these based on the protocol interface version.

Argument
Value
Description
unknown0
unknown chromaticity
bt601_525_line1
ITU-R BT.601 http://www.itu.int/rec/R-REC-BT.601/en
bt601_625_line2
ITU-R BT.601 http://www.itu.int/rec/R-REC-BT.601/en
smpte170m3
SMPTE 170M-1999 https://www.itu.int/rec/R-REC-BT.1700/en
bt7094
ITU-R BT.709 https://www.itu.int/rec/R-REC-BT.709/en
bt20205
ITU-R BT.2020 http://www.itu.int/rec/R-REC-BT.2020/en
srgb6
IEC/4WD 61966-2-1: sRGB https://webstore.iec.ch/publication/6169
displayp37
Display P3 https://developer.apple.com/reference/coregraphics/cgcolorspace/1408916-displayp3
adobergb8
Adobe RGB https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf
wide_gamut_color_spinsince 59
bt470msince 510
smpte240msince 511
xyz_d50since 512
smptest428_1since 513
smptest431_2since 514
filmsince 515
well-known chromaticity names

Names that describe well-known chromaticities.

A compositor must support all of these based on the protocol interface version.

whitepoint_names { unknown, dci, d50, d65 } 
Argument
Value
Description
unknown0
unknown whitepoint
dci1
DCI whitepoint
d502
D50 whitepoint
d653
D65 whitepoint
well-known whitepoint names

Names that describe well-known whitepoints.

A compositor must support all of these based on the protocol interface version.

Argument
Value
Description
icc_fd0
given ICC fd has bad properties
bad_enum1
bad value given as a well-known name
bad_param2
bad parameter value
Argument
Value
Description
unknown0
Unknown range
rgb1
RGB matrix
bt7092
BT709 matrix
bt2020_ncl3
BT2020_NCL matrix
bt2020_cl4
BT2020_CL matrix
fcc5
FCC matrix
smpte170m6
SMPTE170M matrix
smpte240m7
SMPTE240M matrix
ydzdxsince 58
YDZDX matrix
bt470bgsince 59
BT470BG matrix
gbrsince 510
GBR matrix
ycocgsince 511
YCOCG matrix
For specifying color matrices

Names that describe typical ColorSpace Matrix IDs

range_names { unknown, limited, full, derived } 
Argument
Value
Description
unknown0
Unknown range
limited1
Limited RGB color range (values from 16-235 for 8-bit)
full2
Full RGB color range (values from 0 to 255 for 8-bit)
derived3
Range is defined by EOTF/MatrixID
For specifying RGB ranges

Names that describe typical RGB value ranges.


output color properties

A zcr_color_management_output_v1 describes the color properties of an output.

When zcr_color_management_output_v1 object is created, it will send its initial events followed by a wl_output.done event. When creating wl_output and its extension objects, use a final wl_display.sync to guarantee that all output events have been received across all extensions.

If the wl_output associated with the zcr_color_management_output_v1 is destroyed, the zcr_color_management_output_v1 object becomes inert.

get_color_space(id: new_id<zcr_color_space_v1>)
Argument
Type
Description
idnew_id<zcr_color_space_v1>
get the color space of the output

This creates a new zcr_color_space_v1 object for the current color space of the output. There always is exactly one color space active for an output so the client should destroy the color space created by earlier invocations of this request. This request is usually sent as a reaction to the color_space_changed event or when creating a zcr_color_management_output_v1 object.

The created zcr_color_space_v1 object preserves the color space of the output from the time the object was created.

The resulting color space object allows get_information request.

See the zcr_color_space_v1 interface for more details.

destroy()
destroy the color management output

Destroy the color zcr_color_management_output_v1 object. This does not affect any remaining protocol objects.

color_space_changed()
color space changed

The color_space_changed event is sent whenever the color space of the output changed, followed by one wl_output.done event common to output events across all extensions.

This is not an initial event.

extended_dynamic_range(value: uint)
Argument
Type
Description
valueuint
EDR value * 1000
output extended dynamic range

This is both an initial event and sent whenever the value changed. When the value changed, this event is followed by one wl_output.done event common to output events across all extensions.

The extended dynamic range value describes how much dynamic range is available relative to the SDR maximum white. EDR value is proportional to luminance, and the luminance of black is used as the zero level. A value of 1.0 means that the the display can not display anything brighter than SDR maximum white. A value of 3.0 means that the SDR maximum white is at one third of the highest luminance the display can produce.

The absolute luminance of the SDR maximum white depends on the monitor capabilities, the viewing conditions and the viewer personal preferences. A such, it cannot be given a single value in cd/m². Compositors using HDR video modes should allow users to control the the SDR maximum white level which the output EDR value is calculated from.

The SDR maximum white is a relative reference luminance that allows to tone-map content from different dynamic ranges into a single common dynamic range for display.

The EDR value is multiplied by 1000 to produce the integer value carried by the protocol.


color management extension to a surface

A zcr_color_management_surface_v1 allows the client to set the color space and HDR properties of a surface.

If the wl_surface associated with the zcr_color_management_surface_v1 is destroyed, the zcr_color_management_surface_v1 object becomes inert.

Argument
Type
Description
alpha_modeuint<zcr_color_management_surface_v1.alpha_mode>
alpha mode
set the surface alpha mode

Assuming an alpha channel exists, it is always linear. The alpha mode determines whether the color channels include alpha pre-multiplied or not. Using straight alpha might have performance benefits.

Alpha mode is double buffered, and will be applied at the time wl_surface.commit of the corresponding wl_surface is called.

By default, a surface is assumed to have pre-multiplied alpha.

set_extended_dynamic_range(value: uint)
Argument
Type
Description
valueuint
EDR value * 1000
set the content extended dynamic range

Set the extended dynamic range (EDR) value for the underlying surface. The EDR value is double buffered, and will be applied at the time wl_surface.commit of the corresponding wl_surface is called.

The EDR value describes how much dynamic range is encoded relative to the SDR maximum white. EDR value is proportional to luminance, using the luminance of black as the zero level. A value of 1.0 means that the SDR maximum white is the highest possible luminance of the surface. A value of 3.0 means that the SDR maximum white is one third of the highest possible luminance of the surface.

The color space attached to the surface can make the code values in the buffer non-linear in regards to the luminance. The code value to produce a third of the luminance of the biggest code value therefore might not be one third of the biggest code value.

For the definition of the SDR maximum white on an output, see zcr_color_management_output_v1.extended_dynamic_range. Content producers are free to choose their SDR maximum white level. How it shall be displayed depends on the monitor capabilities and the output EDR value.

By default the EDR value is 1.0. The compositor will tone map the image to match the EDR of each output the surface is shown on. The aim for the EDR-EDR mapping is to produce a relative luminance mapping that looks equally good regardless of the viewing conditions and the monitor capabilities, assuming the output EDR value was tuned to the output capabilities and the viewing environment. There might be performance and image quality benefits from providing content readily tone mapped to the EDR value of the output the surface is shown on.

The EDR value is multiplied by 1000 to produce the integer value carried by the protocol.

set the surface color space

Set the color space of the underlying surface. The color space and render intent are double buffered, and will be applied at the time wl_surface.commit of the corresponding wl_surface is called.

The render intent gives the compositor a hint what to optimize for in color space transformations.

By default, a surface is assumed to have the sRGB color space and an arbitrary render intent.

If the color space of the surface matches the color space of an output it is shown on the performance and color accuracy might improve. To find those color spaces the client can listen to the preferred_color_space or the wl_surface.enter/leave events. This improvement may require using the color space object created by zcr_color_management_output_v1.get_color_space.

set_default_color_space()
set the surface color space to default

This request sets the surface color space to the defaults, see set_color_space. The setting will be applied at the time wl_surface.commit of the corresponding wl_surface is called.

destroy()
destroy the color management interface for a surface

Destroy the zcr_color_management_surface_v1 object.

When the last zcr_color_management_surface_v1 object for a wl_surface is destroyed, the destruction will pend unsetting the wl_surface's color space, render intent and alpha mode similar to set_color_space will pend a set.

preferred_color_space(output: object<wl_output>)
Argument
Type
Description
outputobject<wl_output>
output for color optimization

The preferred_color_space event is sent when the compositor determines or switches the output that implies the preferred color space. The preferred color space is the one which likely has the most performance and quality benefits if used by a client for its surface contents.

The event does not carry a zcr_color_space_v1 but a wl_output object. The concrete zcr_color_space_v1 can be created by calling zcr_color_management_output_v1.get_color_space on the output and listening to zcr_color_management_output_v1.color_space_changed events.

As clients may bind to the same global wl_output multiple times, this event is sent for each bound instance that matches the preferred color space output. If a client has not bound to the right wl_output global at all, this event is not sent.

This is only a hint and clients can set any valid color space with set_color_space but there might be performance and color accuracy improvements by providing the surface in the preferred color space.

Argument
Value
Description
perceptual0
perceptual
relative1
media-relative colorimetric
saturation2
saturation
absolute3
ICC-absolute colorimetric
relative_bpc4
media-relative colorimetric + black point compensation
render intent

Rendering intent allow the client to hint at how to perform color space transformations.

See the ICC specification for more details about rendering intent.

alpha_mode { straight, premultiplied } 
Argument
Value
Description
straight0
alpha is independent from color channels
premultiplied1
alpha is pre-multiplied into color channels
alpha mode

Specifies whether alpha is pre-multiplied into color channels or not. If pre-multiplied, the linear alpha value is already multiplied with the (non-linear) color channel code values in the color channels.


color space creator

A zcr_color_space_creator_v1 object returns a created color space or the error which occured during creation.

Once a zcr_color_space_creator_v1 object has delivered a 'created' or 'error' event it is automatically destroyed.

created(id: new_id<zcr_color_space_v1>)
Argument
Type
Description
idnew_id<zcr_color_space_v1>
color space object created

Delivers the successfully created color space.

The resulting color space object does not allow get_information request.

Argument
Type
Description
erroruint<zcr_color_space_creator_v1.creation_error>
error bitmask
color space creation failed

This event is sent if the color space creation failed.

Argument
Value
Description
malformed_icc0x1
malformed ICC profile
bad_icc0x2
ICC profile does not meet requirements
bad_primaries0x4
bad primaries
bad_whitepoint0x8
bad whitepoint
color space creation error

Bitmask of errors which occured while trying to create a color space


color space

Refers to a color space which can be attached to a surface (zcr_color_management_surface_v1.set_color_space). It may provide information like the ICC profile and the well-known names to allow clients to know the color space and do color transformations of their own.

Once created and regardless of how it was created, a zcr_color_space_v1 object always refers to one fixed color space.

The client can create a zcr_color_space_v1 object with zcr_color_manager_v1 requests or from an output by calling zcr_color_management_output_v1.get_color_space.

Other extensions may define more zcr_color_space_v1 factory interfaces. Those interfaces must explicitly specify the interface version for the object created, otherwise versioning zcr_color_space_v1 correctly becomes impossible. Using a 'new_id' argument without 'interface' attribute defined in XML forces code generators to add two explicit arguments: interface and version. Version is the explicit version number needed, and interface should be required to be "zcr_color_space_v1". The compositor supported zcr_color_space_v1 versions are defined by the advertised zcr_color_manager_v1 in wl_registry.

get_information()
get information about the color space

As a reply to this request, the compositor will send all available information events describing this color space object and finally the 'done' event. Other extensions may define more events to be sent before 'done'.

This request is allowed only on zcr_color_space_v1 objects where the message that created the object specifies that get_information is allowed. Otherwise protocol error no_information is raised.

Every get_information request on the same object will always return the exact same data.

See zcr_color_management_output_v1.get_color_space and zcr_color_space_creator_v1.created.

destroy()
destroy the color space

Destroy the zcr_color_space_v1 object.

Destroying the zcr_color_space_v1 which is active on a surface or an output does not change the color space of those objects.

icc_file(icc: fd, icc_size: uint)
Argument
Type
Description
iccfd
ICC profile file descriptor
icc_sizeuint
ICC profile size, in bytes
ICC profile describing the color space

This event may be sent only as a response to zcr_color_space_v1.get_information.

The icc argument provides a file descriptor to the client which can be memory-mapped to provide the ICC profile describing the color space. The fd must be mapped with MAP_PRIVATE and read-only by the client.

Compositors should send this event always when information is requested. ICC profiles provide the common foundation which all color managed clients may rely on.

well-known names of a color space

[Deprecated] This event may be sent only as a response to zcr_color_space_v1.get_information.

EOTF, chromaticity and whitepoint contain well-known names of those properties if available and unknown otherwise.

Compositors should not assume that all clients can understand these names. The names are provided for client convenience. If a client understands the name triplet, it may ignore other information about the color space, the ICC profile for example. Use complete_names instead.

Argument
Type
Description
eotfuint<zcr_color_manager_v1.eotf_names>
EOTF
primary_r_xuint
red primary X * 10000
primary_r_yuint
red primary Y * 10000
primary_g_xuint
green primary X * 10000
primary_g_yuint
green primary Y * 10000
primary_b_xuint
blue primary X * 10000
primary_b_yuint
blue primary Y * 10000
white_point_xuint
white point X * 10000
white_point_yuint
white point Y * 10000
RGB primaries along with whitepoint defining color space

[Deprecated] This event may be sent only as a response to zcr_color_space_v1.get_information.

The RGB primary value arguments along with the whitepoint value arguments and eotf can be used to define an arbitrary or custom color space.

The eotf enum contains well known names of that property, but the compositor should not assume that all clients will understand those names. Use complete_params instead.

done()
end of color space information

This event may be sent only as a response to zcr_color_space_v1.get_information.

This signifies that all color space information events have been delivered for the object.

well-known names of a color space

This event may be sent only as a response to zcr_color_space_v1.get_information.

EOTF, chromaticity, matrix, range and whitepoint contain well-known names of those properties if available and unknown otherwise.

Compositors should not assume that all clients can understand these names. The names are provided for client convenience. If a client understands the name triplet, it may ignore other information about the color space, the ICC profile for example.

Argument
Type
Description
eotfuint<zcr_color_manager_v1.eotf_names>
EOTF
matrixuint<zcr_color_manager_v1.matrix_names>
Color matrix
rangeuint<zcr_color_manager_v1.range_names>
Color range
primary_r_xuint
red primary X * 10000
primary_r_yuint
red primary Y * 10000
primary_g_xuint
green primary X * 10000
primary_g_yuint
green primary Y * 10000
primary_b_xuint
blue primary X * 10000
primary_b_yuint
blue primary Y * 10000
white_point_xuint
white point X * 10000
white_point_yuint
white point Y * 10000
RGB primaries along with whitepoint defining color space

This event may be sent only as a response to zcr_color_space_v1.get_information.

The RGB primary value arguments along with the whitepoint value arguments and eotf can be used to define an arbitrary or custom color space.

The eotf enum contains well known names of that property, but the compositor should not assume that all clients will understand those names.

error { no_information } 
Argument
Value
Description
no_information0
get_information disallowed

Compositor Support

No compositor support found

Copyright 2019 Sebastian Wick Copyright 2019 Erwin Burema Copyright 2020 AMD Copyright 2020 Collabora, Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.