|
|
|
|
@@ -86,6 +86,10 @@ macro_rules! tagged_value {
|
|
|
|
|
#[serde(deserialize_with = "core_types::misc::migrate_to_f64_array")] // TODO: Eventually remove this migration document upgrade code
|
|
|
|
|
#[serde(alias = "F64Table", alias = "VecF64", alias = "VecF32", alias = "F64Array4")]
|
|
|
|
|
F64Array(Vec<f64>),
|
|
|
|
|
/// Stored compactly as a `Vec<f64>` of dash lengths, materializes as an `Item<DashPattern>` at runtime via `to_dynany`/`to_any`.
|
|
|
|
|
DashPattern(Vec<f64>),
|
|
|
|
|
/// Stored compactly as a `Vec<f64>` of corner values, materializes as an `Item<BoxCorners>` at runtime via `to_dynany`/`to_any`.
|
|
|
|
|
BoxCorners(Vec<f64>),
|
|
|
|
|
/// A plain, always-present color. Aliases recover legacy on-disk shapes; a legacy `null` payload (the old "no color")
|
|
|
|
|
/// is routed to [`TaggedValue::no_paint`] by `deserialize_tagged_value_with_legacy_migration`.
|
|
|
|
|
#[serde(deserialize_with = "core_types::misc::migrate_to_color")] // TODO: Eventually remove this migration document upgrade code
|
|
|
|
|
@@ -139,6 +143,8 @@ macro_rules! tagged_value {
|
|
|
|
|
// =======================
|
|
|
|
|
$( Self::$identifier(x) => { x.cache_hash(state) }),*
|
|
|
|
|
Self::F64Array(values) => values.cache_hash(state),
|
|
|
|
|
Self::DashPattern(lengths) => lengths.cache_hash(state),
|
|
|
|
|
Self::BoxCorners(values) => values.cache_hash(state),
|
|
|
|
|
Self::Color(color) => color.cache_hash(state),
|
|
|
|
|
Self::Gradient(stops) => stops.cache_hash(state),
|
|
|
|
|
Self::BrushStrokes(strokes) => strokes.cache_hash(state),
|
|
|
|
|
@@ -201,6 +207,8 @@ macro_rules! tagged_value {
|
|
|
|
|
let list: List<f64> = values.into_iter().map(core_types::list::Item::new_from_element).collect();
|
|
|
|
|
Box::new(list)
|
|
|
|
|
}
|
|
|
|
|
Self::DashPattern(lengths) => Box::new(Item::new_from_element(DashPattern::from(lengths))),
|
|
|
|
|
Self::BoxCorners(values) => Box::new(Item::new_from_element(BoxCorners::from(values))),
|
|
|
|
|
Self::Color(color) => Box::new(Item::new_from_element(color)),
|
|
|
|
|
Self::Gradient(stops) => Box::new(Item::new_from_element(stops)),
|
|
|
|
|
Self::BrushStrokes(strokes) => Box::new(core_types::list::Item::new_from_element(BrushTrace::from(strokes))),
|
|
|
|
|
@@ -263,6 +271,8 @@ macro_rules! tagged_value {
|
|
|
|
|
let list: List<f64> = values.into_iter().map(core_types::list::Item::new_from_element).collect();
|
|
|
|
|
Arc::new(list)
|
|
|
|
|
}
|
|
|
|
|
Self::DashPattern(lengths) => Arc::new(Item::new_from_element(DashPattern::from(lengths))),
|
|
|
|
|
Self::BoxCorners(values) => Arc::new(Item::new_from_element(BoxCorners::from(values))),
|
|
|
|
|
Self::Color(color) => Arc::new(Item::new_from_element(color)),
|
|
|
|
|
Self::Gradient(stops) => Arc::new(Item::new_from_element(stops)),
|
|
|
|
|
Self::BrushStrokes(strokes) => Arc::new(core_types::list::Item::new_from_element(BrushTrace::from(strokes))),
|
|
|
|
|
@@ -291,6 +301,8 @@ macro_rules! tagged_value {
|
|
|
|
|
Self::None => concrete!(()),
|
|
|
|
|
Self::TypeDefault(td) => td.clone(),
|
|
|
|
|
Self::F64Array(_) => list!(f64),
|
|
|
|
|
Self::DashPattern(_) => item!(DashPattern),
|
|
|
|
|
Self::BoxCorners(_) => item!(BoxCorners),
|
|
|
|
|
Self::Color(_) => item!(Color),
|
|
|
|
|
Self::Gradient(_) => item!(Gradient),
|
|
|
|
|
Self::BrushStrokes(_) => item!(BrushTrace),
|
|
|
|
|
@@ -322,7 +334,20 @@ macro_rules! tagged_value {
|
|
|
|
|
// ===============
|
|
|
|
|
// MANUAL VARIANTS
|
|
|
|
|
// ===============
|
|
|
|
|
// The manual variants convert from both their payload and wire forms, with the newtypes flattening to their stored `Vec<f64>` form
|
|
|
|
|
x if x == TypeId::of::<()>() => Ok(TaggedValue::None),
|
|
|
|
|
x if x == TypeId::of::<Vec<f64>>() => Ok(TaggedValue::F64Array(*downcast(input).unwrap())),
|
|
|
|
|
x if x == TypeId::of::<List<f64>>() => Ok(TaggedValue::F64Array(downcast::<List<f64>>(input).unwrap().iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<DashPattern>() => Ok(TaggedValue::DashPattern(downcast::<DashPattern>(input).unwrap().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Item<DashPattern>>() => Ok(TaggedValue::DashPattern(downcast::<Item<DashPattern>>(input).unwrap().into_element().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<BoxCorners>() => Ok(TaggedValue::BoxCorners(downcast::<BoxCorners>(input).unwrap().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Item<BoxCorners>>() => Ok(TaggedValue::BoxCorners(downcast::<Item<BoxCorners>>(input).unwrap().into_element().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Color>() => Ok(TaggedValue::Color(*downcast(input).unwrap())),
|
|
|
|
|
x if x == TypeId::of::<Item<Color>>() => Ok(TaggedValue::Color(downcast::<Item<Color>>(input).unwrap().into_element())),
|
|
|
|
|
x if x == TypeId::of::<Gradient>() => Ok(TaggedValue::Gradient(*downcast(input).unwrap())),
|
|
|
|
|
x if x == TypeId::of::<Item<Gradient>>() => Ok(TaggedValue::Gradient(downcast::<Item<Gradient>>(input).unwrap().into_element())),
|
|
|
|
|
x if x == TypeId::of::<Vec<BrushStroke>>() => Ok(TaggedValue::BrushStrokes(*downcast(input).unwrap())),
|
|
|
|
|
x if x == TypeId::of::<Item<BrushTrace>>() => Ok(TaggedValue::BrushStrokes(downcast::<Item<BrushTrace>>(input).unwrap().into_element().0.iter_element_values().cloned().collect())),
|
|
|
|
|
// =======================
|
|
|
|
|
// AUTO-GENERATED VARIANTS
|
|
|
|
|
// =======================
|
|
|
|
|
@@ -345,7 +370,20 @@ macro_rules! tagged_value {
|
|
|
|
|
// ===============
|
|
|
|
|
// MANUAL VARIANTS
|
|
|
|
|
// ===============
|
|
|
|
|
// The manual variants convert from both their payload and wire forms, with the newtypes flattening to their stored `Vec<f64>` form
|
|
|
|
|
x if x == TypeId::of::<()>() => Ok(TaggedValue::None),
|
|
|
|
|
x if x == TypeId::of::<Vec<f64>>() => Ok(TaggedValue::F64Array(input.downcast_ref::<Vec<f64>>().unwrap().clone())),
|
|
|
|
|
x if x == TypeId::of::<List<f64>>() => Ok(TaggedValue::F64Array(input.downcast_ref::<List<f64>>().unwrap().iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<DashPattern>() => Ok(TaggedValue::DashPattern(input.downcast_ref::<DashPattern>().unwrap().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Item<DashPattern>>() => Ok(TaggedValue::DashPattern(input.downcast_ref::<Item<DashPattern>>().unwrap().element().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<BoxCorners>() => Ok(TaggedValue::BoxCorners(input.downcast_ref::<BoxCorners>().unwrap().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Item<BoxCorners>>() => Ok(TaggedValue::BoxCorners(input.downcast_ref::<Item<BoxCorners>>().unwrap().element().0.iter_element_values().copied().collect())),
|
|
|
|
|
x if x == TypeId::of::<Color>() => Ok(TaggedValue::Color(*input.downcast_ref::<Color>().unwrap())),
|
|
|
|
|
x if x == TypeId::of::<Item<Color>>() => Ok(TaggedValue::Color(*input.downcast_ref::<Item<Color>>().unwrap().element())),
|
|
|
|
|
x if x == TypeId::of::<Gradient>() => Ok(TaggedValue::Gradient(input.downcast_ref::<Gradient>().unwrap().clone())),
|
|
|
|
|
x if x == TypeId::of::<Item<Gradient>>() => Ok(TaggedValue::Gradient(input.downcast_ref::<Item<Gradient>>().unwrap().element().clone())),
|
|
|
|
|
x if x == TypeId::of::<Vec<BrushStroke>>() => Ok(TaggedValue::BrushStrokes(input.downcast_ref::<Vec<BrushStroke>>().unwrap().clone())),
|
|
|
|
|
x if x == TypeId::of::<Item<BrushTrace>>() => Ok(TaggedValue::BrushStrokes(input.downcast_ref::<Item<BrushTrace>>().unwrap().element().0.iter_element_values().cloned().collect())),
|
|
|
|
|
// =======================
|
|
|
|
|
// AUTO-GENERATED VARIANTS
|
|
|
|
|
// =======================
|
|
|
|
|
@@ -372,6 +410,8 @@ macro_rules! tagged_value {
|
|
|
|
|
if name == std::any::type_name::<()>() { return Some(TaggedValue::None) }
|
|
|
|
|
if name == std::any::type_name::<Color>() { return Some(TaggedValue::Color(Color::default())) }
|
|
|
|
|
if name == std::any::type_name::<Gradient>() { return Some(TaggedValue::Gradient(Gradient::default())) }
|
|
|
|
|
if name == std::any::type_name::<DashPattern>() { return Some(TaggedValue::DashPattern(Vec::new())) }
|
|
|
|
|
if name == std::any::type_name::<BoxCorners>() { return Some(TaggedValue::BoxCorners(Vec::new())) }
|
|
|
|
|
$( if name == std::any::type_name::<$ty>() { return Some(TaggedValue::$identifier(Default::default())) } )*
|
|
|
|
|
if name == std::any::type_name::<BrushTrace>() { return Some(TaggedValue::BrushStrokes(Vec::new())) }
|
|
|
|
|
// Unranked types without a variant route through `TypeDefault`, with `to_dynany`/`to_any` constructing the actual default at execution time
|
|
|
|
|
@@ -423,6 +463,8 @@ macro_rules! tagged_value {
|
|
|
|
|
Self::None => "()".to_string(),
|
|
|
|
|
Self::TypeDefault(td) => format!("TypeDefault({td})"),
|
|
|
|
|
Self::F64Array(values) => format!("F64Array({values:?})"),
|
|
|
|
|
Self::DashPattern(lengths) => format!("DashPattern({lengths:?})"),
|
|
|
|
|
Self::BoxCorners(values) => format!("BoxCorners({values:?})"),
|
|
|
|
|
Self::Color(color) => format!("Color({color:?})"),
|
|
|
|
|
Self::Gradient(stops) => format!("Gradient({stops:?})"),
|
|
|
|
|
Self::BrushStrokes(strokes) => format!("BrushStrokes({strokes:?})"),
|
|
|
|
|
@@ -521,8 +563,6 @@ tagged_value! {
|
|
|
|
|
StrokeJoin(vector::style::StrokeJoin),
|
|
|
|
|
StrokeAlign(vector::style::StrokeAlign),
|
|
|
|
|
PaintOrder(vector::style::PaintOrder),
|
|
|
|
|
DashPattern(vector::style::DashPattern),
|
|
|
|
|
BoxCorners(vector::misc::BoxCorners),
|
|
|
|
|
GradientType(vector::style::GradientType),
|
|
|
|
|
GradientSpreadMethod(vector::style::GradientSpreadMethod),
|
|
|
|
|
ReferencePoint(vector::ReferencePoint),
|
|
|
|
|
@@ -670,8 +710,8 @@ impl TaggedValue {
|
|
|
|
|
() if ty == TypeId::of::<Graphic>() => to_color(string).map(TaggedValue::Color)?,
|
|
|
|
|
() if ty == TypeId::of::<Gradient>() => to_gradient(string).map(TaggedValue::Gradient)?,
|
|
|
|
|
() if ty == TypeId::of::<ReferencePoint>() => to_reference_point(string).map(TaggedValue::ReferencePoint)?,
|
|
|
|
|
() if ty == TypeId::of::<DashPattern>() => TaggedValue::DashPattern(DashPattern::from(string)),
|
|
|
|
|
() if ty == TypeId::of::<BoxCorners>() => TaggedValue::BoxCorners(BoxCorners::from(string)),
|
|
|
|
|
() if ty == TypeId::of::<DashPattern>() => TaggedValue::DashPattern(core_types::misc::parse_f64_list(string)),
|
|
|
|
|
() if ty == TypeId::of::<BoxCorners>() => TaggedValue::BoxCorners(core_types::misc::parse_f64_list(string)),
|
|
|
|
|
_ => return None,
|
|
|
|
|
};
|
|
|
|
|
Some(ty)
|
|
|
|
|
|