summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJovansonlee Cesar <ivanceras@gmail.com>2022-09-26 08:24:41 +0800
committerJovansonlee Cesar <ivanceras@gmail.com>2022-09-26 08:24:41 +0800
commitb9c97b14822ff58206555a330c57af1935166c57 (patch)
tree9a7ea82980b16078fe921931967dd20d35aa68e3
parent3e01f38b506fafcd7ca7658dc77cb377c25578d0 (diff)
refactor: use index_map for the Circle span to preserve the order of the circles being inserted
-rw-r--r--Cargo.lock17
-rw-r--r--packages/svgbob/Cargo.toml1
-rw-r--r--packages/svgbob/examples/circles_generated.rs12
-rwxr-xr-xpackages/svgbob/run_circles_generated.sh1
-rw-r--r--packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs7
-rw-r--r--packages/svgbob/src/map/circle_map.rs3
-rw-r--r--packages/svgbob/src/map/circle_map/test_circle_map.rs39
-rw-r--r--packages/svgbob/test_data/circles.bob626
-rw-r--r--packages/svgbob/test_data/circles_generated.bob1546
9 files changed, 2236 insertions, 16 deletions
diff --git a/Cargo.lock b/Cargo.lock
index d56972d..3969601 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -234,6 +234,12 @@ dependencies = [
]
[[package]]
+name = "hashbrown"
+version = "0.12.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
+
+[[package]]
name = "hermit-abi"
version = "0.1.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -306,6 +312,16 @@ dependencies = [
]
[[package]]
+name = "indexmap"
+version = "1.9.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
+dependencies = [
+ "autocfg",
+ "hashbrown",
+]
+
+[[package]]
name = "itertools"
version = "0.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -892,6 +908,7 @@ checksum = "8ea5119cdb4c55b55d432abb513a0429384878c15dde60cc77b1c99de1a95a6a"
name = "svgbob"
version = "0.6.7"
dependencies = [
+ "indexmap",
"itertools",
"lazy_static",
"log",
diff --git a/packages/svgbob/Cargo.toml b/packages/svgbob/Cargo.toml
index 97d799d..b86c81d 100644
--- a/packages/svgbob/Cargo.toml
+++ b/packages/svgbob/Cargo.toml
@@ -19,6 +19,7 @@ unicode-width = "0.1.9"
itertools = "0.10.3"
pom = { version = "3.2.0" }
log = "0.4.14"
+indexmap = "1.9.1"
diff --git a/packages/svgbob/examples/circles_generated.rs b/packages/svgbob/examples/circles_generated.rs
new file mode 100644
index 0000000..ea0a08a
--- /dev/null
+++ b/packages/svgbob/examples/circles_generated.rs
@@ -0,0 +1,12 @@
+use std::{fs, io, time::Instant};
+
+extern crate svgbob;
+
+fn main() -> io::Result<()> {
+ let art = include_str!("../test_data/circles_generated.bob");
+ let t1 = Instant::now();
+ fs::create_dir_all("out")?;
+ fs::write("out/circles_generated.svg", svgbob::to_svg(art))?;
+ println!("took {}ms", t1.elapsed().as_millis());
+ Ok(())
+}
diff --git a/packages/svgbob/run_circles_generated.sh b/packages/svgbob/run_circles_generated.sh
new file mode 100755
index 0000000..0258a50
--- /dev/null
+++ b/packages/svgbob/run_circles_generated.sh
@@ -0,0 +1 @@
+reset && RUST_BACKTRACE=1 cargo run --release --example circles_generated
diff --git a/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs b/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs
index 1cf22f9..1388a2b 100644
--- a/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs
+++ b/packages/svgbob/src/buffer/fragment_buffer/fragment/circle.rs
@@ -2,6 +2,7 @@ use crate::{fragment::Bounds, util, Cell, Point};
use nalgebra::Point2;
use parry2d::shape::ConvexPolygon;
use parry2d::shape::Polyline;
+use std::hash::{Hash, Hasher};
use std::{cmp::Ordering, fmt};
use sauron::{
@@ -17,6 +18,12 @@ pub struct Circle {
pub is_filled: bool,
}
+impl Hash for Circle {
+ fn hash<H: Hasher>(&self, state: &mut H) {
+ ((self.radius * 2.0) as i32).hash(state);
+ }
+}
+
impl Circle {
pub(crate) fn new(center: Point, radius: f32, is_filled: bool) -> Self {
Circle {
diff --git a/packages/svgbob/src/map/circle_map.rs b/packages/svgbob/src/map/circle_map.rs
index 3b90b1b..8db994e 100644
--- a/packages/svgbob/src/map/circle_map.rs
+++ b/packages/svgbob/src/map/circle_map.rs
@@ -5,6 +5,7 @@ use crate::{
fragment::Circle,
Cell, Point, Settings,
};
+use indexmap::IndexMap;
use lazy_static::lazy_static;
use std::{collections::BTreeMap, collections::HashMap, iter::FromIterator};
@@ -558,7 +559,7 @@ lazy_static! {
);
/// There is only 1 span per circle, and localized
- pub static ref CIRCLES_SPAN: BTreeMap<Circle, Span> = BTreeMap::from_iter(
+ pub static ref CIRCLES_SPAN: IndexMap<Circle, Span> = IndexMap::from_iter(
CIRCLE_MAP.iter().map(|circle_art|{
let cb = CellBuffer::from(circle_art.ascii_art);
let mut spans:Vec<Span> = cb.into();
diff --git a/packages/svgbob/src/map/circle_map/test_circle_map.rs b/packages/svgbob/src/map/circle_map/test_circle_map.rs
index 2b76005..b0a6863 100644
--- a/packages/svgbob/src/map/circle_map/test_circle_map.rs
+++ b/packages/svgbob/src/map/circle_map/test_circle_map.rs
@@ -1,6 +1,35 @@
use super::*;
#[test]
+fn show_circles() {
+ println!("CIRCLES ");
+ for (circle, span) in CIRCLES_SPAN.iter() {
+ println!("diameter: {}", circle.radius * 2.0);
+ println!();
+ println!("{}", span);
+ println!();
+ println!();
+ }
+ println!("QUARTER ARCS:");
+ for (diameter, (arc, span)) in FLATTENED_QUARTER_ARC_SPAN.iter() {
+ println!("diameter: {}", diameter.diameter);
+ println!();
+ println!("{}", span);
+ println!();
+ println!();
+ }
+ println!("HALF ARCS:");
+ for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() {
+ println!("diameter: {}", diameter.diameter);
+ println!();
+ println!("{}", span);
+ println!();
+ println!();
+ }
+ panic!();
+}
+
+#[test]
fn test_circle1() {
let art = r#"
_.-'''''''-._
@@ -27,11 +56,6 @@ fn test_circle1() {
#[test]
fn test_half_arc_span5_top() {
- for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() {
- println!("diameter: {}", diameter.diameter);
- println!("{}", span);
- println!();
- }
let art = r#"
___
,' `.
@@ -53,11 +77,6 @@ fn test_half_arc_span5_bottom() {
`.___.'
"#;
- for (diameter, (arc, span)) in FLATTENED_HALF_ARC_SPAN.iter() {
- println!("diameter: {}", diameter.diameter);
- println!("{}", span);
- println!();
- }
let cell_buffer = CellBuffer::from(art);
let mut spans: Vec<Span> = cell_buffer.into();
assert_eq!(spans.len(), 1);
diff --git a/packages/svgbob/test_data/circles.bob b/packages/svgbob/test_data/circles.bob
index 5915b50..4ae979f 100644
--- a/packages/svgbob/test_data/circles.bob
+++ b/packages/svgbob/test_data/circles.bob
@@ -820,23 +820,625 @@
'-.... ....-'
+diameter: 4
+
+-.
+ )
+
+
+diameter: 4
+
+ ,-
+(
+
+
+diameter: 4
+
+(
+ `-
+
+
+diameter: 4
+
+ )
+-'
+
+
+diameter: 5
+
+-.
+ )
+
+
+diameter: 5
+
+ .-
+(
+
+
+diameter: 5
+
+(
+ `-
+
+
+diameter: 5
+
+ )
+-'
+
+
+diameter: 6
+
+_
+ '.
+ )
+
+
+diameter: 6
+
+ _
+ .'
+(
+
+
+diameter: 6
+
+(
+ `._
+
+
+diameter: 6
+
+ )
+_.'
+
+
+diameter: 7
+
+_
+ '.
+ )
+
+
+diameter: 7
+
+ _
+ ,'
+(
+
+
+diameter: 7
+
+(
+ `._
+
+
+diameter: 7
+
+ )
+_.'
+
+
+diameter: 8
+
+__
+ '.
+ )
+
+
+diameter: 8
+
+ __
+ ,'
+(
+
+
+diameter: 8
+
+(
+ `.
+ `-
+
+
+diameter: 8
+
+ )
+ .'
+-'
+
+
+diameter: 9
+
+__
+ `.
+ \
+
+
+diameter: 9
+
+ __
+ ,'
+/
+
+
+diameter: 9
+
+\
+ `.__
+
+
+diameter: 9
+
+ /
+__.'
+
+
+diameter: 10
+
+__
+ `.
+ \
+
+
+diameter: 10
+
+ __
+ ,'
+/
+
+
+diameter: 10
+
+\
+ `.__
+
+
+diameter: 10
+
+ /
+__.'
+
+
+diameter: 11
+
+__
+ `.
+ \
+ )
+
+
+diameter: 11
+
+ __
+ .'
+ /
+(
+
+
+diameter: 11
+
+(
+ \
+ `.__
+
+
+diameter: 11
+
+ )
+ /
+__.'
+
+
+diameter: 12
+
+___
+ `.
+ \
+ )
+
+
+diameter: 12
+
+ ___
+ ,'
+ /
+(
+
+
+diameter: 12
+
+(
+ \
+ `.___
+
+
+diameter: 12
+
+ )
+ /
+___.'
+
+
+diameter: 13
+
+___
+ `.
+ \
+ |
+
+
+diameter: 13
+
+ ___
+ ,'
+ /
+|
+
+
+diameter: 13
+
+|
+ \
+ `.___
+
+
+diameter: 13
+
+ |
+ /
+___.'
+
+
+diameter: 14
+
+____
+ `.
+ \
+ |
+
+
+diameter: 14
+
+ ____
+ ,'
+ /
+|
+
+
+diameter: 14
+
+|
+ \
+ `.____
+
+
+diameter: 14
+
+ |
+ /
+____.'
+
+
+diameter: 15
+
+____
+ `.
+ \
+ |
+ |
+
+
+diameter: 15
+
+ ____
+ ,'
+ /
+|
+|
+
+
+diameter: 15
+
+|
+|
+ \
+ `.____
+
+
+diameter: 15
+
+ |
+ |
+ /
+____.'
+
+
+diameter: 16
+
+---__
+ `.
+ \
+ |
+ |
+
+
+diameter: 16
+
+ __---
+ ,'
+ /
+|
+|
+
+
+diameter: 16
+
+|
+|
+ \
+ `.
+ `----
+
+
+diameter: 16
+
+ |
+ |
+ /
+ .'
+----'
+
+
+diameter: 17
+
+----.
+ `.
+ \
+ |
+ |
+
+
+diameter: 17
+
+ .----
+ ,'
+ /
+|
+|
+
+
+diameter: 17
+
+|
+|
+ \
+ `.
+ `----
+
+
+diameter: 17
+
+ |
+ |
+ /
+ .'
+----'
+
+
+diameter: 18
+
+'''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 18
+
+ _.-'''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 18
+
+|
+|
+ \
+ `._
+ '-...
+
+
+diameter: 18
+
+ |
+ |
+ /
+ _.'
+...-'
+
+
+diameter: 19
+
+'''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 19
+
+ _.-'''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 19
+
+|
+|
+ \
+ `._
+ '-...
+
+
+diameter: 19
+
+ |
+ |
+ /
+ _.'
+...-'
+
+
+diameter: 20
+
+''''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 20
+
+ _.-''''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 20
+
+|
+|
+ \
+ `._
+ '-....
+
+
+diameter: 20
+
+ |
+ |
+ /
+ _.'
+....-'
+
+
+diameter: 21
+
+''''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 21
+
+ _.-''''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 21
+
+|
+|
+|
+ \
+ `._
+ '-....
+
+
+diameter: 21
+
+ |
+ |
+ |
+ /
+ _.'
+....-'
+
+
+diameter: 22
+
+'''''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 22
+
+ _.-'''''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 22
+
+|
+|
+|
+ \
+ `._
+ '-.....
+
+
+diameter: 22
+
+ |
+ |
+ |
+ /
+ _.'
+.....-'
+
diameter: 4
,-.
( )
+
diameter: 4
( )
`-'
+
diameter: 4
,-
(
`-
+
diameter: 4
-.
@@ -950,6 +1552,7 @@ diameter: 8
`.
`-
+
diameter: 8
__
@@ -968,7 +1571,6 @@ diameter: 9
diameter: 9
-
\ /
`.___.'
@@ -1000,7 +1602,6 @@ diameter: 10
diameter: 10
-
\ /
`.____.'
@@ -1057,6 +1658,7 @@ __
/
__.'
+
diameter: 12
_____
@@ -1099,10 +1701,10 @@ diameter: 13
/ \
| |
+
diameter: 13
| |
-| |
\ /
`.______.'
@@ -1140,7 +1742,6 @@ diameter: 14
diameter: 14
| |
-| |
\ /
`._______.'
@@ -1216,6 +1817,7 @@ diameter: 16
| |
| |
+
diameter: 16
| |
@@ -1224,6 +1826,7 @@ diameter: 16
`. .'
`-------'
+
diameter: 16
__---
@@ -1236,6 +1839,7 @@ diameter: 16
`.
`----
+
diameter: 16
---__
@@ -1248,6 +1852,7 @@ diameter: 16
.'
----'
+
diameter: 17
.--------.
@@ -1256,6 +1861,7 @@ diameter: 17
| |
| |
+
diameter: 17
| |
@@ -1264,6 +1870,7 @@ diameter: 17
`. .'
`--------'
+
diameter: 17
.----
@@ -1276,6 +1883,7 @@ diameter: 17
`.
`----
+
diameter: 17
----.
@@ -1288,6 +1896,7 @@ diameter: 17
.'
----'
+
diameter: 18
_.-'''''-._
@@ -1297,6 +1906,7 @@ diameter: 18
| |
| |
+
diameter: 18
| |
@@ -1333,6 +1943,7 @@ diameter: 18
_.'
...-'
+
diameter: 19
_.-''''''-._
@@ -1392,7 +2003,6 @@ diameter: 20
diameter: 20
-
| |
| |
\ /
@@ -1437,6 +2047,7 @@ diameter: 21
| |
| |
+
diameter: 21
| |
@@ -1446,6 +2057,7 @@ diameter: 21
`._ _.'
'-........-'
+
diameter: 21
_.-''''
@@ -1475,6 +2087,7 @@ diameter: 21
_.'
....-'
+
diameter: 22
_.-'''''''''-._
@@ -1484,6 +2097,7 @@ diameter: 22
| |
| |
+
diameter: 22
| |
@@ -1521,3 +2135,5 @@ diameter: 22
|
/
_.'
+.....-'
+
diff --git a/packages/svgbob/test_data/circles_generated.bob b/packages/svgbob/test_data/circles_generated.bob
new file mode 100644
index 0000000..6a2b3db
--- /dev/null
+++ b/packages/svgbob/test_data/circles_generated.bob
@@ -0,0 +1,1546 @@
+
+CIRCLES
+diameter: 1
+
+()
+
+
+diameter: 2
+
+(_)
+
+
+diameter: 3
+
+ __
+(__)
+
+
+diameter: 4
+
+ ,-.
+( )
+ `-'
+
+
+diameter: 5
+
+ .--.
+( )
+ `--'
+
+
+diameter: 6
+
+ _
+ .' '.
+( )
+ `._.'
+
+
+diameter: 7
+
+ __
+ ,' '.
+( )
+ `.__.'
+
+
+diameter: 8
+
+ ___
+ ,' '.
+( )
+ `. .'
+ `-'
+
+
+diameter: 9
+
+ ___
+ ,' `.
+/ \
+\ /
+ `.___.'
+
+
+diameter: 10
+
+ ____
+ ,' `.
+/ \
+\ /
+ `.____.'
+
+
+diameter: 11
+
+ ____
+ .' `.
+ / \
+( )
+ \ /
+ `.____.'
+
+
+diameter: 12
+
+ _____
+ ,' `.
+ / \
+( )
+ \ /
+ `._____.'
+
+
+diameter: 13
+
+ ______
+ ,' `.
+ / \
+| |
+| |
+ \ /
+ `.______.'
+
+
+diameter: 14
+
+ _______
+ ,' `.
+ / \
+| |
+| |
+ \ /
+ `._______.'
+
+
+diameter: 15
+
+ ________
+ ,' `.
+ / \
+| |
+| |
+| |
+ \ /
+ `.________.'
+
+
+diameter: 16
+
+ __-----__
+ ,' `.
+ / \
+| |
+| |
+| |
+ \ /
+ `. .'
+ `-------'
+
+
+diameter: 17
+
+ .--------.
+ ,' `.
+ / \
+| |
+| |
+| |
+ \ /
+ `. .'
+ `--------'
+
+
+diameter: 18
+
+ _.-'''''-._
+ ,' `.
+ / \
+. .
+| |
+| |
+| |
+ \ /
+ `._ _.'
+ '-.....-'
+
+
+diameter: 19
+
+ _.-''''''-._
+ ,' `.
+ / \
+. .
+| |
+| |
+| |
+ \ /
+ `._ _.'
+ '-......-'
+
+
+diameter: 20
+
+ _.-'''''''-._
+ ,' `.
+ / \
+. .
+| |
+| |
+| |
+ \ /
+ `._ _.'
+ '-.......-'
+
+
+diameter: 21
+
+ _.-''''''''-._
+ ,' `.
+ / \
+. .
+| |
+| |
+| |
+| |
+ \ /
+ `._ _.'
+ '-........-'
+
+
+diameter: 22
+
+ _.-'''''''''-._
+ ,' `.
+ / \
+. .
+| |
+| |
+| |
+| |
+ \ /
+ `._ _.'
+ '-.........-'
+
+
+QUARTER ARCS:
+diameter: 4
+
+-.
+ )
+
+
+diameter: 4
+
+ ,-
+(
+
+
+diameter: 4
+
+(
+ `-
+
+
+diameter: 4
+
+ )
+-'
+
+
+diameter: 5
+
+-.
+ )
+
+
+diameter: 5
+
+ .-
+(
+
+
+diameter: 5
+
+(
+ `-
+
+
+diameter: 5
+
+ )
+-'
+
+
+diameter: 6
+
+_
+ '.
+ )
+
+
+diameter: 6
+
+ _
+ .'
+(
+
+
+diameter: 6
+
+(
+ `._
+
+
+diameter: 6
+
+ )
+_.'
+
+
+diameter: 7
+
+_
+ '.
+ )
+
+
+diameter: 7
+
+ _
+ ,'
+(
+
+
+diameter: 7
+
+(
+ `._
+
+
+diameter: 7
+
+ )
+_.'
+
+
+diameter: 8
+
+__
+ '.
+ )
+
+
+diameter: 8
+
+ __
+ ,'
+(
+
+
+diameter: 8
+
+(
+ `.
+ `-
+
+
+diameter: 8
+
+ )
+ .'
+-'
+
+
+diameter: 9
+
+__
+ `.
+ \
+
+
+diameter: 9
+
+ __
+ ,'
+/
+
+
+diameter: 9
+
+\
+ `.__
+
+
+diameter: 9
+
+ /
+__.'
+
+
+diameter: 10
+
+__
+ `.
+ \
+
+
+diameter: 10
+
+ __
+ ,'
+/
+
+
+diameter: 10
+
+\
+ `.__
+
+
+diameter: 10
+
+ /
+__.'
+
+
+diameter: 11
+
+__
+ `.
+ \
+ )
+
+
+diameter: 11
+
+ __
+ .'
+ /
+(
+
+
+diameter: 11
+
+(
+ \
+ `.__
+
+
+diameter: 11
+
+ )
+ /
+__.'
+
+
+diameter: 12
+
+___
+ `.
+ \
+ )
+
+
+diameter: 12
+
+ ___
+ ,'
+ /
+(
+
+
+diameter: 12
+
+(
+ \
+ `.___
+
+
+diameter: 12
+
+ )
+ /
+___.'
+
+
+diameter: 13
+
+___
+ `.
+ \
+ |
+
+
+diameter: 13
+
+ ___
+ ,'
+ /
+|
+
+
+diameter: 13
+
+|
+ \
+ `.___
+
+
+diameter: 13
+
+ |
+ /
+___.'
+
+
+diameter: 14
+
+____
+ `.
+ \
+ |
+
+
+diameter: 14
+
+ ____
+ ,'
+ /
+|
+
+
+diameter: 14
+
+|
+ \
+ `.____
+
+
+diameter: 14
+
+ |
+ /
+____.'
+
+
+diameter: 15
+
+____
+ `.
+ \
+ |
+ |
+
+
+diameter: 15
+
+ ____
+ ,'
+ /
+|
+|
+
+
+diameter: 15
+
+|
+|
+ \
+ `.____
+
+
+diameter: 15
+
+ |
+ |
+ /
+____.'
+
+
+diameter: 16
+
+---__
+ `.
+ \
+ |
+ |
+
+
+diameter: 16
+
+ __---
+ ,'
+ /
+|
+|
+
+
+diameter: 16
+
+|
+|
+ \
+ `.
+ `----
+
+
+diameter: 16
+
+ |
+ |
+ /
+ .'
+----'
+
+
+diameter: 17
+
+----.
+ `.
+ \
+ |
+ |
+
+
+diameter: 17
+
+ .----
+ ,'
+ /
+|
+|
+
+
+diameter: 17
+
+|
+|
+ \
+ `.
+ `----
+
+
+diameter: 17
+
+ |
+ |
+ /
+ .'
+----'
+
+
+diameter: 18
+
+'''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 18
+
+ _.-'''
+ ,'
+ /
+.
+|
+|
+
+
+diameter: 18
+
+|
+|
+ \
+ `._
+ '-...
+
+
+diameter: 18
+
+ |
+ |
+ /
+ _.'
+...-'
+
+
+diameter: 19
+
+'''-._
+ `.
+ \
+ .
+ |
+ |
+
+
+diameter: 19
+
+ _.-'''