// 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;
    });
};
