summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJovansonlee Cesar <ivanceras@gmail.com>2022-09-26 15:53:59 +0800
committerJovansonlee Cesar <ivanceras@gmail.com>2022-09-26 15:53:59 +0800
commitf2be43e9d455a0638f9f3945cde8a1b90a99260e (patch)
tree2e4bfff947c143930dc9643b173c07172c56580a
parent39a55e7d24b493846d8c15d609426dc13f87a728 (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.rs11
-rw-r--r--packages/svgbob/src/buffer/fragment_buffer.rs23
-rw-r--r--packages/svgbob/src/buffer/fragment_buffer/fragment.rs10
-rw-r--r--packages/svgbob/src/buffer/fragment_buffer/fragment/line.rs53
-rw-r--r--packages/svgbob/src/buffer/fragment_buffer/fragment_span.rs13
-rw-r--r--packages/svgbob/test_data/simple.bob2
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(&center);
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 :
! |/ * :
! ' _ __ :
! __ .-. .--. .--.--. .--. .' '. ,' '. :