@@ -9,12 +9,12 @@ use crate::segm::segment::{Segment, SegmentFill};
99
1010impl GraphBuilder < ShapeCountOffset , OverlayNode > {
1111 #[ inline]
12- pub ( crate ) fn build_offset (
12+ pub ( crate ) fn build_offset < F : FillStrategy < ShapeCountOffset > > (
1313 & mut self ,
1414 solver : & Solver ,
1515 segments : & [ Segment < ShapeCountOffset > ] ,
1616 ) -> OffsetGraph < ' _ > {
17- self . build_fills_with_strategy :: < SubjectOffsetStrategy > ( solver, segments) ;
17+ self . build_fills_with_strategy :: < F > ( solver, segments) ;
1818 self . build_links_all ( segments) ;
1919 self . offset_graph ( solver)
2020 }
@@ -29,10 +29,11 @@ impl GraphBuilder<ShapeCountOffset, OverlayNode> {
2929 }
3030}
3131
32- struct SubjectOffsetStrategy ;
32+ pub ( crate ) struct PositiveSubjectOffsetStrategy ;
33+ pub ( crate ) struct NegativeSubjectOffsetStrategy ;
3334const BOLD_BIT : usize = 2 ;
3435
35- impl FillStrategy < ShapeCountOffset > for SubjectOffsetStrategy {
36+ impl FillStrategy < ShapeCountOffset > for PositiveSubjectOffsetStrategy {
3637 #[ inline( always) ]
3738 fn add_and_fill ( this : ShapeCountOffset , bot : ShapeCountOffset ) -> ( ShapeCountOffset , SegmentFill ) {
3839 let top_subj = bot. subj + this. subj ;
@@ -53,6 +54,27 @@ impl FillStrategy<ShapeCountOffset> for SubjectOffsetStrategy {
5354 }
5455}
5556
57+ impl FillStrategy < ShapeCountOffset > for NegativeSubjectOffsetStrategy {
58+ #[ inline( always) ]
59+ fn add_and_fill ( this : ShapeCountOffset , bot : ShapeCountOffset ) -> ( ShapeCountOffset , SegmentFill ) {
60+ let top_subj = bot. subj + this. subj ;
61+ let bot_subj = bot. subj ;
62+
63+ let subj_top = ( top_subj < 0 ) as SegmentFill ;
64+ let subj_bot = ( bot_subj < 0 ) as SegmentFill ;
65+
66+ let bold = this. bold as SegmentFill ;
67+
68+ let fill = subj_top | ( subj_bot << 1 ) | ( bold << BOLD_BIT ) ;
69+ let top = ShapeCountOffset {
70+ subj : top_subj,
71+ bold : false ,
72+ } ; // bold not need
73+
74+ ( top, fill)
75+ }
76+ }
77+
5678impl OverlayLink {
5779 #[ inline( always) ]
5880 pub ( crate ) fn is_bold ( & self ) -> bool {
0 commit comments