@@ -5,14 +5,16 @@ use crate::consts::{
5
5
PIVOT_CROSSHAIR_LENGTH , PIVOT_CROSSHAIR_THICKNESS , PIVOT_DIAMETER , SEGMENT_SELECTED_THICKNESS ,
6
6
} ;
7
7
use crate :: messages:: prelude:: Message ;
8
- use bezier_rs:: { Bezier , Subpath } ;
9
8
use core:: borrow:: Borrow ;
10
9
use core:: f64:: consts:: { FRAC_PI_2 , PI , TAU } ;
11
10
use glam:: { DAffine2 , DVec2 } ;
11
+ use graphene_core:: subpath:: Subpath ;
12
12
use graphene_std:: Color ;
13
13
use graphene_std:: math:: quad:: Quad ;
14
14
use graphene_std:: vector:: click_target:: ClickTargetType ;
15
+ use graphene_std:: vector:: misc:: { dvec2_to_point, point_to_dvec2} ;
15
16
use graphene_std:: vector:: { PointId , SegmentId , Vector } ;
17
+ use kurbo:: { self , Affine , CubicBez , ParamCurve , PathSeg } ;
16
18
use std:: collections:: HashMap ;
17
19
use wasm_bindgen:: { JsCast , JsValue } ;
18
20
use web_sys:: { OffscreenCanvas , OffscreenCanvasRenderingContext2d } ;
@@ -571,11 +573,7 @@ impl OverlayContext {
571
573
let handle_start = start + start_vec. perp ( ) * radius * factor;
572
574
let handle_end = end - end_vec. perp ( ) * radius * factor;
573
575
574
- let bezier = Bezier {
575
- start,
576
- end,
577
- handles : bezier_rs:: BezierHandles :: Cubic { handle_start, handle_end } ,
578
- } ;
576
+ let bezier = PathSeg :: Cubic ( CubicBez :: new ( dvec2_to_point ( start) , dvec2_to_point ( handle_start) , dvec2_to_point ( handle_end) , dvec2_to_point ( end) ) ) ;
579
577
580
578
self . bezier_command ( bezier, DAffine2 :: IDENTITY , i == 0 ) ;
581
579
}
@@ -762,7 +760,7 @@ impl OverlayContext {
762
760
763
761
self . render_context . begin_path ( ) ;
764
762
let mut last_point = None ;
765
- for ( _, bezier, start_id, end_id) in vector. segment_bezier_iter ( ) {
763
+ for ( _, bezier, start_id, end_id) in vector. segment_iter ( ) {
766
764
let move_to = last_point != Some ( start_id) ;
767
765
last_point = Some ( end_id) ;
768
766
@@ -776,7 +774,7 @@ impl OverlayContext {
776
774
}
777
775
778
776
/// Used by the Pen tool in order to show how the bezier curve would look like.
779
- pub fn outline_bezier ( & mut self , bezier : Bezier , transform : DAffine2 ) {
777
+ pub fn outline_bezier ( & mut self , bezier : PathSeg , transform : DAffine2 ) {
780
778
self . start_dpi_aware_transform ( ) ;
781
779
782
780
self . render_context . begin_path ( ) ;
@@ -788,7 +786,7 @@ impl OverlayContext {
788
786
}
789
787
790
788
/// Used by the path tool segment mode in order to show the selected segments.
791
- pub fn outline_select_bezier ( & mut self , bezier : Bezier , transform : DAffine2 ) {
789
+ pub fn outline_select_bezier ( & mut self , bezier : PathSeg , transform : DAffine2 ) {
792
790
self . start_dpi_aware_transform ( ) ;
793
791
794
792
self . render_context . begin_path ( ) ;
@@ -802,7 +800,7 @@ impl OverlayContext {
802
800
self . end_dpi_aware_transform ( ) ;
803
801
}
804
802
805
- pub fn outline_overlay_bezier ( & mut self , bezier : Bezier , transform : DAffine2 ) {
803
+ pub fn outline_overlay_bezier ( & mut self , bezier : PathSeg , transform : DAffine2 ) {
806
804
self . start_dpi_aware_transform ( ) ;
807
805
808
806
self . render_context . begin_path ( ) ;
@@ -816,18 +814,18 @@ impl OverlayContext {
816
814
self . end_dpi_aware_transform ( ) ;
817
815
}
818
816
819
- fn bezier_command ( & self , bezier : Bezier , transform : DAffine2 , move_to : bool ) {
817
+ fn bezier_command ( & self , bezier : PathSeg , transform : DAffine2 , move_to : bool ) {
820
818
self . start_dpi_aware_transform ( ) ;
821
819
822
- let Bezier { start , end , handles } = bezier . apply_transformation ( |point| transform. transform_point2 ( point ) ) ;
820
+ let bezier = Affine :: new ( transform. to_cols_array ( ) ) * bezier ;
823
821
if move_to {
824
- self . render_context . move_to ( start. x , start. y ) ;
822
+ self . render_context . move_to ( bezier . start ( ) . x , bezier . start ( ) . y ) ;
825
823
}
826
-
827
- match handles {
828
- bezier_rs :: BezierHandles :: Linear => self . render_context . line_to ( end . x , end . y ) ,
829
- bezier_rs :: BezierHandles :: Quadratic { handle } => self . render_context . quadratic_curve_to ( handle . x , handle . y , end . x , end . y ) ,
830
- bezier_rs :: BezierHandles :: Cubic { handle_start , handle_end } => self . render_context . bezier_curve_to ( handle_start . x , handle_start . y , handle_end . x , handle_end . y , end . x , end . y ) ,
824
+ match bezier . as_path_el ( ) {
825
+ kurbo :: PathEl :: LineTo ( point ) => self . render_context . line_to ( point . x , point . y ) ,
826
+ kurbo :: PathEl :: QuadTo ( point , point1 ) => self . render_context . quadratic_curve_to ( point . x , point . y , point1 . x , point1 . y ) ,
827
+ kurbo :: PathEl :: CurveTo ( point , point1 , point2 ) => self . render_context . bezier_curve_to ( point . x , point . y , point1 . x , point1 . y , point2 . x , point2 . y ) ,
828
+ _ => unreachable ! ( ) ,
831
829
}
832
830
833
831
self . end_dpi_aware_transform ( ) ;
@@ -841,36 +839,35 @@ impl OverlayContext {
841
839
let subpath = subpath. borrow ( ) ;
842
840
let mut curves = subpath. iter ( ) . peekable ( ) ;
843
841
844
- let Some ( first) = curves. peek ( ) else {
842
+ let Some ( & first) = curves. peek ( ) else {
845
843
continue ;
846
844
} ;
847
845
848
- self . render_context . move_to ( transform. transform_point2 ( first. start ( ) ) . x , transform. transform_point2 ( first. start ( ) ) . y ) ;
846
+ let start_point = transform. transform_point2 ( point_to_dvec2 ( first. start ( ) ) ) ;
847
+ self . render_context . move_to ( start_point. x , start_point. y ) ;
848
+
849
849
for curve in curves {
850
- match curve. handles {
851
- bezier_rs :: BezierHandles :: Linear => {
852
- let a = transform. transform_point2 ( curve . end ( ) ) ;
850
+ match curve {
851
+ PathSeg :: Line ( line ) => {
852
+ let a = transform. transform_point2 ( point_to_dvec2 ( line . p1 ) ) ;
853
853
let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
854
-
855
- self . render_context . line_to ( a. x , a. y )
854
+ self . render_context . line_to ( a. x , a. y ) ;
856
855
}
857
- bezier_rs :: BezierHandles :: Quadratic { handle } => {
858
- let a = transform. transform_point2 ( handle ) ;
859
- let b = transform. transform_point2 ( curve . end ( ) ) ;
856
+ PathSeg :: Quad ( quad_bez ) => {
857
+ let a = transform. transform_point2 ( point_to_dvec2 ( quad_bez . p1 ) ) ;
858
+ let b = transform. transform_point2 ( point_to_dvec2 ( quad_bez . p2 ) ) ;
860
859
let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
861
860
let b = b. round ( ) - DVec2 :: splat ( 0.5 ) ;
862
-
863
- self . render_context . quadratic_curve_to ( a. x , a. y , b. x , b. y )
861
+ self . render_context . quadratic_curve_to ( a. x , a. y , b. x , b. y ) ;
864
862
}
865
- bezier_rs :: BezierHandles :: Cubic { handle_start , handle_end } => {
866
- let a = transform. transform_point2 ( handle_start ) ;
867
- let b = transform. transform_point2 ( handle_end ) ;
868
- let c = transform. transform_point2 ( curve . end ( ) ) ;
863
+ PathSeg :: Cubic ( cubic_bez ) => {
864
+ let a = transform. transform_point2 ( point_to_dvec2 ( cubic_bez . p1 ) ) ;
865
+ let b = transform. transform_point2 ( point_to_dvec2 ( cubic_bez . p2 ) ) ;
866
+ let c = transform. transform_point2 ( point_to_dvec2 ( cubic_bez . p3 ) ) ;
869
867
let a = a. round ( ) - DVec2 :: splat ( 0.5 ) ;
870
868
let b = b. round ( ) - DVec2 :: splat ( 0.5 ) ;
871
869
let c = c. round ( ) - DVec2 :: splat ( 0.5 ) ;
872
-
873
- self . render_context . bezier_curve_to ( a. x , a. y , b. x , b. y , c. x , c. y )
870
+ self . render_context . bezier_curve_to ( a. x , a. y , b. x , b. y , c. x , c. y ) ;
874
871
}
875
872
}
876
873
}
@@ -885,7 +882,7 @@ impl OverlayContext {
885
882
886
883
/// Used by the Select tool to outline a path or a free point when selected or hovered.
887
884
pub fn outline ( & mut self , target_types : impl Iterator < Item = impl Borrow < ClickTargetType > > , transform : DAffine2 , color : Option < & str > ) {
888
- let mut subpaths: Vec < bezier_rs :: Subpath < PointId > > = vec ! [ ] ;
885
+ let mut subpaths: Vec < Subpath < PointId > > = vec ! [ ] ;
889
886
890
887
target_types. for_each ( |target_type| match target_type. borrow ( ) {
891
888
ClickTargetType :: FreePoint ( point) => {
0 commit comments