#[cfg(feature = "nostd")]
use alloc::string::{String, ToString};
#[cfg(not(feature = "nostd"))]
use std::string::{String, ToString};
use ass_core::parser::Style;
#[derive(Clone)]
pub(super) struct OwnedStyle {
#[allow(dead_code)] name: String,
pub(super) fontname: String,
pub(super) fontsize: String,
pub(super) primary_colour: String,
pub(super) secondary_colour: String,
pub(super) outline_colour: String,
pub(super) back_colour: String,
pub(super) bold: String,
pub(super) italic: String,
pub(super) underline: String,
pub(super) strikeout: String,
pub(super) scale_x: String,
pub(super) scale_y: String,
pub(super) spacing: String,
#[allow(dead_code)] angle: String,
#[allow(dead_code)] pub(super) border_style: String,
pub(super) outline: String,
pub(super) shadow: String,
pub(super) alignment: String,
pub(super) margin_l: String,
pub(super) margin_r: String,
pub(super) margin_v: String,
#[allow(dead_code)] encoding: String,
}
impl OwnedStyle {
pub(super) fn from_style(style: &Style) -> Self {
Self {
name: style.name.to_string(),
fontname: style.fontname.to_string(),
fontsize: style.fontsize.to_string(),
primary_colour: style.primary_colour.to_string(),
secondary_colour: style.secondary_colour.to_string(),
outline_colour: style.outline_colour.to_string(),
back_colour: style.back_colour.to_string(),
bold: style.bold.to_string(),
italic: style.italic.to_string(),
underline: style.underline.to_string(),
strikeout: style.strikeout.to_string(),
scale_x: style.scale_x.to_string(),
scale_y: style.scale_y.to_string(),
spacing: style.spacing.to_string(),
angle: style.angle.to_string(),
border_style: style.border_style.to_string(),
outline: style.outline.to_string(),
shadow: style.shadow.to_string(),
alignment: style.alignment.to_string(),
margin_l: style.margin_l.to_string(),
margin_r: style.margin_r.to_string(),
margin_v: style.margin_v.to_string(),
encoding: style.encoding.to_string(),
}
}
}
impl super::SoftwarePipeline {
#[allow(dead_code)] fn get_style(&self, style_name: &str) -> Option<&OwnedStyle> {
self.styles_map
.get(style_name)
.or(self.default_style.as_ref())
}
pub(super) fn parse_ass_color(color: &str) -> [u8; 4] {
let color_trimmed = color.trim_end_matches('&');
if let Some(hex) = color_trimmed.strip_prefix("&H") {
if let Ok(value) = u32::from_str_radix(hex, 16) {
let (alpha, bgr_value) = if hex.len() >= 8 {
let alpha = ((value >> 24) & 0xFF) as u8;
let rgba_alpha = 255 - alpha;
(rgba_alpha, value & 0xFFFFFF)
} else {
(255u8, value)
};
let r = (bgr_value & 0xFF) as u8; let g = ((bgr_value >> 8) & 0xFF) as u8; let b = ((bgr_value >> 16) & 0xFF) as u8;
return [r, g, b, alpha];
}
}
[255, 255, 255, 255] }
#[allow(dead_code)] fn parse_ass_alpha(alpha: &str) -> u8 {
if let Some(hex) = alpha.strip_prefix("&H") {
if let Ok(value) = u8::from_str_radix(hex, 16) {
return 255 - value;
}
}
255 }
}