@@ -3,6 +3,7 @@ use crate::bounds::{BoundingBox, RenderBoundingBox};
33use crate :: gradient:: GradientStops ;
44use crate :: raster_types:: { CPU , GPU , Raster } ;
55use crate :: table:: { Table , TableRow } ;
6+ use crate :: text:: Typography ;
67use crate :: uuid:: NodeId ;
78use crate :: vector:: Vector ;
89use crate :: { Artboard , Color , Ctx } ;
@@ -11,14 +12,34 @@ use glam::{DAffine2, DVec2};
1112use std:: hash:: Hash ;
1213
1314/// The possible forms of graphical content that can be rendered by the Render node into either an image or SVG syntax.
14- #[ derive( Clone , Debug , Hash , PartialEq , DynAny , serde :: Serialize , serde :: Deserialize ) ]
15+ #[ derive( Clone , Debug , Hash , PartialEq , DynAny ) ]
1516pub enum Graphic {
1617 Graphic ( Table < Graphic > ) ,
1718 Vector ( Table < Vector > ) ,
1819 RasterCPU ( Table < Raster < CPU > > ) ,
1920 RasterGPU ( Table < Raster < GPU > > ) ,
2021 Color ( Table < Color > ) ,
2122 Gradient ( Table < GradientStops > ) ,
23+ Typography ( Table < Typography > ) ,
24+ }
25+
26+ impl serde:: Serialize for Graphic {
27+ fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
28+ where
29+ S : serde:: Serializer ,
30+ {
31+ let default: Table < Graphic > = Table :: new ( ) ;
32+ default. serialize ( serializer)
33+ }
34+ }
35+
36+ impl < ' de > serde:: Deserialize < ' de > for Graphic {
37+ fn deserialize < D > ( _deserializer : D ) -> Result < Self , D :: Error >
38+ where
39+ D : serde:: Deserializer < ' de > ,
40+ {
41+ Ok ( Graphic :: Graphic ( Table :: new ( ) ) )
42+ }
2243}
2344
2445impl Default for Graphic {
@@ -232,6 +253,7 @@ impl Graphic {
232253 Graphic :: RasterGPU ( raster) => raster. iter ( ) . all ( |row| row. alpha_blending . clip ) ,
233254 Graphic :: Color ( color) => color. iter ( ) . all ( |row| row. alpha_blending . clip ) ,
234255 Graphic :: Gradient ( gradient) => gradient. iter ( ) . all ( |row| row. alpha_blending . clip ) ,
256+ Graphic :: Typography ( typography) => typography. iter ( ) . all ( |row| row. alpha_blending . clip ) ,
235257 }
236258 }
237259
@@ -256,6 +278,7 @@ impl BoundingBox for Graphic {
256278 Graphic :: Graphic ( graphic) => graphic. bounding_box ( transform, include_stroke) ,
257279 Graphic :: Color ( color) => color. bounding_box ( transform, include_stroke) ,
258280 Graphic :: Gradient ( gradient) => gradient. bounding_box ( transform, include_stroke) ,
281+ Graphic :: Typography ( typography) => typography. bounding_box ( transform, include_stroke) ,
259282 }
260283 }
261284}
@@ -507,34 +530,15 @@ pub fn migrate_graphic<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Res
507530 elements : Vec < ( Graphic , Option < NodeId > ) > ,
508531 }
509532
510- #[ derive( Clone , Debug , serde:: Serialize , serde:: Deserialize ) ]
511- pub struct OlderTable < T > {
512- id : Vec < u64 > ,
513- #[ serde( alias = "instances" , alias = "instance" ) ]
514- element : Vec < T > ,
515- }
516-
517- #[ derive( Clone , Debug , serde:: Serialize , serde:: Deserialize ) ]
518- pub struct OldTable < T > {
519- id : Vec < u64 > ,
520- #[ serde( alias = "instances" , alias = "instance" ) ]
521- element : Vec < T > ,
522- transform : Vec < DAffine2 > ,
523- alpha_blending : Vec < AlphaBlending > ,
524- }
525-
526533 #[ derive( serde:: Serialize , serde:: Deserialize ) ]
527534 #[ serde( untagged) ]
528- enum GraphicFormat {
535+ enum EitherFormat {
529536 OldGraphicGroup ( OldGraphicGroup ) ,
530- OlderTableOldGraphicGroup ( OlderTable < OldGraphicGroup > ) ,
531- OldTableOldGraphicGroup ( OldTable < OldGraphicGroup > ) ,
532- OldTableGraphicGroup ( OldTable < GraphicGroup > ) ,
533537 Table ( serde_json:: Value ) ,
534538 }
535539
536- Ok ( match GraphicFormat :: deserialize ( deserializer) ? {
537- GraphicFormat :: OldGraphicGroup ( old) => {
540+ Ok ( match EitherFormat :: deserialize ( deserializer) ? {
541+ EitherFormat :: OldGraphicGroup ( old) => {
538542 let mut graphic_table = Table :: new ( ) ;
539543 for ( graphic, source_node_id) in old. elements {
540544 graphic_table. push ( TableRow {
@@ -546,43 +550,7 @@ pub fn migrate_graphic<'de, D: serde::Deserializer<'de>>(deserializer: D) -> Res
546550 }
547551 graphic_table
548552 }
549- GraphicFormat :: OlderTableOldGraphicGroup ( old) => old
550- . element
551- . into_iter ( )
552- . flat_map ( |element| {
553- element. elements . into_iter ( ) . map ( move |( graphic, source_node_id) | TableRow {
554- element : graphic,
555- transform : element. transform ,
556- alpha_blending : element. alpha_blending ,
557- source_node_id,
558- } )
559- } )
560- . collect ( ) ,
561- GraphicFormat :: OldTableOldGraphicGroup ( old) => old
562- . element
563- . into_iter ( )
564- . flat_map ( |element| {
565- element. elements . into_iter ( ) . map ( move |( graphic, source_node_id) | TableRow {
566- element : graphic,
567- transform : element. transform ,
568- alpha_blending : element. alpha_blending ,
569- source_node_id,
570- } )
571- } )
572- . collect ( ) ,
573- GraphicFormat :: OldTableGraphicGroup ( old) => old
574- . element
575- . into_iter ( )
576- . flat_map ( |element| {
577- element. elements . into_iter ( ) . map ( move |( graphic, source_node_id) | TableRow {
578- element : graphic,
579- transform : Default :: default ( ) ,
580- alpha_blending : Default :: default ( ) ,
581- source_node_id,
582- } )
583- } )
584- . collect ( ) ,
585- GraphicFormat :: Table ( value) => {
553+ EitherFormat :: Table ( value) => {
586554 // Try to deserialize as either table format
587555 if let Ok ( old_table) = serde_json:: from_value :: < Table < GraphicGroup > > ( value. clone ( ) ) {
588556 let mut graphic_table = Table :: new ( ) ;
0 commit comments