[RFC PATCH 1/6] Add colorcorrection protocol
Bill Spitzak
spitzak at gmail.com
Mon Mar 31 12:36:56 PDT 2014
Niels Ole Salscheider wrote:
> The color correction protocol allows to attach an ICC profile to a
> surface. It also tells the client about the blending color space and
> the color spaces of all outputs.
As you pointed out, it does look like this has to be done by the
compositor, because a different color correction has to be applied to a
surface for each output. Since a surface can appear on more than one
output simultaneously, and that information is not available to a
client, the compositor must do this.
> + <request name="set_profile">
> + <description summary="set the color profile of a wl_surface">
> + With this request, the color profile of a wl_surface can be set.
> + When mode is set to "profile", an ICC profile can be passed in the
> + "profile_data" argument. In all other cases, "profile_data" is
> + ignored.
> + "mode" should only be set to "uncorrected" for fullscreen applications
> + or applications that really require uncorrected output (e. g. color
> + profiling tools).
> + </description>
> + <arg name="surface" type="object" interface="wl_surface"/>
> + <arg name="mode" type="uint" />
> + <arg name="profile_data" type="array"/>
> + </request>
This should be double-buffered: it does not happen until a commit.
I would make the profile be an object, not a block of data, so it can be
reused easily. (this is in addition to the other discussion of how the
data is conveyed between client and compositor). The "mode" can be
eliminated by making special profile objects for each mode.
> + <event name="blending_space">
> + <description summary="tell the client what blending space is used">
> + This event will be sent when the blending space of the compositor
> + is changed. A client can use this information to output its surface
> + in the blending space of the compositor so that only one color
> + transform (from blending to output space) has to be performed by the
> + compositor. This can result in better performance.
> + </description>
> + <arg name="profile_data" type="array"/>
> + </event>
I don't like this description. There may be a "linear" blending space,
but the purpose is not to describe some "faster" space. In fact sending
the buffer as a linear color space may be much slower and look much worse.
A compositor does not have to implement a linear blend by converting the
source to linear space and building a buffer of linear values. Instead
it can do it with amazingly crude approximations. For instance replacing
a+b with sqrt(a^2+b^2) will do a pretty good job of adding two sRGB
images together, indistinguishable by eye from the accurate result. And
the source and destination are all in sRGB space.
The reason clients want to know the blending space is because it changes
how partially-transparent areas, in particular shadows, are stored in
the source, especially if the client wants to draw internal shadows in
the buffer that "match", or set the drag&drop cursor to am image that
actually composites correctly into the drop target.
I suspect also the blending space may vary depending on the surface: it
may do a subsurface different than a parent (especially for remote
display), and if overlay planes are used it may change the blending
space. Maybe it would be sufficient to send this per-surface.
More information about the wayland-devel
mailing list