use std::rc::Rc;
use strict_num::NonZeroPositiveF64;
use crate::{Fill, PaintOrder, PathData, Stroke, TextRendering, Transform, Visibility};
#[allow(missing_docs)]
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Debug, Hash)]
pub enum FontStretch {
UltraCondensed,
ExtraCondensed,
Condensed,
SemiCondensed,
Normal,
SemiExpanded,
Expanded,
ExtraExpanded,
UltraExpanded,
}
impl Default for FontStretch {
#[inline]
fn default() -> Self {
Self::Normal
}
}
#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
pub enum FontStyle {
Normal,
Italic,
Oblique,
}
impl Default for FontStyle {
#[inline]
fn default() -> FontStyle {
Self::Normal
}
}
#[derive(Clone, Eq, PartialEq, Hash, Debug)]
pub struct Font {
pub families: Vec<String>,
pub style: FontStyle,
pub stretch: FontStretch,
pub weight: u16,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum DominantBaseline {
Auto,
UseScript,
NoChange,
ResetSize,
Ideographic,
Alphabetic,
Hanging,
Mathematical,
Central,
Middle,
TextAfterEdge,
TextBeforeEdge,
}
impl Default for DominantBaseline {
fn default() -> Self {
Self::Auto
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum AlignmentBaseline {
Auto,
Baseline,
BeforeEdge,
TextBeforeEdge,
Middle,
Central,
AfterEdge,
TextAfterEdge,
Ideographic,
Alphabetic,
Hanging,
Mathematical,
}
impl Default for AlignmentBaseline {
fn default() -> Self {
Self::Auto
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum BaselineShift {
Baseline,
Subscript,
Superscript,
Number(f64),
}
impl Default for BaselineShift {
#[inline]
fn default() -> BaselineShift {
BaselineShift::Baseline
}
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum LengthAdjust {
Spacing,
SpacingAndGlyphs,
}
impl Default for LengthAdjust {
fn default() -> Self {
Self::Spacing
}
}
#[derive(Clone, Debug)]
pub struct TextDecorationStyle {
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
}
#[derive(Clone, Debug)]
pub struct TextDecoration {
pub underline: Option<TextDecorationStyle>,
pub overline: Option<TextDecorationStyle>,
pub line_through: Option<TextDecorationStyle>,
}
#[derive(Clone, Debug)]
pub struct TextSpan {
pub start: usize,
pub end: usize,
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
pub paint_order: PaintOrder,
pub font: Font,
pub font_size: NonZeroPositiveF64,
pub small_caps: bool,
pub apply_kerning: bool,
pub decoration: TextDecoration,
pub dominant_baseline: DominantBaseline,
pub alignment_baseline: AlignmentBaseline,
pub baseline_shift: Vec<BaselineShift>,
pub visibility: Visibility,
pub letter_spacing: f64,
pub word_spacing: f64,
pub text_length: Option<f64>,
pub length_adjust: LengthAdjust,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum TextAnchor {
Start,
Middle,
End,
}
impl Default for TextAnchor {
fn default() -> Self {
Self::Start
}
}
#[derive(Clone, Debug)]
pub struct TextPath {
pub start_offset: f64,
pub path: Rc<PathData>,
}
#[derive(Clone, Debug)]
pub enum TextFlow {
Linear,
Path(Rc<TextPath>),
}
#[derive(Clone, Debug)]
pub struct TextChunk {
pub x: Option<f64>,
pub y: Option<f64>,
pub anchor: TextAnchor,
pub spans: Vec<TextSpan>,
pub text_flow: TextFlow,
pub text: String,
}
#[derive(Clone, Copy, Debug)]
pub struct CharacterPosition {
pub x: Option<f64>,
pub y: Option<f64>,
pub dx: Option<f64>,
pub dy: Option<f64>,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum WritingMode {
LeftToRight,
TopToBottom,
}
#[derive(Clone, Debug)]
pub struct Text {
pub id: String,
pub transform: Transform,
pub rendering_mode: TextRendering,
pub positions: Vec<CharacterPosition>,
pub rotate: Vec<f64>,
pub writing_mode: WritingMode,
pub chunks: Vec<TextChunk>,
}