11use super :: base64_serde;
22use super :: layer_info:: LayerData ;
33use super :: style:: { RenderData , ViewMode } ;
4- use crate :: intersection:: { intersect_quad_bez_path, Quad } ;
4+ use crate :: intersection:: { intersect_quad_bez_path, intersect_quad_subpath , Quad } ;
55use crate :: LayerId ;
66
77use glam:: { DAffine2 , DMat2 , DVec2 } ;
8+ use graphene_core:: vector:: VectorData ;
89use kurbo:: { Affine , BezPath , Shape as KurboShape } ;
910use serde:: { Deserialize , Serialize } ;
1011use std:: fmt:: Write ;
@@ -23,6 +24,7 @@ pub struct NodeGraphFrameLayer {
2324 #[ serde( skip) ]
2425 pub dimensions : DVec2 ,
2526 pub image_data : Option < ImageData > ,
27+ pub vector_data : Option < VectorData > ,
2628}
2729
2830#[ derive( Debug , Clone , Eq , PartialEq , Deserialize , Serialize , specta:: Type ) ]
@@ -33,7 +35,7 @@ pub struct ImageData {
3335}
3436
3537impl LayerData for NodeGraphFrameLayer {
36- fn render ( & mut self , svg : & mut String , _svg_defs : & mut String , transforms : & mut Vec < DAffine2 > , render_data : & RenderData ) -> bool {
38+ fn render ( & mut self , svg : & mut String , svg_defs : & mut String , transforms : & mut Vec < DAffine2 > , render_data : & RenderData ) -> bool {
3739 let transform = self . transform ( transforms, render_data. view_mode ) ;
3840 let inverse = transform. inverse ( ) ;
3941
@@ -56,7 +58,21 @@ impl LayerData for NodeGraphFrameLayer {
5658 . enumerate ( )
5759 . fold ( String :: new ( ) , |val, ( i, entry) | val + & ( entry. to_string ( ) + if i == 5 { "" } else { "," } ) ) ;
5860
59- if let Some ( blob_url) = & self . blob_url {
61+ // Render any paths if they exist
62+ if let Some ( vector_data) = & self . vector_data {
63+ let layer_bounds = vector_data. bounding_box ( ) . unwrap_or_default ( ) ;
64+ let transfomed_bounds = vector_data. bounding_box_with_transform ( transform) . unwrap_or_default ( ) ;
65+
66+ let _ = write ! ( svg, "<path d=\" " ) ;
67+ for subpath in & vector_data. subpaths {
68+ let _ = subpath. subpath_to_svg ( svg, transform) ;
69+ }
70+ svg. push ( '"' ) ;
71+
72+ svg. push_str ( & vector_data. style . render ( render_data. view_mode , svg_defs, transform, layer_bounds, transfomed_bounds) ) ;
73+ let _ = write ! ( svg, "/>" ) ;
74+ } else if let Some ( blob_url) = & self . blob_url {
75+ // Render the image if it exists
6076 let _ = write ! (
6177 svg,
6278 r#"<image width="{}" height="{}" preserveAspectRatio="none" href="{}" transform="matrix({})" />"# ,
@@ -66,6 +82,7 @@ impl LayerData for NodeGraphFrameLayer {
6682 matrix
6783 ) ;
6884 } else {
85+ // Render a dotted blue outline if there is no image or vector data
6986 let _ = write ! (
7087 svg,
7188 r#"<rect width="{}" height="{}" fill="none" stroke="var(--color-data-vector)" stroke-width="3" stroke-dasharray="8" transform="matrix({})" />"# ,
@@ -81,6 +98,10 @@ impl LayerData for NodeGraphFrameLayer {
8198 }
8299
83100 fn bounding_box ( & self , transform : glam:: DAffine2 , _render_data : & RenderData ) -> Option < [ DVec2 ; 2 ] > {
101+ if let Some ( vector_data) = & self . vector_data {
102+ return vector_data. bounding_box_with_transform ( transform) ;
103+ }
104+
84105 let mut path = self . bounds ( ) ;
85106
86107 if transform. matrix2 == DMat2 :: ZERO {
@@ -93,7 +114,12 @@ impl LayerData for NodeGraphFrameLayer {
93114 }
94115
95116 fn intersects_quad ( & self , quad : Quad , path : & mut Vec < LayerId > , intersections : & mut Vec < Vec < LayerId > > , _render_data : & RenderData ) {
96- if intersect_quad_bez_path ( quad, & self . bounds ( ) , true ) {
117+ if let Some ( vector_data) = & self . vector_data {
118+ let filled_style = vector_data. style . fill ( ) . is_some ( ) ;
119+ if vector_data. subpaths . iter ( ) . any ( |subpath| intersect_quad_subpath ( quad, subpath, filled_style || subpath. closed ( ) ) ) {
120+ intersections. push ( path. clone ( ) ) ;
121+ }
122+ } else if intersect_quad_bez_path ( quad, & self . bounds ( ) , true ) {
97123 intersections. push ( path. clone ( ) ) ;
98124 }
99125 }
0 commit comments