@@ -33,7 +33,7 @@ use graphene_core::raster::BlendMode;
33
33
use graphene_core:: raster:: image:: ImageFrameTable ;
34
34
use graphene_core:: vector:: style:: ViewMode ;
35
35
use graphene_std:: renderer:: { ClickTarget , Quad } ;
36
- use graphene_std:: vector:: { PointId , path_bool_lib } ;
36
+ use graphene_std:: vector:: { PointId , kurbo } ;
37
37
use std:: time:: Duration ;
38
38
39
39
pub struct DocumentMessageData < ' a > {
@@ -2847,7 +2847,7 @@ fn default_document_network_interface() -> NodeNetworkInterface {
2847
2847
enum XRayTarget {
2848
2848
Point ( DVec2 ) ,
2849
2849
Quad ( Quad ) ,
2850
- Path ( Vec < path_bool_lib :: PathSegment > ) ,
2850
+ Path ( kurbo :: BezPath ) ,
2851
2851
Polygon ( Subpath < PointId > ) ,
2852
2852
}
2853
2853
@@ -2865,20 +2865,38 @@ pub struct ClickXRayIter<'a> {
2865
2865
parent_targets : Vec < ( LayerNodeIdentifier , XRayTarget ) > ,
2866
2866
}
2867
2867
2868
- fn quad_to_path_lib_segments ( quad : Quad ) -> Vec < path_bool_lib:: PathSegment > {
2869
- quad. all_edges ( ) . into_iter ( ) . map ( |[ start, end] | path_bool_lib:: PathSegment :: Line ( start, end) ) . collect ( )
2868
+ fn quad_to_path_lib_segments ( quad : Quad ) -> kurbo:: BezPath {
2869
+ let kp = |dv : DVec2 | -> kurbo:: Point { ( dv. x , dv. y ) . into ( ) } ;
2870
+ let mut ret = kurbo:: BezPath :: new ( ) ;
2871
+ for [ start, end] in quad. all_edges ( ) . into_iter ( ) {
2872
+ if ret. is_empty ( ) {
2873
+ ret. move_to ( kp ( start) ) ;
2874
+ }
2875
+ ret. line_to ( kp ( end) ) ;
2876
+ }
2877
+ ret
2870
2878
}
2871
2879
2872
- fn click_targets_to_path_lib_segments < ' a > ( click_targets : impl Iterator < Item = & ' a ClickTarget > , transform : DAffine2 ) -> Vec < path_bool_lib:: PathSegment > {
2873
- let segment = |bezier : bezier_rs:: Bezier | match bezier. handles {
2874
- bezier_rs:: BezierHandles :: Linear => path_bool_lib:: PathSegment :: Line ( bezier. start , bezier. end ) ,
2875
- bezier_rs:: BezierHandles :: Quadratic { handle } => path_bool_lib:: PathSegment :: Quadratic ( bezier. start , handle, bezier. end ) ,
2876
- bezier_rs:: BezierHandles :: Cubic { handle_start, handle_end } => path_bool_lib:: PathSegment :: Cubic ( bezier. start , handle_start, handle_end, bezier. end ) ,
2880
+ fn click_targets_to_path_lib_segments < ' a > ( click_targets : impl Iterator < Item = & ' a ClickTarget > , transform : DAffine2 ) -> kurbo:: BezPath {
2881
+ let mut ret = kurbo:: BezPath :: new ( ) ;
2882
+ let mut add_segment = |bezier : bezier_rs:: Bezier | {
2883
+ let kp = |dv : DVec2 | -> kurbo:: Point { ( dv. x , dv. y ) . into ( ) } ;
2884
+ if ret. is_empty ( ) {
2885
+ ret. move_to ( kp ( bezier. start ) ) ;
2886
+ }
2887
+ match bezier. handles {
2888
+ bezier_rs:: BezierHandles :: Linear => ret. line_to ( kp ( bezier. end ) ) ,
2889
+ bezier_rs:: BezierHandles :: Quadratic { handle } => ret. quad_to ( kp ( handle) , kp ( bezier. end ) ) ,
2890
+ bezier_rs:: BezierHandles :: Cubic { handle_start, handle_end } => ret. curve_to ( kp ( handle_start) , kp ( handle_end) , kp ( bezier. end ) ) ,
2891
+ }
2877
2892
} ;
2878
- click_targets
2893
+ for seg in click_targets
2879
2894
. flat_map ( |target| target. subpath ( ) . iter ( ) )
2880
- . map ( |bezier| segment ( bezier. apply_transformation ( |x| transform. transform_point2 ( x) ) ) )
2881
- . collect ( )
2895
+ . map ( |bezier| bezier. apply_transformation ( |x| transform. transform_point2 ( x) ) )
2896
+ {
2897
+ add_segment ( seg) ;
2898
+ }
2899
+ ret
2882
2900
}
2883
2901
2884
2902
impl < ' a > ClickXRayIter < ' a > {
@@ -2899,15 +2917,15 @@ impl<'a> ClickXRayIter<'a> {
2899
2917
}
2900
2918
2901
2919
/// Handles the checking of the layer where the target is a rect or path
2902
- fn check_layer_area_target ( & mut self , click_targets : Option < & Vec < ClickTarget > > , clip : bool , layer : LayerNodeIdentifier , path : Vec < path_bool_lib :: PathSegment > , transform : DAffine2 ) -> XRayResult {
2920
+ fn check_layer_area_target ( & mut self , click_targets : Option < & Vec < ClickTarget > > , clip : bool , layer : LayerNodeIdentifier , path : kurbo :: BezPath , transform : DAffine2 ) -> XRayResult {
2903
2921
// Convert back to Bezier-rs types for intersections
2904
- let segment = |bezier : & path_bool_lib :: PathSegment | match * bezier {
2905
- path_bool_lib :: PathSegment :: Line ( start , end ) => bezier_rs :: Bezier :: from_linear_dvec2 ( start , end ) ,
2906
- path_bool_lib :: PathSegment :: Cubic ( start , h1 , h2 , end ) => bezier_rs:: Bezier :: from_cubic_dvec2 ( start , h1 , h2 , end ) ,
2907
- path_bool_lib :: PathSegment :: Quadratic ( start , h1 , end ) => bezier_rs:: Bezier :: from_quadratic_dvec2 ( start , h1 , end ) ,
2908
- path_bool_lib :: PathSegment :: Arc ( _ , _ , _ , _ , _ , _ , _ ) => unimplemented ! ( ) ,
2922
+ let dv = |p : kurbo :: Point | -> DVec2 { DVec2 :: new ( p . x , p . y ) } ;
2923
+ let segment = | bezier : kurbo :: PathSeg | match bezier {
2924
+ kurbo :: PathSeg :: Line ( line ) => bezier_rs:: Bezier :: from_linear_dvec2 ( dv ( line . p0 ) , dv ( line . p1 ) ) ,
2925
+ kurbo :: PathSeg :: Quad ( q ) => bezier_rs:: Bezier :: from_quadratic_dvec2 ( dv ( q . p0 ) , dv ( q . p1 ) , dv ( q . p2 ) ) ,
2926
+ kurbo :: PathSeg :: Cubic ( c ) => bezier_rs :: Bezier :: from_cubic_dvec2 ( dv ( c . p0 ) , dv ( c . p1 ) , dv ( c . p2 ) , dv ( c . p3 ) ) ,
2909
2927
} ;
2910
- let get_clip = || path. iter ( ) . map ( segment) ;
2928
+ let get_clip = || path. segments ( ) . map ( segment) ;
2911
2929
2912
2930
let intersects = click_targets. is_some_and ( |targets| targets. iter ( ) . any ( |target| target. intersect_path ( get_clip, transform) ) ) ;
2913
2931
let clicked = intersects;
@@ -2917,7 +2935,7 @@ impl<'a> ClickXRayIter<'a> {
2917
2935
// We do this on this using the target area to reduce computation (as the target area is usually very simple).
2918
2936
if clip && intersects {
2919
2937
let clip_path = click_targets_to_path_lib_segments ( click_targets. iter ( ) . flat_map ( |x| x. iter ( ) ) , transform) ;
2920
- let subtracted = graphene_std:: vector:: boolean_intersect ( path, clip_path) . into_iter ( ) . flatten ( ) . collect :: < Vec < _ > > ( ) ;
2938
+ let subtracted = graphene_std:: vector:: boolean_intersect ( path, clip_path) . into_iter ( ) . flatten ( ) . collect :: < kurbo :: BezPath > ( ) ;
2921
2939
if subtracted. is_empty ( ) {
2922
2940
use_children = false ;
2923
2941
} else {
@@ -2953,8 +2971,15 @@ impl<'a> ClickXRayIter<'a> {
2953
2971
XRayTarget :: Quad ( quad) => self . check_layer_area_target ( click_targets, clip, layer, quad_to_path_lib_segments ( * quad) , transform) ,
2954
2972
XRayTarget :: Path ( path) => self . check_layer_area_target ( click_targets, clip, layer, path. clone ( ) , transform) ,
2955
2973
XRayTarget :: Polygon ( polygon) => {
2956
- let polygon = polygon. iter_closed ( ) . map ( |line| path_bool_lib:: PathSegment :: Line ( line. start , line. end ) ) . collect ( ) ;
2957
- self . check_layer_area_target ( click_targets, clip, layer, polygon, transform)
2974
+ let mut path = kurbo:: BezPath :: new ( ) ;
2975
+ let kp = |dv : DVec2 | -> kurbo:: Point { ( dv. x , dv. y ) . into ( ) } ;
2976
+ for line in polygon. iter_closed ( ) {
2977
+ if path. is_empty ( ) {
2978
+ path. move_to ( kp ( line. start ) ) ;
2979
+ }
2980
+ path. line_to ( kp ( line. end ) ) ;
2981
+ }
2982
+ self . check_layer_area_target ( click_targets, clip, layer, path, transform)
2958
2983
}
2959
2984
}
2960
2985
}
0 commit comments