// Copyright 2019 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.accessibility;

/// Specifies color correction mode.
type ColorCorrectionMode = strict enum {
    /// No color correction.
    DISABLED = 0;

    /// Color correction for protanomaly (red-green -- reduced sensitivity to red light).
    CORRECT_PROTANOMALY = 1;

    /// Color correction for deuteranomaly (red-green -- reduced sensitivity to green light).
    CORRECT_DEUTERANOMALY = 2;

    /// Color correction for tritanomaly (blue-yellow -- reduced sensitivity to blue light).
    CORRECT_TRITANOMALY = 3;
};

/// The current configuration for accessibility color transforms, which includes color inversion and
/// color correction. This always includes the matrix required to apply the appropriate transforms.
/// Color correction and color inversion may be active simultaneously.
///
/// For original RGB value (r, g, b) (each component ranged between 0 and 1), the RGB value of
/// corrected color (r', g', b') is
///   (r', g', b') = color_adjustment_post_offset
///                + color_adjustment_matrix . ((r, g, b) + color_adjustment_pre_offset).
type ColorTransformConfiguration = table {
    /// When color_inversion_enabled is true, certain colors are inverted across the entire screen.
    /// If this field is omitted behavior should remain unchanged.
    1: color_inversion_enabled bool;

    /// When color_correction is set to DISABLED, colors are displayed normally. When
    /// color_correction has different value, colors are modified to correct for the specified type
    /// of color blindness. If this field is omitted behavior should remain unchanged.
    2: color_correction ColorCorrectionMode;

    /// 3x3 Matrix in row-major form which will be used by root presenter to apply color correction
    /// and color inversion, or a combination fo the two. This field should always be set.
    3: color_adjustment_matrix array<float32, 9>;

    /// 3x1 vector which is used by root presenter as an offset added to the original RGB color,
    /// before it multiplies with the |color_adjustment_matrix|. This field should always be set.
    4: color_adjustment_pre_offset array<float32, 3>;

    /// 3x1 vector which is used by root presenter as an offset added to the multiplied result
    /// of |color_adjustment_matrix| and original RGB color. This field should always be set.
    5: color_adjustment_post_offset array<float32, 3>;
};

/// Handler implemented by the owner of the presentation. Accessibility manager uses this protocol
/// to make changes to the screen's color transform.
closed protocol ColorTransformHandler {
    /// Called when the color transform configuration has changed.
    strict SetColorTransformConfiguration(struct {
        configuration ColorTransformConfiguration;
    }) -> ();
};

/// Allows a presentation owner to register a handler for color transforms. This API is implemented
/// by the Accessibility manager and called by Root Presenter.
@discoverable
closed protocol ColorTransform {
    /// Registers a handler for changes in the color transform configuration.
    strict RegisterColorTransformHandler(resource struct {
        handler client_end:ColorTransformHandler;
    });
};
