use serde::{Deserialize, Serialize};
use crate::primitives::{
BorderRadius, BoxShadowClipMode, ColorF, DeviceIntSideOffsets, ExtendMode, FontInstanceKey,
GradientStop, ImageKey, ImageRendering, LayoutPoint, LayoutRect, LayoutSideOffsets, LayoutSize,
LayoutVector2D, LineStyle, NormalBorder, RepeatMode,
};
use crate::CommonPlacement;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RectItem {
pub placement: CommonPlacement,
pub color: ColorF,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct StrokeItem {
pub placement: CommonPlacement,
pub path: PathData,
pub color: ColorF,
pub width: f32,
pub cap: StrokeCap,
pub join: StrokeJoin,
pub dash: Option<DashPattern>,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum StrokeCap {
#[default]
Butt,
Round,
Square,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum StrokeJoin {
Bevel,
#[default]
Miter,
Round,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct DashPattern {
pub intervals: Vec<f32>,
pub offset: f32,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LineItem {
pub placement: CommonPlacement,
pub color: ColorF,
pub style: LineStyle,
pub orientation: LineOrientation,
pub wavy_thickness: f32,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum LineOrientation {
#[default]
Horizontal,
Vertical,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct PathItem {
pub placement: CommonPlacement,
pub path: PathData,
pub fill: Option<ColorF>,
pub stroke: Option<StrokeStyle>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct StrokeStyle {
pub color: ColorF,
pub width: f32,
pub cap: StrokeCap,
pub join: StrokeJoin,
pub dash: Option<DashPattern>,
}
#[derive(Clone, Debug, Default, Deserialize, Serialize)]
pub struct PathData {
pub commands: Vec<PathCommand>,
}
#[derive(Clone, Copy, Debug, Deserialize, PartialEq, Serialize)]
pub enum PathCommand {
MoveTo(LayoutPoint),
LineTo(LayoutPoint),
QuadTo {
control: LayoutPoint,
to: LayoutPoint,
},
CurveTo {
control1: LayoutPoint,
control2: LayoutPoint,
to: LayoutPoint,
},
Close,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct BorderItem {
pub placement: CommonPlacement,
pub widths: LayoutSideOffsets,
pub details: BorderDetails,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum BorderDetails {
Normal(NormalBorder),
NinePatch(NinePatchBorder),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct NinePatchBorder {
pub source: NinePatchSource,
pub width: i32,
pub height: i32,
pub slice: DeviceIntSideOffsets,
pub fill: bool,
pub repeat_horizontal: RepeatMode,
pub repeat_vertical: RepeatMode,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub enum NinePatchSource {
Image(ImageKey, ImageRendering),
LinearGradient(LinearGradientPayload),
RadialGradient(RadialGradientPayload),
ConicGradient(ConicGradientPayload),
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LinearGradientItem {
pub placement: CommonPlacement,
pub gradient: LinearGradientPayload,
pub tile_size: LayoutSize,
pub tile_spacing: LayoutSize,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct LinearGradientPayload {
pub start_point: LayoutPoint,
pub end_point: LayoutPoint,
pub extend_mode: ExtendMode,
pub stops: Vec<GradientStop>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RadialGradientItem {
pub placement: CommonPlacement,
pub gradient: RadialGradientPayload,
pub tile_size: LayoutSize,
pub tile_spacing: LayoutSize,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RadialGradientPayload {
pub center: LayoutPoint,
pub radius: LayoutSize,
pub extend_mode: ExtendMode,
pub stops: Vec<GradientStop>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ConicGradientItem {
pub placement: CommonPlacement,
pub gradient: ConicGradientPayload,
pub tile_size: LayoutSize,
pub tile_spacing: LayoutSize,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ConicGradientPayload {
pub center: LayoutPoint,
pub angle: f32,
pub extend_mode: ExtendMode,
pub stops: Vec<GradientStop>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct TextRunItem {
pub placement: CommonPlacement,
pub font_instance: FontInstanceKey,
pub font_size: f32,
pub color: ColorF,
pub glyphs: Vec<GlyphInstance>,
pub options: TextOptions,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct GlyphInstance {
pub index: u32,
pub point: LayoutPoint,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, PartialEq, Serialize)]
pub struct TextOptions {
pub render_mode: FontRenderMode,
pub hint_metrics: bool,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum FontRenderMode {
Mono,
Alpha,
#[default]
Subpixel,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ImageItem {
pub placement: CommonPlacement,
pub image_key: ImageKey,
pub image_rendering: ImageRendering,
pub alpha_type: AlphaType,
pub color: ColorF,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct RepeatingImageItem {
pub placement: CommonPlacement,
pub image_key: ImageKey,
pub stretch_size: LayoutSize,
pub tile_spacing: LayoutSize,
pub image_rendering: ImageRendering,
pub alpha_type: AlphaType,
pub color: ColorF,
}
#[derive(Clone, Copy, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
pub enum AlphaType {
#[default]
Alpha,
PremultipliedAlpha,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ExternalTextureItem {
pub placement: CommonPlacement,
pub texture_key: u64,
pub opacity: f32,
pub content_generation: Option<u64>,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ShadowItem {
pub placement: CommonPlacement,
pub box_bounds: LayoutRect,
pub offset: LayoutVector2D,
pub color: ColorF,
pub blur_radius: f32,
pub spread_radius: f32,
pub border_radius: BorderRadius,
pub clip_mode: BoxShadowClipMode,
}
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct HitTestItem {
pub placement: CommonPlacement,
pub tag: u64,
}