blob: a0aec55a04da5d5e6bcd5f6d4f12e485b56b1088 [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
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.
///
/// 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 encourged 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).
SetValues(resource struct {
properties ConversionProperties;
}) -> (struct {
res zx.status;
});
};