use std::path::PathBuf;
use std::ops::Deref;
use geom::*;
use super::attributes::*;
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub enum NodeKind {
Svg(Svg),
Defs,
LinearGradient(LinearGradient),
RadialGradient(RadialGradient),
ClipPath(ClipPath),
Mask(Mask),
Pattern(Pattern),
Filter(Filter),
Path(Path),
Text(Text),
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::ClipPath(ref e) => e.id.as_str(),
NodeKind::Mask(ref e) => e.id.as_str(),
NodeKind::Pattern(ref e) => e.id.as_str(),
NodeKind::Filter(ref e) => e.id.as_str(),
NodeKind::Path(ref e) => e.id.as_str(),
NodeKind::Text(ref e) => e.id.as_str(),
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.transform,
NodeKind::RadialGradient(ref e) => e.transform,
NodeKind::ClipPath(ref e) => e.transform,
NodeKind::Mask(_) => Transform::default(),
NodeKind::Pattern(ref e) => e.transform,
NodeKind::Filter(_) => Transform::default(),
NodeKind::Path(ref e) => e.transform,
NodeKind::Text(ref e) => e.transform,
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, Debug)]
pub struct Path {
pub id: String,
pub transform: Transform,
pub visibility: Visibility,
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
pub segments: Vec<PathSegment>,
}
#[derive(Clone, Debug)]
pub struct Text {
pub id: String,
pub transform: Transform,
pub rotate: Option<NumberList>,
pub chunks: Vec<TextChunk>,
}
#[derive(Clone, Debug)]
pub struct TextChunk {
pub x: Option<NumberList>,
pub y: Option<NumberList>,
pub dx: Option<NumberList>,
pub dy: Option<NumberList>,
pub anchor: TextAnchor,
pub spans: Vec<TextSpan>,
}
#[derive(Clone, Debug)]
pub struct TextSpan {
pub visibility: Visibility,
pub fill: Option<Fill>,
pub stroke: Option<Stroke>,
pub font: Font,
pub decoration: TextDecoration,
pub text: String,
}
#[derive(Clone, Debug)]
pub struct Image {
pub id: String,
pub transform: Transform,
pub visibility: Visibility,
pub view_box: ViewBox,
pub data: ImageData,
pub format: ImageFormat,
}
#[derive(Clone, Debug)]
pub enum ImageData {
Path(PathBuf),
Raw(Vec<u8>),
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum ImageFormat {
PNG,
JPEG,
SVG,
}
#[derive(Clone, Debug)]
pub struct Group {
pub id: String,
pub transform: Transform,
pub opacity: Option<Opacity>,
pub clip_path: Option<String>,
pub mask: Option<String>,
pub filter: Option<String>,
}
#[derive(Clone, Debug)]
pub struct BaseGradient {
pub units: Units,
pub transform: Transform,
pub spread_method: SpreadMethod,
pub stops: Vec<Stop>,
}
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub struct LinearGradient {
pub id: String,
pub x1: f64,
pub y1: f64,
pub x2: f64,
pub y2: f64,
pub base: BaseGradient,
}
impl Deref for LinearGradient {
type Target = BaseGradient;
fn deref(&self) -> &Self::Target {
&self.base
}
}
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub struct RadialGradient {
pub id: String,
pub cx: f64,
pub cy: f64,
pub r: f64,
pub fx: f64,
pub fy: f64,
pub base: BaseGradient,
}
impl Deref for RadialGradient {
type Target = BaseGradient;
fn deref(&self) -> &Self::Target {
&self.base
}
}
#[derive(Clone, Copy, Debug)]
pub struct Stop {
pub offset: StopOffset,
pub color: Color,
pub opacity: Opacity,
}
#[derive(Clone, Debug)]
pub struct ClipPath {
pub id: String,
pub units: Units,
pub transform: Transform,
pub clip_path: Option<String>,
}
#[derive(Clone, Debug)]
pub struct Mask {
pub id: String,
pub units: Units,
pub content_units: Units,
pub rect: Rect,
pub mask: Option<String>,
}
#[derive(Clone, Debug)]
pub struct Pattern {
pub id: String,
pub units: Units,
pub content_units: Units,
pub transform: Transform,
pub rect: Rect,
pub view_box: Option<ViewBox>,
}
#[derive(Clone, Debug)]
pub struct Filter {
pub id: String,
pub units: Units,
pub primitive_units: Units,
pub rect: Rect,
pub children: Vec<FilterPrimitive>,
}
#[derive(Clone, Debug)]
pub struct FilterPrimitive {
pub x: Option<f64>,
pub y: Option<f64>,
pub width: Option<f64>,
pub height: Option<f64>,
pub color_interpolation: ColorInterpolation,
pub filter_input: Option<FilterInput>,
pub filter_result: Option<String>,
pub kind: FilterKind,
}
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub enum FilterKind {
FeBlend(FeBlend),
FeComposite(FeComposite),
FeFlood(FeFlood),
FeGaussianBlur(FeGaussianBlur),
FeImage(FeImage),
FeMerge(FeMerge),
FeOffset(FeOffset),
FeTile,
}
#[derive(Clone, Copy, Debug)]
pub struct FeGaussianBlur {
pub std_dev_x: PositiveNumber,
pub std_dev_y: PositiveNumber,
}
#[derive(Clone, Copy, Debug)]
pub struct FeOffset {
pub dx: f64,
pub dy: f64,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum FeBlendMode {
Normal,
Multiply,
Screen,
Darken,
Lighten,
}
impl ToString for FeBlendMode {
fn to_string(&self) -> String {
match self {
FeBlendMode::Normal => "normal",
FeBlendMode::Multiply => "multiply",
FeBlendMode::Screen => "screen",
FeBlendMode::Darken => "darken",
FeBlendMode::Lighten => "lighten",
}.to_string()
}
}
#[derive(Clone, Debug)]
pub struct FeBlend {
pub mode: FeBlendMode,
pub filter_input2: Option<FilterInput>,
}
#[derive(Clone, Copy, Debug)]
pub struct FeFlood {
pub color: Color,
pub opacity: Opacity,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum FeCompositeOperator {
Over,
In,
Out,
Atop,
Xor,
Arithmetic,
}
impl ToString for FeCompositeOperator {
fn to_string(&self) -> String {
match self {
FeCompositeOperator::Over => "over",
FeCompositeOperator::In => "in",
FeCompositeOperator::Out => "out",
FeCompositeOperator::Atop => "atop",
FeCompositeOperator::Xor => "xor",
FeCompositeOperator::Arithmetic => "arithmetic",
}.to_string()
}
}
#[derive(Clone, Debug)]
pub struct FeComposite {
pub operator: FeCompositeOperator,
pub filter_input2: Option<FilterInput>,
}
#[derive(Clone, Debug)]
pub struct FeMerge {
pub inputs: Vec<Option<FilterInput>>,
}
#[derive(Clone, Debug)]
pub enum FeImageKind {
None,
Image(ImageData, ImageFormat),
Use(String),
}
#[derive(Clone, Debug)]
pub struct FeImage {
pub aspect: AspectRatio,
pub data: FeImageKind,
}