chromium/components/exo/wayland/protocol/chrome-color-management.xml

<?xml version="1.0" encoding="UTF-8"?>
<protocol name="chrome_color_management">

  <!--
    NOTE: This protocol was forked from an upstream proposal. Once that proposal
    is approved, we'll migrate to it. The proposal can be found at:
    https://gitlab.freedesktop.org/wayland/wayland-protocols/-/merge_requests/14
  -->

  <copyright>
	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.
  </copyright>

  <description summary="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.
  </description>

  <interface name="zcr_color_manager_v1" version="6">
    <description summary="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.
    </description>

    <enum name="eotf_names">
      <description summary="well-known EOTF names">
	Names that describe a well-known EOTF.

	A compositor must support all of these based on the protocol interface
	version.
      </description>
      <!-- TODO EOTFs -->
      <!-- <entry name="bt1886" value="" summary="BT.1886 transfer function"/> -->
      <!-- <entry name="dci_p3" value="" summary="DCI-P3 transfer function"/> -->
      <entry name="unknown" value="0" summary="unknown EOTF"/>
      <entry name="linear" value="1" summary="Linear transfer function"/>
      <entry name="srgb" value="2" summary="sRGB transfer function"/>
      <entry name="bt2087" value="3" summary="BT.2087 transfer function"/>
      <entry name="adobergb" value="4" summary="AdobeRGB transfer function"/>
      <entry name="pq" value="5" summary="Perceptual quantizer / SMPTEST2084"/>
	  <entry name="hlg" value="6" summary="hybrid log gamma" since="2"/>
      <entry name="bt709" value="7" summary="gamma for rec709 encoded videos" since="2"/>
      <entry name="extendedsrgb10" value="8" summary="sRGB transfer function with headroom for HDR" since="2"/>
      <entry name="smpte170m" value="9" summary="SMPTE240M transfer function" since="5"/>
      <entry name="smpte240m" value="10" summary="SMPTE240M transfer function" since="5"/>
      <entry name="smptest428_1" value="11" summary="SMPTEST428_1 transfer function" since="5"/>
      <entry name="log" value="12" summary="LOG transfer function" since="5"/>
      <entry name="log_sqrt" value="13" summary="LOG Sqrt transfer function" since="5"/>
      <entry name="iec61966_2_4" value="14" summary="IEC61966_2_4 transfer function" since="5"/>
      <entry name="bt1361_ecg" value="15" summary="BT1361_ECG transfer function" since="5"/>
      <entry name="bt2020_10" value="16" summary="BT2020_10 transfer function" since="5"/>
      <entry name="bt2020_12" value="17" summary="BT2020_12 transfer function" since="5"/>
      <entry name="scrgb_linear_80_nits" value="18" summary="SCRGB Linear transfer function" since="5"/>
      <entry name="gamma18" value="19" summary="GAMMA18 transfer function" since="5"/>
      <entry name="gamma28" value="20" summary="GAMMA28 transfer function" since="5"/>
      <entry name="srgb_hdr" value="21" summary="sRGB transfer function" since="6"/>
    </enum>

    <enum name="chromaticity_names">
      <description summary="well-known chromaticity names">
	Names that describe well-known chromaticities.

	A compositor must support all of these based on the protocol interface
	version.
      </description>
      <entry name="unknown" value="0" summary="unknown chromaticity"/>
      <entry name="bt601_525_line" value="1"
             summary="ITU-R BT.601 http://www.itu.int/rec/R-REC-BT.601/en"/>
      <entry name="bt601_625_line" value="2"
             summary="ITU-R BT.601 http://www.itu.int/rec/R-REC-BT.601/en"/>
      <entry name="smpte170m" value="3"
             summary="SMPTE 170M-1999 https://www.itu.int/rec/R-REC-BT.1700/en"/>
      <entry name="bt709" value="4"
             summary="ITU-R BT.709 https://www.itu.int/rec/R-REC-BT.709/en"/>
      <entry name="bt2020" value="5"
             summary="ITU-R BT.2020 http://www.itu.int/rec/R-REC-BT.2020/en"/>
      <entry name="srgb" value="6"
             summary="IEC/4WD 61966-2-1: sRGB https://webstore.iec.ch/publication/6169"/>
      <entry name="displayp3" value="7"
             summary="Display P3 https://developer.apple.com/reference/coregraphics/cgcolorspace/1408916-displayp3"/>
      <entry name="adobergb" value="8"
             summary="Adobe RGB https://www.adobe.com/digitalimag/pdfs/AdobeRGB1998.pdf"/>
      <entry name="wide_gamut_color_spin" value="9"
             summary="" since="5"/>
      <entry name="bt470m" value="10"
             summary="" since="5"/>
      <entry name="smpte240m" value="11"
             summary="" since="5"/>
      <entry name="xyz_d50" value="12"
             summary="" since="5"/>
      <entry name="smptest428_1" value="13"
             summary="" since="5"/>
      <entry name="smptest431_2" value="14"
             summary="" since="5"/>
      <entry name="film" value="15"
             summary="" since="5"/>
    </enum>

    <enum name="whitepoint_names">
      <description summary="well-known whitepoint names">
	Names that describe well-known whitepoints.

	A compositor must support all of these based on the protocol interface
	version.
      </description>
      <!-- TODO Whitepoints -->
      <!-- <entry name="d55" value="" summary="D55 whitepoint"/> -->
      <entry name="unknown" value="0" summary="unknown whitepoint"/>
      <entry name="dci" value="1" summary="DCI whitepoint"/>
      <entry name="d50" value="2" summary="D50 whitepoint"/>
      <entry name="d65" value="3" summary="D65 whitepoint"/>
    </enum>

    <enum name="error">
      <entry name="icc_fd" value="0" summary="given ICC fd has bad properties"/>
      <entry name="bad_enum" value="1" summary="bad value given as a well-known name"/>
      <entry name="bad_param" value="2" summary="bad parameter value"/>
    </enum>

    <request name="create_color_space_from_icc">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_creator_v1"/>
      <arg name="icc" type="fd"/>
    </request>

    <request name="create_color_space_from_names">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_creator_v1"/>
      <arg name="eotf" type="uint" enum="eotf_names" summary="EOTF"/>
      <arg name="chromaticity" type="uint" enum="chromaticity_names" summary="chromaticity"/>
      <arg name="whitepoint" type="uint" enum="whitepoint_names" summary="whitepoint"/>
    </request>

    <request name="create_color_space_from_params">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_creator_v1"/>
      <arg name="eotf" type="uint" enum="eotf_names" summary="EOTF"/>
      <arg name="primary_r_x" type="uint" summary="red primary X * 10000"/>
      <arg name="primary_r_y" type="uint" summary="red primary Y * 10000"/>
      <arg name="primary_g_x" type="uint" summary="green primary X * 10000"/>
      <arg name="primary_g_y" type="uint" summary="green primary Y * 10000"/>
      <arg name="primary_b_x" type="uint" summary="blue primary X * 10000"/>
      <arg name="primary_b_y" type="uint" summary="blue primary Y * 10000"/>
      <arg name="white_point_x" type="uint" summary="white point X * 10000"/>
      <arg name="white_point_y" type="uint" summary="white point Y * 10000"/>
    </request>

    <request name="get_color_management_output">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_management_output_v1"/>
      <arg name="output" type="object" interface="wl_output"/>
    </request>

    <request name="get_color_management_surface">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_management_surface_v1"/>
      <arg name="surface" type="object" interface="wl_surface"/>
    </request>

    <request name="destroy" type="destructor">
      <description summary="destroy the color manager">
	Destroy the zcr_color_manager_v1 object. This does not affect any other
	objects in any way.
      </description>
    </request>

    <!-- Version 3 additions -->

    <enum name="matrix_names">
      <description summary="For specifying color matrices">
	Names that describe typical ColorSpace Matrix IDs

      </description>
      <entry name="unknown" value="0" summary="Unknown range"/>
      <entry name="rgb" value="1" summary="RGB matrix"/>
      <entry name="bt709" value="2" summary="BT709 matrix"/>
      <entry name="bt2020_ncl" value="3" summary="BT2020_NCL matrix"/>
      <entry name="bt2020_cl" value="4" summary="BT2020_CL matrix"/>
      <entry name="fcc" value="5" summary="FCC matrix"/>
      <entry name="smpte170m" value="6" summary="SMPTE170M matrix"/>
      <entry name="smpte240m" value="7" summary="SMPTE240M matrix"/>
      <entry name="ydzdx" value="8" summary="YDZDX matrix" since="5"/>
      <entry name="bt470bg" value="9" summary="BT470BG matrix" since="5"/>
      <entry name="gbr" value="10" summary="GBR matrix" since="5"/>
      <entry name="ycocg" value="11" summary="YCOCG matrix" since="5"/>
    </enum>

    <enum name="range_names">
      <description summary="For specifying RGB ranges">
	Names that describe typical RGB value ranges.

      </description>
      <entry name="unknown" value="0" summary="Unknown range"/>
      <entry name="limited" value="1" summary="Limited RGB color range (values from 16-235 for 8-bit)"/>
      <entry name="full" value="2" summary="Full RGB color range (values from 0 to 255 for 8-bit)"/>
      <entry name="derived" value="3" summary="Range is defined by EOTF/MatrixID"/>
    </enum>

    <request name="create_color_space_from_complete_names" since="3">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_creator_v1"/>
      <arg name="eotf" type="uint" enum="eotf_names" summary="EOTF"/>
      <arg name="chromaticity" type="uint" enum="chromaticity_names" summary="chromaticity"/>
      <arg name="whitepoint" type="uint" enum="whitepoint_names" summary="whitepoint"/>
      <arg name="matrix" type="uint" enum="matrix_names" summary="color matrix"/>
      <arg name="range" type="uint" enum="range_names" summary="color range"/>
    </request>

    <request name="create_color_space_from_complete_params" since="3">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_creator_v1"/>
      <arg name="eotf" type="uint" enum="eotf_names" summary="EOTF"/>
      <arg name="matrix" type="uint" enum="matrix_names" summary="Color matrix"/>
      <arg name="range" type="uint" enum="range_names" summary="Color range"/>
      <arg name="primary_r_x" type="uint" summary="red primary X * 10000"/>
      <arg name="primary_r_y" type="uint" summary="red primary Y * 10000"/>
      <arg name="primary_g_x" type="uint" summary="green primary X * 10000"/>
      <arg name="primary_g_y" type="uint" summary="green primary Y * 10000"/>
      <arg name="primary_b_x" type="uint" summary="blue primary X * 10000"/>
      <arg name="primary_b_y" type="uint" summary="blue primary Y * 10000"/>
      <arg name="white_point_x" type="uint" summary="white point X * 10000"/>
      <arg name="white_point_y" type="uint" summary="white point Y * 10000"/>
    </request>
  </interface>

  <interface name="zcr_color_management_output_v1" version="4">
    <description summary="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.
    </description>

    <event name="color_space_changed">
      <description summary="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.
      </description>
    </event>

    <event name="extended_dynamic_range">
      <description summary="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.
      </description>
      <arg name="value" type="uint" summary="EDR value * 1000"/>
    </event>

    <request name="get_color_space">
      <description summary="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.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_v1"/>
    </request>

    <!-- TODO: HDR capabilities event -->

    <request name="destroy" type="destructor">
      <description summary="destroy the color management output">
	Destroy the color zcr_color_management_output_v1 object. This does not
	affect any remaining protocol objects.
      </description>
    </request>
  </interface>

  <interface name="zcr_color_management_surface_v1" version="4">
    <description summary="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.
    </description>

    <enum name="render_intent">
      <description summary="render intent">
	<!-- FIXME: rendering intent is not just a hint -->
	Rendering intent allow the client to hint at how to perform color space
	transformations.

	See the ICC specification for more details about rendering intent.
      </description>
      <entry name="perceptual" value="0" summary="perceptual"/>
      <entry name="relative" value="1" summary="media-relative colorimetric"/>
      <entry name="saturation" value="2" summary="saturation"/>
      <entry name="absolute" value="3" summary="ICC-absolute colorimetric"/>
      <entry name="relative_bpc" value="4" summary="media-relative colorimetric + black point compensation"/>
    </enum>

    <enum name="alpha_mode">
      <description summary="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.
      </description>
      <entry name="straight" value="0" summary="alpha is independent from color channels"/>
      <entry name="premultiplied" value="1" summary="alpha is pre-multiplied into color channels"/>
    </enum>

    <request name="set_alpha_mode">
      <description summary="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.
      </description>
      <arg name="alpha_mode" type="uint" enum="alpha_mode" summary="alpha mode"/>
    </request>

    <request name="set_extended_dynamic_range">
      <description summary="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.
      </description>
     <arg name="value" type="uint" summary="EDR value * 1000"/>
    </request>

    <request name="set_color_space">
      <description summary="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.

	<!-- FIXME: same problem as in the render_intent enum -->
	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.
      </description>
      <arg name="color_space" type="object" interface="zcr_color_space_v1"/>
      <arg name="render_intent" type="uint" enum="render_intent" summary="render intent"/>
    </request>

    <request name="set_default_color_space">
      <description summary="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.
      </description>
    </request>

    <!-- TODO: HDR metadata request -->

    <event name="preferred_color_space">
      <description summary="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.
      </description>
      <arg name="output" type="object" interface="wl_output"/>
    </event>

    <request name="destroy" type="destructor">
      <description summary="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.
      </description>
    </request>
  </interface>

  <interface name="zcr_color_space_creator_v1" version="4">
    <description summary="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.
    </description>

    <enum name="creation_error" bitfield="true">
      <description summary="color space creation error">
	Bitmask of errors which occured while trying to create a color space
      </description>
      <entry name="malformed_icc" value="0x1" summary="malformed ICC profile"/>
      <entry name="bad_icc" value="0x2" summary="ICC profile does not meet requirements"/>
      <entry name="bad_primaries" value="0x4" summary="bad primaries"/>
      <entry name="bad_whitepoint" value="0x8" summary="bad whitepoint"/>
    </enum>

    <event name="created">
      <description summary="color space object created">
	Delivers the successfully created color space.

	The resulting color space object does not allow get_information request.
      </description>
      <arg name="id" type="new_id" interface="zcr_color_space_v1"/>
    </event>

    <event name="error">
      <description summary="color space creation failed">
	This event is sent if the color space creation failed.
      </description>
      <arg name="error" type="uint" enum="creation_error" summary="error bitmask"/>
    </event>
  </interface>

  <interface name="zcr_color_space_v1" version="4">
    <description summary="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.
    </description>

    <enum name="error">
      <entry name="no_information" value="0" summary="get_information disallowed"/>
    </enum>

    <request name="get_information">
      <description summary="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.
      </description>
    </request>

    <event name="icc_file">
      <description summary="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.
      </description>
      <arg name="icc" type="fd" summary="ICC profile file descriptor"/>
      <arg name="icc_size" type="uint" summary="ICC profile size, in bytes"/>
    </event>

    <event name="names">
      <description summary="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.
      </description>
      <arg name="eotf" type="uint" enum="zcr_color_manager_v1.eotf_names" summary="EOTF"/>
      <arg name="chromaticity" type="uint" enum="zcr_color_manager_v1.chromaticity_names" summary="chromaticity"/>
      <arg name="whitepoint" type="uint" enum="zcr_color_manager_v1.whitepoint_names" summary="whitepoint"/>
    </event>

    <event name="params">
      <description summary="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.
      </description>
      <arg name="eotf" type="uint" enum="zcr_color_manager_v1.eotf_names" summary="EOTF"/>
      <arg name="primary_r_x" type="uint" summary="red primary X * 10000"/>
      <arg name="primary_r_y" type="uint" summary="red primary Y * 10000"/>
      <arg name="primary_g_x" type="uint" summary="green primary X * 10000"/>
      <arg name="primary_g_y" type="uint" summary="green primary Y * 10000"/>
      <arg name="primary_b_x" type="uint" summary="blue primary X * 10000"/>
      <arg name="primary_b_y" type="uint" summary="blue primary Y * 10000"/>
      <arg name="white_point_x" type="uint" summary="white point X * 10000"/>
      <arg name="white_point_y" type="uint" summary="white point Y * 10000"/>
    </event>

    <event name="done">
      <description summary="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.
      </description>
    </event>

    <request name="destroy" type="destructor">
      <description summary="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.
      </description>
    </request>

	<!-- Version 3 additions -->

    <event name="complete_names" since="3">
      <description summary="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.
      </description>
      <arg name="eotf" type="uint" enum="zcr_color_manager_v1.eotf_names" summary="EOTF"/>
      <arg name="chromaticity" type="uint" enum="zcr_color_manager_v1.chromaticity_names" summary="chromaticity"/>
      <arg name="whitepoint" type="uint" enum="zcr_color_manager_v1.whitepoint_names" summary="whitepoint"/>
      <arg name="matrix" type="uint" enum="zcr_color_manager_v1.matrix_names" summary="Color matrix"/>
      <arg name="range" type="uint" enum="zcr_color_manager_v1.range_names" summary="Color range"/>
    </event>

    <event name="complete_params" since="3">
      <description summary="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.
      </description>
      <arg name="eotf" type="uint" enum="zcr_color_manager_v1.eotf_names" summary="EOTF"/>
      <arg name="matrix" type="uint" enum="zcr_color_manager_v1.matrix_names" summary="Color matrix"/>
      <arg name="range" type="uint" enum="zcr_color_manager_v1.range_names" summary="Color range"/>
      <arg name="primary_r_x" type="uint" summary="red primary X * 10000"/>
      <arg name="primary_r_y" type="uint" summary="red primary Y * 10000"/>
      <arg name="primary_g_x" type="uint" summary="green primary X * 10000"/>
      <arg name="primary_g_y" type="uint" summary="green primary Y * 10000"/>
      <arg name="primary_b_x" type="uint" summary="blue primary X * 10000"/>
      <arg name="primary_b_y" type="uint" summary="blue primary Y * 10000"/>
      <arg name="white_point_x" type="uint" summary="white point X * 10000"/>
      <arg name="white_point_y" type="uint" summary="white point Y * 10000"/>
    </event>
  </interface>

</protocol>