diff options
author | Jovansonlee Cesar <ivanceras@gmail.com> | 2022-09-26 15:53:59 +0800 |
---|---|---|
committer | Jovansonlee Cesar <ivanceras@gmail.com> | 2022-09-26 15:53:59 +0800 |
commit | f2be43e9d455a0638f9f3945cde8a1b90a99260e (patch) | |
tree | 2e4bfff947c143930dc9643b173c07172c56580a | |
parent | 39a55e7d24b493846d8c15d609426dc13f87a728 (diff) |
feat: use the old algorithmn for adding multiple fragments, remove buggy code for merging line and marker_line
-rw-r--r-- | packages/svgbob/src/buffer/cell_buffer/span.rs | 11 | ||||
-rw-r--r-- | packages/svgbob/src/buffer/fragment_buffer.rs | 23 | ||||
-rw-r--r-- | packages/svgbob/src/buffer/fragment_buffer/fragment.rs | 10 | ||||
-rw-r--r-- | packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs | 53 | ||||
-rw-r--r-- | packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs | 13 | ||||
-rw-r--r-- | packages/svgbob/test_data/simple.bob | 2 |
6 files changed, 32 insertions, 80 deletions
diff --git a/packages/svgbob/src/buffer/cell_buffer/span.rs b/packages/svgbob/src/buffer/cell_buffer/span.rs index 28246c7..42c5f25 100644 --- a/packages/svgbob/src/buffer/cell_buffer/span.rs +++ b/packages/svgbob/src/buffer/cell_buffer/span.rs @@ -190,14 +190,19 @@ impl Span { pub fn hit_cell(&self, needle: Cell) -> bool { self.iter().any(|(cell, ch)| *cell == needle) } + + /// merge as is without checking it it can + pub fn merge_no_check(&self, other: &Self) -> Self { + let mut cells = self.0.clone(); + cells.extend(&other.0); + Span(cells) + } } impl Merge for Span { fn merge(&self, other: &Self) -> Option<Self> { if self.can_merge(other) { - let mut cells = self.0.clone(); - cells.extend(&other.0); - Some(Span(cells)) + Some(self.merge_no_check(other)) } else { None } diff --git a/packages/svgbob/src/buffer/fragment_buffer.rs b/packages/svgbob/src/buffer/fragment_buffer.rs index 80a5339..7d13ea5 100644 --- a/packages/svgbob/src/buffer/fragment_buffer.rs +++ b/packages/svgbob/src/buffer/fragment_buffer.rs @@ -104,17 +104,16 @@ impl FragmentBuffer { (w, h) } + /// Note: Same fragment span can be stored in the same cell + /// as it simplifies the algorithm for mergin marker line (lines with dots, and arrows) + /// Since they will be attached to each other at the cell level fn add_fragment_span_to_cell( &mut self, cell: Cell, fragment_span: FragmentSpan, ) { if let Some(existing) = self.get_mut(&cell) { - if !existing.contains(&fragment_span) { - existing.push(fragment_span); - } else { - println!("already contain a same fragment_span"); - } + existing.push(fragment_span); } else { self.insert(cell, vec![fragment_span]); } @@ -139,9 +138,19 @@ impl FragmentBuffer { ch: char, fragments: Vec<Fragment>, ) { - for fragment in fragments { - self.add_fragment_to_cell(cell, ch, fragment); + let fragment_spans = fragments + .into_iter() + .map(|fragment| FragmentSpan { + span: Span::new(cell, ch), + fragment, + }) + .collect(); + if let Some(existing) = self.get_mut(&cell) { + existing.extend(fragment_spans); + } else { + self.insert(cell, fragment_spans); } + self.sort_fragments_in_cell(cell); } pub fn merge_fragment_spans(&self) -> Vec<FragmentSpan> { diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment.rs index 09659cf..c9a2e10 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment.rs @@ -422,15 +422,9 @@ impl Merge for Fragment { } // line and marker_line - (Fragment::Line(line), Fragment::MarkerLine(mline)) => { - //line.merge_marker_line(mline) - None - } + (Fragment::Line(line), Fragment::MarkerLine(mline)) => None, // marker_line and line - (Fragment::MarkerLine(mline), Fragment::Line(line)) => { - //line.merge_marker_line(mline) - None - } + (Fragment::MarkerLine(mline), Fragment::Line(line)) => None, (Fragment::MarkerLine(mline), Fragment::Polygon(polygon)) => { mline.merge_polygon(polygon) } diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs index 1405c07..db7ec6a 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs @@ -188,59 +188,6 @@ impl Line { } } - // TODO This is still very buggy - pub(crate) fn merge_marker_line( - &self, - mline: &MarkerLine, - ) -> Option<Fragment> { - if mline.start_marker.is_none() { - if self.end == mline.line.start { - Some(marker_line( - self.start, - mline.line.end, - mline.line.is_broken, - None, - mline.end_marker.clone(), - )) - } else if self.start == mline.line.start { - Some(marker_line( - self.end, - mline.line.end, - mline.line.is_broken, - None, - mline.end_marker.clone(), - )) - } else { - None - } - } else if mline.end_marker.is_none() { - if self.end == mline.line.end { - println!("success 3"); - Some(marker_line( - self.start, - mline.line.start, - mline.line.is_broken, - mline.start_marker.clone(), - None, - )) - } else if self.start == mline.line.end { - println!("success 4"); - Some(marker_line( - self.end, - mline.line.start, - mline.line.is_broken, - mline.start_marker.clone(), - None, - )) - } else { - None - } - } else { - println!("marker line should have at least one marker"); - None - } - } - pub(crate) fn is_touching_circle(&self, circle: &Circle) -> bool { let center = circle.center; let distance_end_center = self.end.distance(¢er); diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs index b7af273..c28fa75 100644 --- a/packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs +++ b/packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs @@ -69,14 +69,11 @@ impl FragmentSpan { impl Merge for FragmentSpan { fn merge(&self, other: &Self) -> Option<Self> { if let Some(new_merge) = self.fragment.merge(&other.fragment) { - if let Some(new_span) = self.span.merge(&other.span) { - Some(Self { - span: new_span, - fragment: new_merge, - }) - } else { - None - } + let new_span = self.span.merge_no_check(&other.span); + Some(Self { + span: new_span, + fragment: new_merge, + }) } else { None } diff --git a/packages/svgbob/test_data/simple.bob b/packages/svgbob/test_data/simple.bob index 256dd4a..a02215a 100644 --- a/packages/svgbob/test_data/simple.bob +++ b/packages/svgbob/test_data/simple.bob @@ -61,7 +61,7 @@ ! O : ! .-----------. . <. .> . ^ \ : ! ( ) ( ) ( ) \ \ : - ! '-----+ ,---' `> ' ` <' \ v : + ! `-----+ ,---' `> ' ` <' \ v : ! |/ * : ! ' _ __ : ! __ .-. .--. .--.--. .--. .' '. ,' '. : |