blob: 06a69fc36d76db6709b58a9c08671cc8d75cab60 [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.ui.display.color;
using zx;
/// The properties required to apply color conversion to the display.
/// The conversion is applied to each pixel of the display according to the formula:
///
/// [coefficients * (pixel + preoffsets) + postoffsets].
///
/// where pixel is a column vector consisting of the pixel's 3 RGB components.
type ConversionProperties = table {
/// The |coefficients| param represents a 3x3 matrix, where the values are given in
/// row-major order:
///
/// | 0 1 2 |
/// | 3 4 5 |
/// | 6 7 8 |
1: coefficients array<float32, 9>;
/// Preoffsets and postoffsets represent a [3x1] vector each of RGB values.
2: preoffsets array<float32, 3>;
3: postoffsets array<float32, 3>;
};
@discoverable
closed protocol Converter {
/// Modifies the color of final display output of rendered content. The sole parameter is a
/// table of |ConversionProperties|, which contains the parameters required to apply the
/// color conversion formula to the display. Please see |ConversionProperties| defined
/// above for more information.
///
/// All parameters in the properties table must be normal 32-bit floating point values.
/// If any of the values do not meet this specification, the new color conversion values
/// will not be applied and a value of ZX_ERR_INVALID_ARGS will be returned. Otherwise,
/// the return value will be ZX_OK: https://en.wikipedia.org/wiki/Normal_number_%28computing%29.
/// Once a value of ZX_OK has been returned to the client, the color conversion values are ready
/// to be used in future render calls, including screenshots.
///
/// Values in |ConversionProperties| may also be left blank. The default values for each member,
/// if left blank, are as follows:
/// coefficients =
/// [1, 0, 0,
/// 0, 1, 0,
/// 0, 0, 1] (i.e. the identity matrix)
/// preoffsets = [0,0,0]
/// postoffsets = [0,0,0]
/// Thus, ColorConversion can be reset by passing in an empty table to this function.
///
/// Hardware that support color conversion generally accept a limited range of coefficient
/// values. Coefficients in the range of [-2, 2] inclusive will be accepted by most
/// hardware. The hardware driver will clamp values that are outside its acceptable range.
///
/// `preoffsets`, `postoffsets`: Clients are encouraged to produce color conversion values that
/// do not depend on pre and post offsets since some hardware do not have support for that.
/// For cases where pre and post offset values need to be used, the range should be limited to
/// (-1, 1).
strict SetValues(resource struct {
properties ConversionProperties;
}) -> (struct {
res zx.Status;
});
/// Submits a minimum value that all channels of all pixels rendered to the display
/// are clamped to. This can be used to mitigate the apparent effects of backlight
/// bleeding on certain devices in low-light environments.
///
/// The valid range for a minimum value is [0, 255] (inclusive). For a new
/// minimum value M, each color channel's range will be limited to [M, 255].
///
/// Callers should wait for the acknowledgement to return before submitting another
/// call to this function. The minimum_rgb clamping can be removed simply by submitting
/// a value of 0.
///
/// Not all hardware supports this feature. So this function returns |true|
/// if successfully applied and |false| if unsupported.
strict SetMinimumRgb(struct {
minimum_rgb uint8;
}) -> (struct {
supported bool;
});
};