use crate::text::{FontMetrics, TextSpan, WidthSource};
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize))]
pub struct TextSpanInfo {
pub text: String,
pub x: f64,
pub y: f64,
pub width: f64,
pub height: f64,
pub font_size: f64,
#[cfg_attr(
feature = "serde",
serde(rename = "fontName", skip_serializing_if = "Option::is_none")
)]
pub font_name: Option<String>,
#[cfg_attr(feature = "serde", serde(rename = "isBold"))]
pub is_bold: bool,
#[cfg_attr(feature = "serde", serde(rename = "isItalic"))]
pub is_italic: bool,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub color: Option<[f32; 3]>,
#[cfg_attr(feature = "serde", serde(rename = "widthSource"))]
pub width_source: WidthSource,
#[cfg_attr(
feature = "serde",
serde(rename = "charBounds", skip_serializing_if = "Vec::is_empty")
)]
pub char_bounds: Vec<[f64; 4]>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub transform: Option<[f64; 6]>,
#[cfg_attr(
feature = "serde",
serde(rename = "fontWeight", skip_serializing_if = "Option::is_none")
)]
pub font_weight: Option<u16>,
#[cfg_attr(
feature = "serde",
serde(rename = "isSerif", skip_serializing_if = "Option::is_none")
)]
pub is_serif: Option<bool>,
#[cfg_attr(
feature = "serde",
serde(rename = "isMonospace", skip_serializing_if = "Option::is_none")
)]
pub is_monospace: Option<bool>,
#[cfg_attr(
feature = "serde",
serde(rename = "renderMode", skip_serializing_if = "Option::is_none")
)]
pub render_mode: Option<u8>,
#[cfg_attr(
feature = "serde",
serde(rename = "fontMetrics", skip_serializing_if = "Option::is_none")
)]
pub font_metrics: Option<FontMetrics>,
}
impl From<TextSpan> for TextSpanInfo {
fn from(s: TextSpan) -> Self {
let char_count = s.text.chars().count() as f64;
let width = if s.width > 0.0 {
s.width
} else {
s.font_size * 0.5 * char_count
};
let color = s
.color
.map(|[r, g, b, _a]| [r as f32 / 255.0, g as f32 / 255.0, b as f32 / 255.0]);
Self {
x: s.x,
y: s.y,
width,
height: s.font_size,
font_size: s.font_size,
font_name: s.font_name,
is_bold: s.is_bold,
is_italic: s.is_italic,
color,
width_source: s.width_source,
char_bounds: s.char_bounds,
transform: s.transform,
font_weight: s.font_weight,
is_serif: s.is_serif,
is_monospace: s.is_monospace,
render_mode: s.render_mode,
font_metrics: s.font_metrics,
text: s.text,
}
}
}
impl From<&TextSpan> for TextSpanInfo {
fn from(s: &TextSpan) -> Self {
TextSpanInfo::from(s.clone())
}
}