use crate::{Font, Pixels, StrikethroughStyle, UnderlineStyle};
use palette::Hsla;
use std::{
fmt::Debug,
hash::{Hash, Hasher},
};
#[derive(Clone, Debug, PartialEq, Default)]
pub struct TextRun {
pub len: usize,
pub font: Font,
pub color: Hsla,
pub background_color: Option<Hsla>,
pub underline: Option<UnderlineStyle>,
pub strikethrough: Option<StrikethroughStyle>,
pub letter_spacing: Option<Pixels>,
}
impl Eq for TextRun {}
impl Hash for TextRun {
fn hash<H: Hasher>(&self, state: &mut H) {
fn hash_float<H: Hasher>(value: f32, state: &mut H) {
if value == 0.0 {
0.0f32.to_bits().hash(state);
} else {
value.to_bits().hash(state);
}
}
fn hash_color<H: Hasher>(color: Hsla, state: &mut H) {
let color = crate::hsla_to_rgba(color);
hash_float(color.color.red, state);
hash_float(color.color.green, state);
hash_float(color.color.blue, state);
hash_float(color.alpha, state);
}
self.len.hash(state);
self.font.hash(state);
hash_color(self.color, state);
if let Some(color) = self.background_color {
hash_color(color, state);
}
self.background_color.is_some().hash(state);
self.underline.is_some().hash(state);
if let Some(underline) = self.underline {
hash_float(underline.thickness.into(), state);
underline.color.is_some().hash(state);
if let Some(color) = underline.color {
hash_color(color, state);
}
underline.wavy.hash(state);
}
self.strikethrough.is_some().hash(state);
if let Some(strikethrough) = self.strikethrough {
hash_float(strikethrough.thickness.into(), state);
strikethrough.color.is_some().hash(state);
if let Some(color) = strikethrough.color {
hash_color(color, state);
}
}
self.letter_spacing.is_some().hash(state);
if let Some(letter_spacing) = self.letter_spacing {
hash_float(letter_spacing.into(), state);
}
}
}