use std::fmt;
use std::path::PathBuf;
pub use svgtypes::{
Align,
AspectRatio,
Color,
FuzzyEq,
FuzzyZero,
Transform,
};
use crate::geom::*;
pub use super::numbers::*;
macro_rules! impl_from_str {
($name:ident) => {
impl std::str::FromStr for $name {
type Err = &'static str;
fn from_str(s: &str) -> Result<Self, Self::Err> {
crate::svgtree::EnumFromStr::enum_from_str(s).ok_or("invalid value")
}
}
};
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum LineCap {
Butt,
Round,
Square,
}
impl_enum_default!(LineCap, Butt);
impl_enum_from_str!(LineCap,
"butt" => LineCap::Butt,
"round" => LineCap::Round,
"square" => LineCap::Square
);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum LineJoin {
Miter,
Round,
Bevel,
}
impl_enum_default!(LineJoin, Miter);
impl_enum_from_str!(LineJoin,
"miter" => LineJoin::Miter,
"round" => LineJoin::Round,
"bevel" => LineJoin::Bevel
);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum FillRule {
NonZero,
EvenOdd,
}
impl_enum_default!(FillRule, NonZero);
impl_enum_from_str!(FillRule,
"nonzero" => FillRule::NonZero,
"evenodd" => FillRule::EvenOdd
);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum Units {
UserSpaceOnUse,
ObjectBoundingBox,
}
impl_enum_from_str!(Units,
"userSpaceOnUse" => Units::UserSpaceOnUse,
"objectBoundingBox" => Units::ObjectBoundingBox
);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum SpreadMethod {
Pad,
Reflect,
Repeat,
}
impl_enum_default!(SpreadMethod, Pad);
impl_enum_from_str!(SpreadMethod,
"pad" => SpreadMethod::Pad,
"reflect" => SpreadMethod::Reflect,
"repeat" => SpreadMethod::Repeat
);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum Visibility {
Visible,
Hidden,
Collapse,
}
impl_enum_default!(Visibility, Visible);
impl_enum_from_str!(Visibility,
"visible" => Visibility::Visible,
"hidden" => Visibility::Hidden,
"collapse" => Visibility::Collapse
);
#[allow(missing_docs)]
#[derive(Clone)]
pub enum Paint {
Color(Color),
Link(String),
}
impl fmt::Debug for Paint {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match *self {
Paint::Color(c) => write!(f, "Color({})", c),
Paint::Link(_) => write!(f, "Link"),
}
}
}
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub struct Fill {
pub paint: Paint,
pub opacity: Opacity,
pub rule: FillRule,
}
impl Default for Fill {
fn default() -> Self {
Fill {
paint: Paint::Color(Color::black()),
opacity: Opacity::default(),
rule: FillRule::default(),
}
}
}
#[allow(missing_docs)]
#[derive(Clone, Debug)]
pub struct Stroke {
pub paint: Paint,
pub dasharray: Option<Vec<f64>>,
pub dashoffset: f32,
pub miterlimit: StrokeMiterlimit,
pub opacity: Opacity,
pub width: StrokeWidth,
pub linecap: LineCap,
pub linejoin: LineJoin,
}
impl Default for Stroke {
fn default() -> Self {
Stroke {
paint: Paint::Color(Color::black()),
dasharray: None,
dashoffset: 0.0,
miterlimit: StrokeMiterlimit::default(),
opacity: Opacity::default(),
width: StrokeWidth::default(),
linecap: LineCap::default(),
linejoin: LineJoin::default(),
}
}
}
#[derive(Clone, Copy, Debug)]
pub struct ViewBox {
pub rect: Rect,
pub aspect: AspectRatio,
}
#[allow(missing_docs)]
#[derive(Clone, PartialEq, Debug)]
pub enum FilterInput {
SourceGraphic,
SourceAlpha,
BackgroundImage,
BackgroundAlpha,
FillPaint,
StrokePaint,
Reference(String),
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum ColorInterpolation {
SRGB,
LinearRGB,
}
impl_enum_default!(ColorInterpolation, LinearRGB);
impl_enum_from_str!(ColorInterpolation,
"sRGB" => ColorInterpolation::SRGB,
"linearRGB" => ColorInterpolation::LinearRGB
);
#[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,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum FeBlendMode {
Normal,
Multiply,
Screen,
Darken,
Lighten,
}
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum FeCompositeOperator {
Over,
In,
Out,
Atop,
Xor,
Arithmetic {
k1: CompositingCoefficient,
k2: CompositingCoefficient,
k3: CompositingCoefficient,
k4: CompositingCoefficient,
},
}
#[derive(Clone, Debug)]
pub enum FeImageKind {
None,
Image(ImageData, ImageFormat),
Use(String),
}
#[derive(Clone, Copy, PartialEq, Debug)]
#[allow(missing_docs)]
pub enum ShapeRendering {
OptimizeSpeed,
CrispEdges,
GeometricPrecision,
}
impl_enum_default!(ShapeRendering, GeometricPrecision);
impl_enum_from_str!(ShapeRendering,
"optimizeSpeed" => ShapeRendering::OptimizeSpeed,
"crispEdges" => ShapeRendering::CrispEdges,
"geometricPrecision" => ShapeRendering::GeometricPrecision
);
impl_from_str!(ShapeRendering);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum TextRendering {
OptimizeSpeed,
OptimizeLegibility,
GeometricPrecision,
}
impl_enum_default!(TextRendering, OptimizeLegibility);
impl_enum_from_str!(TextRendering,
"optimizeSpeed" => TextRendering::OptimizeSpeed,
"optimizeLegibility" => TextRendering::OptimizeLegibility,
"geometricPrecision" => TextRendering::GeometricPrecision
);
impl_from_str!(TextRendering);
#[allow(missing_docs)]
#[derive(Clone, Copy, PartialEq, Debug)]
pub enum ImageRendering {
OptimizeQuality,
OptimizeSpeed,
}
impl_enum_default!(ImageRendering, OptimizeQuality);
impl_enum_from_str!(ImageRendering,
"optimizeQuality" => ImageRendering::OptimizeQuality,
"optimizeSpeed" => ImageRendering::OptimizeSpeed
);
impl_from_str!(ImageRendering);