use std::path::PathBuf;
use geom::*;
use super::attribute::*;
#[allow(missing_docs)]
pub enum NodeKind {
Svg(Svg),
Defs,
LinearGradient(LinearGradient),
RadialGradient(RadialGradient),
Stop(Stop),
ClipPath(ClipPath),
Mask(Mask),
Pattern(Pattern),
Path(Path),
Text(Text),
TextChunk(TextChunk),
TSpan(Box<TSpan>), Image(Image),
Group(Group),
}
impl NodeKind {
pub fn id(&self) -> &str {
match *self {
NodeKind::Svg(_) => "",
NodeKind::Defs => "",
NodeKind::LinearGradient(ref e) => e.id.as_str(),
NodeKind::RadialGradient(ref e) => e.id.as_str(),
NodeKind::Stop(_) => "",
NodeKind::ClipPath(ref e) => e.id.as_str(),
NodeKind::Mask(ref e) => e.id.as_str(),
NodeKind::Pattern(ref e) => e.id.as_str(),
NodeKind::Path(ref e) => e.id.as_str(),
NodeKind::Text(ref e) => e.id.as_str(),
NodeKind::TextChunk(_) => "",
NodeKind::TSpan(_) => "",
NodeKind::Image(ref e) => e.id.as_str(),
NodeKind::Group(ref e) => e.id.as_str(),
}
}
pub fn transform(&self) -> Transform {
match *self {
NodeKind::Svg(_) => Transform::default(),
NodeKind::Defs => Transform::default(),
NodeKind::LinearGradient(ref e) => e.d.transform,
NodeKind::RadialGradient(ref e) => e.d.transform,
NodeKind::Stop(_) => Transform::default(),
NodeKind::ClipPath(ref e) => e.transform,
NodeKind::Mask(_) => Transform::default(),
NodeKind::Pattern(ref e) => e.transform,
NodeKind::Path(ref e) => e.transform,
NodeKind::Text(ref e) => e.transform,
NodeKind::TextChunk(_) => Transform::default(),
NodeKind::TSpan(_) => Transform::default(),
NodeKind::Image(ref e) => e.transform,
NodeKind::Group(ref e) => e.transform,
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct Svg {
pub size: Size,
pub view_box: ViewBox,
}
#[derive(Clone)]
pub struct Path {
pub id: String,
pub transform: Transform,
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
pub segments: Vec<PathSegment>,
}
pub struct Text {
pub id: String,
pub transform: Transform,
pub rotate: Option<NumberList>,
}
#[derive(Clone)]
pub struct TextChunk {
pub x: Option<NumberList>,
pub y: Option<NumberList>,
pub dx: Option<NumberList>,
pub dy: Option<NumberList>,
pub anchor: TextAnchor,
}
#[derive(Clone)]
pub struct TSpan {
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
pub font: Font,
pub decoration: TextDecoration,
pub text: String,
}
pub struct Image {
pub id: String,
pub transform: Transform,
pub view_box: ViewBox,
pub data: ImageData,
pub format: ImageFormat,
}
pub enum ImageData {
Path(PathBuf),
Raw(Vec<u8>),
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq)]
pub enum ImageFormat {
PNG,
JPEG,
SVG,
}
pub struct Group {
pub id: String,
pub transform: Transform,
pub opacity: Option<Opacity>,
pub clip_path: Option<String>,
pub mask: Option<String>,
}
#[derive(Clone, Copy)]
pub struct BaseGradient {
pub units: Units,
pub transform: Transform,
pub spread_method: SpreadMethod,
}
#[allow(missing_docs)]
pub struct LinearGradient {
pub id: String,
pub x1: f64,
pub y1: f64,
pub x2: f64,
pub y2: f64,
pub d: BaseGradient,
}
#[allow(missing_docs)]
pub struct RadialGradient {
pub id: String,
pub cx: f64,
pub cy: f64,
pub r: f64,
pub fx: f64,
pub fy: f64,
pub d: BaseGradient,
}
#[derive(Clone, Copy)]
#[allow(missing_docs)]
pub struct Stop {
pub offset: StopOffset,
pub color: Color,
pub opacity: Opacity,
}
pub struct ClipPath {
pub id: String,
pub units: Units,
pub transform: Transform,
}
pub struct Mask {
pub id: String,
pub units: Units,
pub content_units: Units,
pub rect: Rect,
}
pub struct Pattern {
pub id: String,
pub units: Units,
pub content_units: Units,
pub transform: Transform,
pub rect: Rect,
pub view_box: Option<ViewBox>,
}