@@ -12,9 +12,11 @@ use core::f64::consts::{FRAC_PI_2, PI, TAU};
1212use glam:: { DAffine2 , DVec2 } ;
1313use graphene_std:: Color ;
1414use graphene_std:: math:: quad:: Quad ;
15+ use graphene_std:: raster:: curve;
1516use graphene_std:: subpath:: Subpath ;
1617use graphene_std:: vector:: click_target:: ClickTargetType ;
1718use graphene_std:: vector:: misc:: { dvec2_to_point, point_to_dvec2} ;
19+ use graphene_std:: vector:: stroke:: DashLengthsInput ;
1820use graphene_std:: vector:: style:: Stroke ;
1921use graphene_std:: vector:: { PointId , SegmentId , Vector } ;
2022use kurbo:: { self , Affine , CubicBez , ParamCurve , PathSeg } ;
@@ -907,45 +909,50 @@ impl OverlayContext {
907909 self . end_dpi_aware_transform ( ) ;
908910 }
909911
910- pub fn draw_path_from_subpaths ( & mut self , subpaths : impl Iterator < Item = impl Borrow < Subpath < PointId > > > , transform : DAffine2 , stroke_transform : Option < DAffine2 > ) {
911- self . start_dpi_aware_transform ( ) ;
912-
913- // let a = stroke_transform.matrix2.x_axis.x;
914- // let b = stroke_transform.matrix2.y_axis.x;
915- // let c = stroke_transform.matrix2.x_axis.y;
916- // let d = stroke_transform.matrix2.y_axis.y;
917- // let e = stroke_transform.translation.x;
918- // let f = stroke_transform.translation.y;
912+ pub fn draw_path_from_subpaths ( & mut self , subpaths : impl Iterator < Item = impl Borrow < Subpath < PointId > > > , stroke_transform : DAffine2 ) {
913+ // self.render_context.save();
914+ // self.start_dpi_aware_transform();
915+
916+ // let a = transform.matrix2.x_axis.x;
917+ // let b = transform.matrix2.y_axis.x;
918+ // let c = transform.matrix2.x_axis.y;
919+ // let d = transform.matrix2.y_axis.y;
920+ // let e = transform.translation.x;
921+ // let f = transform.translation.y;
922+ // self.render_context.transform(a, b, c, d, e, f);
923+ // self.render_context.set_transform(a, b, c, d, e, f);
919924 self . render_context . begin_path ( ) ;
920925 for subpath in subpaths {
921- let mut subpath = subpath. borrow ( ) . clone ( ) ;
922- let mut curves = subpath. iter ( ) . peekable ( ) ;
926+ let subpath = subpath. borrow ( ) . clone ( ) ;
927+ let mut bezpath = subpath. to_bezpath ( ) ;
928+ bezpath. apply_affine ( Affine :: new ( ( stroke_transform) . to_cols_array ( ) ) ) ;
929+ let mut curves = bezpath. segments ( ) . peekable ( ) ;
923930
924931 let Some ( & first) = curves. peek ( ) else {
925932 continue ;
926933 } ;
927934
928- let start_point = transform . transform_point2 ( point_to_dvec2 ( first. start ( ) ) ) ;
935+ let start_point = point_to_dvec2 ( first. start ( ) ) ;
929936 self . render_context . move_to ( start_point. x , start_point. y ) ;
930937
931938 for curve in curves {
932939 match curve {
933940 PathSeg :: Line ( line) => {
934- let a = transform . transform_point2 ( point_to_dvec2 ( line. p1 ) ) ;
941+ let a = point_to_dvec2 ( line. p1 ) ;
935942 let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
936943 self . render_context . line_to ( a. x , a. y ) ;
937944 }
938945 PathSeg :: Quad ( quad_bez) => {
939- let a = transform . transform_point2 ( point_to_dvec2 ( quad_bez. p1 ) ) ;
940- let b = transform . transform_point2 ( point_to_dvec2 ( quad_bez. p2 ) ) ;
946+ let a = point_to_dvec2 ( quad_bez. p1 ) ;
947+ let b = point_to_dvec2 ( quad_bez. p2 ) ;
941948 let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
942949 let b = b. round ( ) - DVec2 :: splat ( 0.5 ) ;
943950 self . render_context . quadratic_curve_to ( a. x , a. y , b. x , b. y ) ;
944951 }
945952 PathSeg :: Cubic ( cubic_bez) => {
946- let a = transform . transform_point2 ( point_to_dvec2 ( cubic_bez. p1 ) ) ;
947- let b = transform . transform_point2 ( point_to_dvec2 ( cubic_bez. p2 ) ) ;
948- let c = transform . transform_point2 ( point_to_dvec2 ( cubic_bez. p3 ) ) ;
953+ let a = point_to_dvec2 ( cubic_bez. p1 ) ;
954+ let b = point_to_dvec2 ( cubic_bez. p2 ) ;
955+ let c = point_to_dvec2 ( cubic_bez. p3 ) ;
949956 let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
950957 let b = b. round ( ) - DVec2 :: splat ( 0.5 ) ;
951958 let c = c. round ( ) - DVec2 :: splat ( 0.5 ) ;
@@ -959,11 +966,14 @@ impl OverlayContext {
959966 }
960967 }
961968
962- self . end_dpi_aware_transform ( ) ;
969+ // self.end_dpi_aware_transform();
970+ // self.render_context.restore();
963971 }
964972
965973 /// Used by the Select tool to outline a path or a free point when selected or hovered.
966974 pub fn outline ( & mut self , target_types : impl Iterator < Item = impl Borrow < ClickTargetType > > , transform : DAffine2 , color : Option < & str > ) {
975+ self . render_context . save ( ) ;
976+ self . start_dpi_aware_transform ( ) ;
967977 let mut subpaths: Vec < Subpath < PointId > > = vec ! [ ] ;
968978
969979 target_types. for_each ( |target_type| match target_type. borrow ( ) {
@@ -974,13 +984,16 @@ impl OverlayContext {
974984 } ) ;
975985
976986 if !subpaths. is_empty ( ) {
977- self . draw_path_from_subpaths ( subpaths. iter ( ) , transform, None ) ;
987+ // TODO: Modify stroke_transform to take note of this
988+ self . draw_path_from_subpaths ( subpaths. iter ( ) , transform) ;
978989
979990 let color = color. unwrap_or ( COLOR_OVERLAY_BLUE ) ;
980991 self . render_context . set_stroke_style_str ( color) ;
981992 self . render_context . set_line_width ( 1. ) ;
982993 self . render_context . stroke ( ) ;
983994 }
995+ self . end_dpi_aware_transform ( ) ;
996+ self . render_context . restore ( ) ;
984997 }
985998
986999 /// Default canvas pattern used for filling stroke or fill of a path.
@@ -1029,63 +1042,60 @@ impl OverlayContext {
10291042 stroke_width : Option < f64 > ,
10301043 ) {
10311044 self . render_context . save ( ) ;
1032- self . render_context . set_line_width ( stroke_width. unwrap_or ( 1. ) ) ;
1033- self . draw_path_from_subpaths ( subpaths, transform, Some ( stroke_transform) ) ;
1045+ self . start_dpi_aware_transform ( ) ;
10341046
10351047 if with_pattern {
10361048 self . render_context . set_fill_style_canvas_pattern ( & self . fill_canvas_pattern ( color) ) ;
10371049 } else {
10381050 let color_str = format ! ( "#{:?}" , color. to_rgba_hex_srgb( ) ) ;
10391051 self . render_context . set_fill_style_str ( & color_str. as_str ( ) ) ;
10401052 }
1053+ // let stroke_transform = Some(stroke_transform).filter(|transform| transform.matrix2.determinant() != 0.).unwrap_or(DAffine2::IDENTITY);
1054+ let a = transform. matrix2 . x_axis . x ;
1055+ let b = transform. matrix2 . y_axis . x ;
1056+ let c = transform. matrix2 . x_axis . y ;
1057+ let d = transform. matrix2 . y_axis . y ;
1058+ let e = transform. translation . x ;
1059+ let f = transform. translation . y ;
1060+ self . render_context . transform ( a, b, c, d, e, f) ;
1061+ self . draw_path_from_subpaths ( subpaths, stroke_transform) ;
10411062 self . render_context . fill ( ) ;
10421063
10431064 // Make the stroke transparent and erase the fill area overlapping the stroke.
10441065 if clear_stroke_part {
1045- // self.render_context.save();
1046- // let stroke_transform = Some(stroke_transform).filter(|transform| transform.matrix2.determinant() != 0.).unwrap_or(DAffine2::IDENTITY);
1047- // let a = stroke_transform.matrix2.x_axis.x;
1048- // let b = stroke_transform.matrix2.y_axis.x;
1049- // let c = stroke_transform.matrix2.x_axis.y;
1050- // let d = stroke_transform.matrix2.y_axis.y;
1051- // let e = stroke_transform.translation.x;
1052- // let f = stroke_transform.translation.y;
1053- // self.render_context.set_transform(a, b, c, d, e, f);
1054-
1066+ self . render_context . set_line_width ( stroke_width. unwrap_or ( 1. ) ) ;
10551067 self . render_context . set_global_composite_operation ( "destination-out" ) . expect ( "Failed to set global composite operation" ) ;
10561068 self . render_context . set_stroke_style_str ( & "#000000" ) ;
10571069 self . render_context . stroke ( ) ;
1058- // self.render_context.restore();
10591070 }
10601071
1072+ self . end_dpi_aware_transform ( ) ;
10611073 self . render_context . restore ( ) ;
10621074 }
10631075
10641076 pub fn fill_stroke ( & mut self , subpaths : impl Iterator < Item = impl Borrow < Subpath < PointId > > > , transform : DAffine2 , overlay_stroke : & Stroke ) {
10651077 self . render_context . save ( ) ;
1066-
1067- // debug!("overlay_stroke.weight * ptz.zoom(): {:?}", overlay_stroke.weight);
1068- self . render_context . set_line_width ( overlay_stroke. weight ) ;
1069- self . draw_path_from_subpaths ( subpaths, transform, Some ( overlay_stroke. transform ) ) ;
1070-
1071- // self.render_context.save();
1072- // let stroke_transform = Some(overlay_stroke.transform).filter(|transform| transform.matrix2.determinant() != 0.).unwrap_or(DAffine2::IDENTITY);
1073- // let a = stroke_transform.matrix2.x_axis.x;
1074- // let b = stroke_transform.matrix2.y_axis.x;
1075- // let c = stroke_transform.matrix2.x_axis.y;
1076- // let d = stroke_transform.matrix2.y_axis.y;
1077- // let e = stroke_transform.translation.x;
1078- // let f = stroke_transform.translation.y;
1079- // self.render_context.set_transform(a, b, c, d, e, f);
1078+ self . start_dpi_aware_transform ( ) ;
10801079
10811080 self . render_context
10821081 . set_stroke_style_canvas_pattern ( & self . fill_canvas_pattern ( & overlay_stroke. color . expect ( "Color should be set for fill_stroke()" ) ) ) ;
1082+ self . render_context . set_line_width ( overlay_stroke. weight ) ;
10831083 self . render_context . set_line_cap ( overlay_stroke. cap . html_canvas_name ( ) . as_str ( ) ) ;
10841084 self . render_context . set_line_join ( overlay_stroke. join . html_canvas_name ( ) . as_str ( ) ) ;
10851085 self . render_context . set_miter_limit ( overlay_stroke. join_miter_limit ) ;
1086+ // let stroke_transform = Some(overlay_stroke.transform).filter(|transform| transform.matrix2.determinant() != 0.).unwrap_or(DAffine2::IDENTITY);
1087+ // let stroke_transform = overlay_stroke.transform;
1088+ let a = transform. matrix2 . x_axis . x ;
1089+ let b = transform. matrix2 . y_axis . x ;
1090+ let c = transform. matrix2 . x_axis . y ;
1091+ let d = transform. matrix2 . y_axis . y ;
1092+ let e = transform. translation . x ;
1093+ let f = transform. translation . y ;
1094+ self . render_context . transform ( a, b, c, d, e, f) ;
1095+ self . draw_path_from_subpaths ( subpaths, overlay_stroke. transform ) ;
10861096 self . render_context . stroke ( ) ;
1087- // self.render_context.restore();
10881097
1098+ self . end_dpi_aware_transform ( ) ;
10891099 self . render_context . restore ( ) ;
10901100 }
10911101
0 commit comments