blob: b7bcce75ec53f08748b711ad82217dd56250ad26 [file] [log] [blame]
// 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.
use crate::base::Merge;
use serde::{Deserialize, Serialize};
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub struct AccessibilityInfo {
pub(crate) audio_description: Option<bool>,
pub(crate) screen_reader: Option<bool>,
pub(crate) color_inversion: Option<bool>,
pub(crate) enable_magnification: Option<bool>,
pub(crate) color_correction: Option<ColorBlindnessType>,
pub(crate) captions_settings: Option<CaptionsSettings>,
}
impl AccessibilityInfo {
pub(crate) fn is_finite(&self) -> bool {
self.captions_settings.map_or(true, |captions| captions.is_finite())
}
}
impl Merge for AccessibilityInfo {
fn merge(&self, other: Self) -> Self {
AccessibilityInfo {
audio_description: other.audio_description.or(self.audio_description),
screen_reader: other.screen_reader.or(self.screen_reader),
color_inversion: other.color_inversion.or(self.color_inversion),
enable_magnification: other.enable_magnification.or(self.enable_magnification),
color_correction: other
.color_correction
.map(ColorBlindnessType::into)
.or(self.color_correction),
captions_settings: match (self.captions_settings, other.captions_settings) {
(Some(caption_settings), Some(other_caption_settings)) => {
Some(caption_settings.merge(other_caption_settings))
}
_ => other.captions_settings.or(self.captions_settings),
},
}
}
}
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub(crate) enum ColorBlindnessType {
/// No color blindness.
None,
/// Red-green color blindness due to reduced sensitivity to red light.
Protanomaly,
/// Red-green color blindness due to reduced sensitivity to green light.
Deuteranomaly,
/// Blue-yellow color blindness. It is due to reduced sensitivity to blue
/// light.
Tritanomaly,
}
impl From<fidl_fuchsia_settings::ColorBlindnessType> for ColorBlindnessType {
fn from(color_blindness_type: fidl_fuchsia_settings::ColorBlindnessType) -> Self {
match color_blindness_type {
fidl_fuchsia_settings::ColorBlindnessType::None => ColorBlindnessType::None,
fidl_fuchsia_settings::ColorBlindnessType::Protanomaly => {
ColorBlindnessType::Protanomaly
}
fidl_fuchsia_settings::ColorBlindnessType::Deuteranomaly => {
ColorBlindnessType::Deuteranomaly
}
fidl_fuchsia_settings::ColorBlindnessType::Tritanomaly => {
ColorBlindnessType::Tritanomaly
}
}
}
}
impl From<ColorBlindnessType> for fidl_fuchsia_settings::ColorBlindnessType {
fn from(color_blindness_type: ColorBlindnessType) -> Self {
match color_blindness_type {
ColorBlindnessType::None => fidl_fuchsia_settings::ColorBlindnessType::None,
ColorBlindnessType::Protanomaly => {
fidl_fuchsia_settings::ColorBlindnessType::Protanomaly
}
ColorBlindnessType::Deuteranomaly => {
fidl_fuchsia_settings::ColorBlindnessType::Deuteranomaly
}
ColorBlindnessType::Tritanomaly => {
fidl_fuchsia_settings::ColorBlindnessType::Tritanomaly
}
}
}
}
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub(crate) struct CaptionsSettings {
pub(crate) for_media: Option<bool>,
pub(crate) for_tts: Option<bool>,
pub(crate) font_style: Option<CaptionFontStyle>,
pub(crate) window_color: Option<ColorRgba>,
pub(crate) background_color: Option<ColorRgba>,
}
impl CaptionsSettings {
pub(crate) fn is_finite(&self) -> bool {
self.font_style.map_or(true, |font_style| font_style.is_finite())
&& self.window_color.map_or(true, |window_color| window_color.is_finite())
&& self.background_color.map_or(true, |bkg_color| bkg_color.is_finite())
}
}
impl Merge for CaptionsSettings {
fn merge(&self, other: Self) -> Self {
CaptionsSettings {
for_media: other.for_media.or(self.for_media),
for_tts: other.for_tts.or(self.for_tts),
window_color: other.window_color.or(self.window_color),
background_color: other.background_color.or(self.background_color),
font_style: match (self.font_style, other.font_style) {
(Some(style), Some(other_style)) => Some(style.merge(other_style)),
_ => other.font_style.or(self.font_style),
},
}
}
}
impl From<fidl_fuchsia_settings::CaptionsSettings> for CaptionsSettings {
fn from(src: fidl_fuchsia_settings::CaptionsSettings) -> Self {
CaptionsSettings {
for_media: src.for_media,
for_tts: src.for_tts,
font_style: src.font_style.map(fidl_fuchsia_settings::CaptionFontStyle::into),
window_color: src.window_color.map(fidl_fuchsia_ui_types::ColorRgba::into),
background_color: src.background_color.map(fidl_fuchsia_ui_types::ColorRgba::into),
}
}
}
impl From<CaptionsSettings> for fidl_fuchsia_settings::CaptionsSettings {
fn from(src: CaptionsSettings) -> Self {
let mut settings = fidl_fuchsia_settings::CaptionsSettings::EMPTY;
settings.for_media = src.for_media;
settings.for_tts = src.for_tts;
settings.font_style = src.font_style.map(CaptionFontStyle::into);
settings.window_color = src.window_color.map(ColorRgba::into);
settings.background_color = src.background_color.map(ColorRgba::into);
settings
}
}
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub(crate) struct CaptionFontStyle {
pub(crate) family: Option<CaptionFontFamily>,
pub(crate) color: Option<ColorRgba>,
pub(crate) relative_size: Option<f32>,
pub(crate) char_edge_style: Option<EdgeStyle>,
}
impl CaptionFontStyle {
pub(crate) fn is_finite(&self) -> bool {
self.color.map_or(true, |color| color.is_finite())
&& self.relative_size.map_or(true, |size| size.is_finite())
}
}
impl Merge for CaptionFontStyle {
fn merge(&self, other: Self) -> Self {
CaptionFontStyle {
family: other.family.or(self.family),
color: other.color.or(self.color),
relative_size: other.relative_size.or(self.relative_size),
char_edge_style: other.char_edge_style.or(self.char_edge_style),
}
}
}
impl From<fidl_fuchsia_settings::CaptionFontStyle> for CaptionFontStyle {
fn from(src: fidl_fuchsia_settings::CaptionFontStyle) -> Self {
CaptionFontStyle {
family: src.family.map(fidl_fuchsia_settings::CaptionFontFamily::into),
color: src.color.map(fidl_fuchsia_ui_types::ColorRgba::into),
relative_size: src.relative_size,
char_edge_style: src.char_edge_style.map(fidl_fuchsia_settings::EdgeStyle::into),
}
}
}
impl From<CaptionFontStyle> for fidl_fuchsia_settings::CaptionFontStyle {
fn from(src: CaptionFontStyle) -> Self {
let mut style = fidl_fuchsia_settings::CaptionFontStyle::EMPTY;
style.family = src.family.map(CaptionFontFamily::into);
style.color = src.color.map(ColorRgba::into);
style.relative_size = src.relative_size;
style.char_edge_style = src.char_edge_style.map(EdgeStyle::into);
style
}
}
/// Font family groups for closed captions, specified by 47 CFR §79.102(k).
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub(crate) enum CaptionFontFamily {
Unknown,
MonospacedSerif,
ProportionalSerif,
MonospacedSansSerif,
ProportionalSansSerif,
Casual,
Cursive,
SmallCapitals,
}
impl From<fidl_fuchsia_settings::CaptionFontFamily> for CaptionFontFamily {
fn from(src: fidl_fuchsia_settings::CaptionFontFamily) -> Self {
match src {
fidl_fuchsia_settings::CaptionFontFamily::Unknown => CaptionFontFamily::Unknown,
fidl_fuchsia_settings::CaptionFontFamily::MonospacedSerif => {
CaptionFontFamily::MonospacedSerif
}
fidl_fuchsia_settings::CaptionFontFamily::ProportionalSerif => {
CaptionFontFamily::ProportionalSerif
}
fidl_fuchsia_settings::CaptionFontFamily::MonospacedSansSerif => {
CaptionFontFamily::MonospacedSansSerif
}
fidl_fuchsia_settings::CaptionFontFamily::ProportionalSansSerif => {
CaptionFontFamily::ProportionalSansSerif
}
fidl_fuchsia_settings::CaptionFontFamily::Casual => CaptionFontFamily::Casual,
fidl_fuchsia_settings::CaptionFontFamily::Cursive => CaptionFontFamily::Cursive,
fidl_fuchsia_settings::CaptionFontFamily::SmallCapitals => {
CaptionFontFamily::SmallCapitals
}
}
}
}
impl From<CaptionFontFamily> for fidl_fuchsia_settings::CaptionFontFamily {
fn from(src: CaptionFontFamily) -> Self {
match src {
CaptionFontFamily::Unknown => fidl_fuchsia_settings::CaptionFontFamily::Unknown,
CaptionFontFamily::MonospacedSerif => {
fidl_fuchsia_settings::CaptionFontFamily::MonospacedSerif
}
CaptionFontFamily::ProportionalSerif => {
fidl_fuchsia_settings::CaptionFontFamily::ProportionalSerif
}
CaptionFontFamily::MonospacedSansSerif => {
fidl_fuchsia_settings::CaptionFontFamily::MonospacedSansSerif
}
CaptionFontFamily::ProportionalSansSerif => {
fidl_fuchsia_settings::CaptionFontFamily::ProportionalSansSerif
}
CaptionFontFamily::Casual => fidl_fuchsia_settings::CaptionFontFamily::Casual,
CaptionFontFamily::Cursive => fidl_fuchsia_settings::CaptionFontFamily::Cursive,
CaptionFontFamily::SmallCapitals => {
fidl_fuchsia_settings::CaptionFontFamily::SmallCapitals
}
}
}
}
/// Edge style for fonts as specified in 47 CFR §79.103(c)(7)
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub enum EdgeStyle {
/// No border around fonts.
None,
/// A shadow "behind" and slightly offset from each edge.
DropShadow,
/// A bevel that mimics a 3D raised effect.
Raised,
/// A bevel that mimics a 3D depressed effect.
Depressed,
/// A plain border around each shapes.
Outline,
}
impl From<fidl_fuchsia_settings::EdgeStyle> for EdgeStyle {
fn from(src: fidl_fuchsia_settings::EdgeStyle) -> Self {
match src {
fidl_fuchsia_settings::EdgeStyle::None => EdgeStyle::None,
fidl_fuchsia_settings::EdgeStyle::DropShadow => EdgeStyle::DropShadow,
fidl_fuchsia_settings::EdgeStyle::Raised => EdgeStyle::Raised,
fidl_fuchsia_settings::EdgeStyle::Depressed => EdgeStyle::Depressed,
fidl_fuchsia_settings::EdgeStyle::Outline => EdgeStyle::Outline,
}
}
}
impl From<EdgeStyle> for fidl_fuchsia_settings::EdgeStyle {
fn from(src: EdgeStyle) -> Self {
match src {
EdgeStyle::None => fidl_fuchsia_settings::EdgeStyle::None,
EdgeStyle::DropShadow => fidl_fuchsia_settings::EdgeStyle::DropShadow,
EdgeStyle::Raised => fidl_fuchsia_settings::EdgeStyle::Raised,
EdgeStyle::Depressed => fidl_fuchsia_settings::EdgeStyle::Depressed,
EdgeStyle::Outline => fidl_fuchsia_settings::EdgeStyle::Outline,
}
}
}
#[derive(PartialEq, Debug, Clone, Copy, Serialize, Deserialize)]
pub(crate) struct ColorRgba {
pub(crate) red: f32,
pub(crate) green: f32,
pub(crate) blue: f32,
pub(crate) alpha: f32,
}
impl ColorRgba {
pub(crate) fn is_finite(&self) -> bool {
self.red.is_finite()
&& self.green.is_finite()
&& self.blue.is_finite()
&& self.alpha.is_finite()
}
}
impl From<fidl_fuchsia_ui_types::ColorRgba> for ColorRgba {
fn from(src: fidl_fuchsia_ui_types::ColorRgba) -> Self {
ColorRgba { red: src.red, green: src.green, blue: src.blue, alpha: src.alpha }
}
}
impl From<ColorRgba> for fidl_fuchsia_ui_types::ColorRgba {
fn from(src: ColorRgba) -> Self {
fidl_fuchsia_ui_types::ColorRgba {
red: src.red,
green: src.green,
blue: src.blue,
alpha: src.alpha,
}
}
}