use serde::{Deserialize, Serialize};
use crate::axis::ticker::TickPrune;
#[cfg(feature = "portable")]
use crate::axis::axis::AxisSide;
#[cfg(feature = "portable")]
use crate::core::color::Rgba;
#[cfg(feature = "portable")]
use crate::core::{Bbox, RcParams};
#[cfg(feature = "portable")]
use crate::figure::axes::{Annotation, SecondaryXAxis, SpanLine, SpanRect};
#[cfg(feature = "portable")]
use crate::figure::colorbar::Colorbar;
#[cfg(feature = "portable")]
use crate::figure::legend::{LegendEntry, LegendLocation};
#[cfg(feature = "portable")]
use crate::figure::plotting_contour::ContourLabelCandidate;
#[cfg(feature = "portable")]
use crate::render::{CapStyle, JoinStyle};
#[cfg(feature = "portable")]
use super::data::{Accessor, ArrF64, ArrU8};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct PortableSpec {
pub(crate) schema: u32,
pub(crate) generator: crate::portable::GeneratorRef,
pub(crate) renderer: crate::portable::RendererRef,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) meta: Option<crate::portable::Meta>,
pub(crate) figure: FigureSpec,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub(crate) timeline: Option<crate::portable::Timeline>,
pub(crate) accessors: Vec<Accessor>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct FigureSpec {
pub(crate) width_in: f64,
pub(crate) height_in: f64,
pub(crate) dpi: f64,
pub(crate) facecolor: Rgba,
pub(crate) rc: RcParams,
pub(crate) suptitle: Option<String>,
pub(crate) suptitle_color: Rgba,
pub(crate) axes: Vec<AxesSpec>,
pub(crate) colorbars: Vec<Colorbar>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct AxesSpec {
pub(crate) position: Bbox,
pub(crate) layout_envelope: Option<Bbox>,
pub(crate) sticky_x: Vec<f64>,
pub(crate) sticky_y: Vec<f64>,
pub(crate) xlim: Option<(f64, f64)>,
pub(crate) ylim: Option<(f64, f64)>,
pub(crate) margins: f64,
pub(crate) xscale: ScaleWire,
pub(crate) yscale: ScaleWire,
pub(crate) facecolor: Rgba,
pub(crate) edgecolor: Rgba,
pub(crate) linewidth: f64,
pub(crate) title_color: Rgba,
pub(crate) prop_cycle: Vec<Rgba>,
pub(crate) prop_cycle_index: usize,
pub(crate) legend_facecolor: Rgba,
pub(crate) legend_edgecolor: Rgba,
pub(crate) legend_labelcolor: Rgba,
pub(crate) legend_title: Option<String>,
pub(crate) legend_location: LegendLocation,
pub(crate) lines: Vec<LineSpec>,
pub(crate) patches: Vec<PatchSpec>,
pub(crate) collections: Vec<CollectionSpec>,
pub(crate) images: Vec<ImageSpec>,
pub(crate) meshes: Vec<QuadMeshSpec>,
pub(crate) extra_data_bbox: Option<Bbox>,
pub(crate) xaxis: AxisSpec,
pub(crate) yaxis: AxisSpec,
pub(crate) xaxis_hidden: bool,
pub(crate) xlim_link: Option<usize>,
pub(crate) secondary_x: Option<SecondaryXAxis>,
pub(crate) title: Option<String>,
pub(crate) annotations: Vec<Annotation>,
pub(crate) annotation_color: Rgba,
pub(crate) contour_label_candidates: Vec<ContourLabelCandidate>,
pub(crate) frame: bool,
pub(crate) aspect_equal: bool,
pub(crate) axis_visible: bool,
pub(crate) scope: bool,
pub(crate) span_lines: Vec<SpanLine>,
pub(crate) span_rects: Vec<SpanRect>,
pub(crate) legend: Vec<LegendEntry>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct AxisSpec {
pub(crate) side: AxisSide,
pub(crate) scale: ScaleWire,
pub(crate) locator: LocatorSpec,
pub(crate) formatter: FormatterSpec,
pub(crate) label: Option<String>,
pub(crate) color: Rgba,
pub(crate) tick_length: f64,
pub(crate) tick_width: f64,
pub(crate) tick_label_size: f64,
pub(crate) axis_label_size: f64,
pub(crate) tick_label_pad: f64,
pub(crate) axis_label_pad: f64,
pub(crate) grid: bool,
pub(crate) grid_color: Rgba,
pub(crate) grid_linewidth: f64,
pub(crate) grid_alpha: f64,
pub(crate) tick_direction: crate::core::rcparams::TickDirection,
pub(crate) tick_labels_visible: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct LineSpec {
pub(crate) x: ArrF64,
pub(crate) y: ArrF64,
pub(crate) color: Rgba,
pub(crate) linewidth: f64,
pub(crate) dashes: Option<(f64, Vec<f64>)>,
pub(crate) cap: CapStyle,
pub(crate) join: JoinStyle,
pub(crate) visible: bool,
pub(crate) zorder: f64,
pub(crate) label: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct PatchSpec {
pub(crate) path: PathSpec,
pub(crate) facecolor: Option<Rgba>,
pub(crate) edgecolor: Option<Rgba>,
pub(crate) linewidth: f64,
pub(crate) dashes: Option<(f64, Vec<f64>)>,
pub(crate) cap: CapStyle,
pub(crate) join: JoinStyle,
pub(crate) visible: bool,
pub(crate) zorder: f64,
pub(crate) label: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct CollectionSpec {
pub(crate) offsets: ArrF64,
pub(crate) marker: PathSpec,
pub(crate) sizes: ArrF64,
pub(crate) facecolors: Vec<Rgba>,
pub(crate) edgecolors: Vec<Rgba>,
pub(crate) linewidth: f64,
pub(crate) visible: bool,
pub(crate) zorder: f64,
pub(crate) label: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct ImageSpec {
pub(crate) data: ArrF64,
pub(crate) nrows: usize,
pub(crate) ncols: usize,
pub(crate) extent: [f64; 4],
pub(crate) vmin: f64,
pub(crate) vmax: f64,
pub(crate) cmap: String,
pub(crate) origin_upper: bool,
pub(crate) zorder: f64,
pub(crate) visible: bool,
pub(crate) label: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct QuadMeshSpec {
pub(crate) nrows: usize,
pub(crate) ncols: usize,
pub(crate) coordinates: ArrF64,
pub(crate) facecolors: Vec<Rgba>,
pub(crate) vertex_colors: Option<Vec<Rgba>>,
pub(crate) edgecolor: Option<Rgba>,
pub(crate) linewidth: f64,
pub(crate) zorder: f64,
pub(crate) visible: bool,
pub(crate) label: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(deny_unknown_fields)]
#[cfg(feature = "portable")]
pub(crate) struct PathSpec {
pub(crate) verts: ArrF64,
pub(crate) codes: Option<ArrU8>,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub(crate) enum ScaleWire {
Linear,
Log {
base: f64,
},
Symlog {
base: f64,
linthresh: f64,
linscale: f64,
},
Logit,
Asinh {
linear_width: f64,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub(crate) enum LocatorSpec {
MaxN {
nbins: Option<usize>,
extended_steps: Vec<f64>,
integer: bool,
symmetric: bool,
min_n_ticks: usize,
prune: TickPrune,
},
Auto,
AutoMinor {
subdivisions: Option<usize>,
},
Multiple {
step: f64,
offset: f64,
},
LinearN {
numticks: usize,
},
Fixed {
locs: Vec<f64>,
nbins: Option<usize>,
},
Log {
base: f64,
subs: Vec<f64>,
},
Symlog {
base: f64,
linthresh: f64,
linear_ticks: usize,
},
Asinh {
base: f64,
linear_width: f64,
linear_ticks: usize,
},
Logit {
max_exponent: i32,
},
Index {
base: f64,
offset: f64,
},
Null,
AutoDate {
maxticks: usize,
},
AutoDateMinor {
maxticks: usize,
},
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "snake_case", deny_unknown_fields)]
pub(crate) enum FormatterSpec {
Scalar {
decimals: Option<usize>,
},
Log {
base: f64,
},
LogMathtext {
base: f64,
},
Symlog {
base: f64,
linthresh: f64,
},
SymlogMathtext {
base: f64,
linthresh: f64,
},
Asinh {
base: f64,
linear_width: f64,
},
AsinhMathtext {
base: f64,
linear_width: f64,
},
Logit {
max_exponent: i32,
},
LogitMathtext {
max_exponent: i32,
},
Eng {
unit: String,
places: Option<usize>,
separator: String,
},
Percent {
xmax: f64,
decimals: usize,
symbol: String,
},
Null,
Fixed {
seq: Vec<String>,
},
Index {
labels: Vec<String>,
},
FormatStr {
fmt: String,
},
StrMethod {
fmt: String,
},
Date {
fmt: String,
},
ConciseDate,
}