Skip to content

Commit 628c7a4

Browse files
committed
Add conversion from Fill to Table<Graphic>
1 parent 269a217 commit 628c7a4

2 files changed

Lines changed: 47 additions & 1 deletion

File tree

node-graph/libraries/graphic-types/src/graphic.rs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,15 @@ use core_types::ops::TableConvert;
55
use core_types::render_complexity::RenderComplexity;
66
use core_types::table::{Table, TableRow};
77
use core_types::uuid::NodeId;
8-
use core_types::{ATTR_CLIPPING_MASK, ATTR_EDITOR_LAYER_PATH, ATTR_OPACITY, ATTR_OPACITY_FILL, ATTR_TRANSFORM, Color};
8+
use core_types::{ATTR_CLIPPING_MASK, ATTR_EDITOR_LAYER_PATH, ATTR_GRADIENT_TYPE, ATTR_OPACITY, ATTR_OPACITY_FILL, ATTR_SPREAD_METHOD, ATTR_TRANSFORM, Color};
99
use dyn_any::DynAny;
1010
use glam::DAffine2;
1111
use raster_types::{CPU, GPU, Raster};
1212
use vector_types::GradientStops;
1313
// use vector_types::Vector;
1414

1515
pub use vector_types::Vector;
16+
use vector_types::vector::style::Fill;
1617

1718
/// The possible forms of graphical content that can be rendered by the Render node into either an image or SVG syntax.
1819
#[derive(Clone, Debug, CacheHash, PartialEq, DynAny)]
@@ -193,6 +194,22 @@ fn flatten_graphic_table<T>(content: Table<Graphic>, extract_variant: fn(Graphic
193194
output
194195
}
195196

197+
fn fill_to_paint(fill: Fill) -> Option<Table<Graphic>> {
198+
match fill {
199+
Fill::None => None,
200+
Fill::Solid(color) => Some(Table::new_from_element(color.into())),
201+
Fill::Gradient(gradient) => {
202+
let gradient_row = TableRow::new_from_element(gradient.stops.clone())
203+
.with_attribute(ATTR_TRANSFORM, gradient.to_transform())
204+
.with_attribute(ATTR_GRADIENT_TYPE, gradient.gradient_type)
205+
.with_attribute(ATTR_SPREAD_METHOD, gradient.spread_method);
206+
let gradient_table = Table::new_from_row(gradient_row);
207+
208+
Some(Table::new_from_element(Graphic::Gradient(gradient_table)))
209+
}
210+
}
211+
}
212+
196213
/// Maps from a concrete element type to its corresponding `Graphic` enum variant,
197214
/// enabling type-directed casting of typed `Table`s from a `Graphic` value.
198215
pub trait TryFromGraphic: Clone + Sized {

node-graph/libraries/vector-types/src/gradient.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -523,6 +523,11 @@ impl Gradient {
523523

524524
Some(index)
525525
}
526+
527+
pub fn to_transform(&self) -> DAffine2 {
528+
let direction = self.end - self.start;
529+
DAffine2::from_cols(direction, direction.perp(), self.start)
530+
}
526531
}
527532

528533
// TODO: Eventually remove this migration document upgrade code
@@ -556,3 +561,27 @@ impl core_types::bounds::BoundingBox for GradientStops {
556561
core_types::bounds::RenderBoundingBox::Rectangle([start.min(end), start.max(end)])
557562
}
558563
}
564+
565+
#[cfg(test)]
566+
mod tests {
567+
use super::*;
568+
use glam::DVec2;
569+
570+
fn linear_gradient(start: DVec2, end: DVec2) -> Gradient {
571+
Gradient { start, end, ..Default::default() }
572+
}
573+
574+
#[test]
575+
fn to_transform_roundtrip() {
576+
let cases = [(DVec2::ZERO, DVec2::X), (DVec2::new(10., 20.), DVec2::new(50., 30.)), (DVec2::new(-5., -5.), DVec2::new(5., 3.))];
577+
578+
for (start, end) in cases {
579+
let transform = linear_gradient(start, end).to_transform();
580+
let recovered_start = transform.transform_point2(DVec2::ZERO);
581+
let recovered_end = transform.transform_point2(DVec2::X);
582+
583+
assert!((recovered_start - start).length() < 1e-10);
584+
assert!((recovered_end - end).length() < 1e-10);
585+
}
586+
}
587+
}

0 commit comments

Comments
 (0)