small changes
bendn 5 months ago
parent 41eadee · commit b3e1794
-rw-r--r--Cargo.lock114
-rw-r--r--Cargo.toml1
-rw-r--r--src/lib.rs119
3 files changed, 146 insertions, 88 deletions
diff --git a/Cargo.lock b/Cargo.lock
index 0ac327a..6a3b17b 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -35,7 +35,7 @@ checksum = "6a2b07991a9d33bc900bdc04191b44d888d55270986b82dd81325368a40bb23f"
[[package]]
name = "atools"
version = "0.1.7"
-source = "git+https://github.com/bend-n/atools#9903f658a8f89098f059b2f50df7eebc353c61a7"
+source = "git+https://github.com/bend-n/atools#761337c6f193a15deff946cf4296429d46a9f2e2"
[[package]]
name = "autocfg"
@@ -94,9 +94,9 @@ dependencies = [
[[package]]
name = "cc"
-version = "1.2.38"
+version = "1.2.39"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "80f41ae168f955c12fb8960b057d70d0ca153fb83182b57d86380443527be7e9"
+checksum = "e1354349954c6fc9cb0deab020f27f783cf0b604e8bb754dc4658ecf0d29c35f"
dependencies = [
"find-msvc-tools",
"shlex",
@@ -152,6 +152,7 @@ dependencies = [
"atools 0.1.7 (git+https://github.com/bend-n/atools)",
"fimg",
"implicit-fn",
+ "itertools",
"lower",
"lru-cache",
"swash",
@@ -160,6 +161,12 @@ dependencies = [
]
[[package]]
+name = "either"
+version = "1.15.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719"
+
+[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -192,8 +199,8 @@ checksum = "6a02dba6a60cd31533cf16561ced53239686d18f1464bff49579dd320fcea081"
[[package]]
name = "fimg"
-version = "0.4.48"
-source = "git+https://github.com/bend-n/fimg#86389b333ad51fe636afc9a2ca0f5829b4f8b962"
+version = "0.4.49"
+source = "git+https://github.com/bend-n/fimg#fa662eabb53793091fa9833ff4b8f61100135305"
dependencies = [
"array_chunks",
"atools 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -231,9 +238,9 @@ dependencies = [
[[package]]
name = "font-types"
-version = "0.9.0"
+version = "0.10.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7"
+checksum = "511e2c18a516c666d27867d2f9821f76e7d591f762e9fc41dd6cc5c90fe54b0b"
dependencies = [
"bytemuck",
]
@@ -360,9 +367,9 @@ dependencies = [
[[package]]
name = "hinted"
-version = "0.0.2"
+version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c488b6122f67ca2749a801d562c8c952e1778c42910c43ef537a6f5a46b524f2"
+checksum = "fad79747186550b8c2ea31ec84fd8c4cdcdf9eb99ebced0f47d7d78ad3ab614b"
[[package]]
name = "implicit-fn"
@@ -388,10 +395,19 @@ dependencies = [
]
[[package]]
+name = "itertools"
+version = "0.14.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285"
+dependencies = [
+ "either",
+]
+
+[[package]]
name = "js-sys"
-version = "0.3.80"
+version = "0.3.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "852f13bec5eba4ba9afbeb93fd7c13fe56147f055939ae21c43a29a0ecb2702e"
+checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305"
dependencies = [
"once_cell",
"wasm-bindgen",
@@ -405,9 +421,9 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]]
name = "libc"
-version = "0.2.175"
+version = "0.2.176"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543"
+checksum = "58f929b4d672ea937a23a1ab494143d968337a5f47e56d0815df1e0890ddf174"
[[package]]
name = "libloading"
@@ -459,9 +475,9 @@ dependencies = [
[[package]]
name = "lower-macros"
-version = "0.2.8"
+version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c1fe6a5008813f4afca3ab15d0485fc3ea47d572e7128e325a22057cb863b11"
+checksum = "c7a7e2ceb9f44e1db6f2fe5f91ae5c0c0e25b66272d757fad0a9929525e7e3f0"
dependencies = [
"proc-macro2",
"quote",
@@ -485,9 +501,9 @@ checksum = "5f63dc7ec862e5d146c89d104d437548fef5216a6a653f4afc4b87c581970677"
[[package]]
name = "memchr"
-version = "2.7.5"
+version = "2.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0"
+checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273"
[[package]]
name = "memoffset"
@@ -606,9 +622,9 @@ dependencies = [
[[package]]
name = "quote"
-version = "1.0.40"
+version = "1.0.41"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d"
+checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1"
dependencies = [
"proc-macro2",
]
@@ -639,9 +655,9 @@ dependencies = [
[[package]]
name = "read-fonts"
-version = "0.29.3"
+version = "0.35.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "04ca636dac446b5664bd16c069c00a9621806895b8bb02c2dc68542b23b8f25d"
+checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358"
dependencies = [
"bytemuck",
"font-types",
@@ -700,9 +716,9 @@ dependencies = [
[[package]]
name = "serde"
-version = "1.0.226"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0dca6411025b24b60bfa7ec1fe1f8e710ac09782dca409ee8237ba74b51295fd"
+checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e"
dependencies = [
"serde_core",
"serde_derive",
@@ -710,18 +726,18 @@ dependencies = [
[[package]]
name = "serde_core"
-version = "1.0.226"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ba2ba63999edb9dac981fb34b3e5c0d111a69b0924e253ed29d83f7c99e966a4"
+checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.226"
+version = "1.0.228"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8db53ae22f34573731bafa1db20f04027b2d25e02d8205921b569171699cdb33"
+checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
dependencies = [
"proc-macro2",
"quote",
@@ -742,9 +758,9 @@ checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
[[package]]
name = "skrifa"
-version = "0.31.3"
+version = "0.37.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dbeb4ca4399663735553a09dd17ce7e49a0a0203f03b706b39628c4d913a8607"
+checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841"
dependencies = [
"bytemuck",
"read-fonts",
@@ -764,9 +780,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03"
[[package]]
name = "swash"
-version = "0.2.5"
+version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "f745de914febc7c9ab4388dfaf94bbc87e69f57bb41133a9b0c84d4be49856f3"
+checksum = "47846491253e976bdd07d0f9cc24b7daf24720d11309302ccbbc6e6b6e53550a"
dependencies = [
"skrifa",
"yazi",
@@ -792,9 +808,9 @@ dependencies = [
[[package]]
name = "tempfile"
-version = "3.22.0"
+version = "3.23.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84fa4d11fadde498443cca10fd3ac23c951f0dc59e080e9f4b93d4df4e4eea53"
+checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16"
dependencies = [
"fastrand",
"getrandom",
@@ -862,9 +878,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen"
-version = "0.2.103"
+version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ab10a69fbd0a177f5f649ad4d8d3305499c42bab9aef2f7ff592d0ec8f833819"
+checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d"
dependencies = [
"cfg-if",
"once_cell",
@@ -875,9 +891,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-backend"
-version = "0.2.103"
+version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0bb702423545a6007bbc368fde243ba47ca275e549c8a28617f56f6ba53b1d1c"
+checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19"
dependencies = [
"bumpalo",
"log",
@@ -889,9 +905,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-futures"
-version = "0.4.53"
+version = "0.4.54"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a0b221ff421256839509adbb55998214a70d829d3a28c69b4a6672e9d2a42f67"
+checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c"
dependencies = [
"cfg-if",
"js-sys",
@@ -902,9 +918,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro"
-version = "0.2.103"
+version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fc65f4f411d91494355917b605e1480033152658d71f722a90647f56a70c88a0"
+checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119"
dependencies = [
"quote",
"wasm-bindgen-macro-support",
@@ -912,9 +928,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-macro-support"
-version = "0.2.103"
+version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ffc003a991398a8ee604a401e194b6b3a39677b3173d6e74495eb51b82e99a32"
+checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7"
dependencies = [
"proc-macro2",
"quote",
@@ -925,9 +941,9 @@ dependencies = [
[[package]]
name = "wasm-bindgen-shared"
-version = "0.2.103"
+version = "0.2.104"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "293c37f4efa430ca14db3721dfbe48d8c33308096bd44d80ebaa775ab71ba1cf"
+checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1"
dependencies = [
"unicode-ident",
]
@@ -1004,9 +1020,9 @@ dependencies = [
[[package]]
name = "web-sys"
-version = "0.3.80"
+version = "0.3.81"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fbe734895e869dc429d78c4b433f8d17d95f8d05317440b4fad5ab2d33e596dc"
+checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120"
dependencies = [
"js-sys",
"wasm-bindgen",
@@ -1071,9 +1087,9 @@ dependencies = [
[[package]]
name = "windows-sys"
-version = "0.61.0"
+version = "0.61.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e201184e40b2ede64bc2ea34968b28e33622acdbbf37104f0e4a33f7abe657aa"
+checksum = "6f109e41dd4a3c848907eb83d5a42ea98b3769495597450cf6d153507b166f0f"
dependencies = [
"windows-link",
]
diff --git a/Cargo.toml b/Cargo.toml
index c793a86..ba6d989 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -11,6 +11,7 @@ fimg = { git = "https://github.com/bend-n/fimg", features = [
"real-show",
] }
implicit-fn = "0.1.0"
+itertools = "0.14.0"
lower = "0.2.0"
lru-cache = "0.1.2"
swash = "0.2.5"
diff --git a/src/lib.rs b/src/lib.rs
index ddbaf91..7881a29 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -19,6 +19,7 @@ use std::iter::{successors, zip};
pub mod cell;
use atools::{Deconstruct_, Join};
use fimg::{Image, OverlayAt};
+use itertools::Itertools;
use lru_cache::LruCache;
use swash::scale::{Render, ScaleContext, Source};
use swash::shape::ShapeContext;
@@ -31,7 +32,6 @@ use umath::FF32;
pub use crate::cell::Cell;
use crate::cell::Style;
-#[derive(Clone)]
pub struct Fonts<'a, 'b, 'c, 'd> {
regular: F<'a>,
bold: F<'b>,
@@ -39,6 +39,7 @@ pub struct Fonts<'a, 'b, 'c, 'd> {
bold_italic: F<'d>,
cache: LruCache<(u8, FF32, u16), swash::scale::image::Image>,
+ scx: ShapeContext,
}
#[derive(Clone, Copy)]
pub enum F<'a> {
@@ -90,6 +91,7 @@ impl<'a, 'b, 'c, 'd> Fonts<'a, 'b, 'c, 'd> {
italic: italic.into(),
bold_italic: bold_italic.into(),
cache: LruCache::new(3000),
+ scx: ShapeContext::new(),
}
}
}
@@ -151,38 +153,41 @@ pub unsafe fn render(
cell.style.flags,
)
});
-
+ let scx = &mut fonts.scx;
+ let mut cluster = CharCluster::new();
macro_rules! input {
($rule:expr, $font:expr) => {
- let mut scx = ShapeContext::new();
- let mut shaper = scx
- .builder($font)
- .size(ppem)
- .script(Script::Latin)
- .features([
- ("ss19", 1),
- ("ss01", 1),
- ("ss20", 1),
- ("liga", 1),
- ("rlig", 1),
- ])
- .build();
-
- let mut cluster = CharCluster::new();
-
- let mut parser = Parser::new(
- Script::Latin,
- tokenized.clone().filter($rule).map(|x| x.0),
- );
- while parser.next(&mut cluster) {
- cluster.map(|ch| $font.charmap().map(ch));
- shaper.add_cluster(&cluster);
- }
- shaper.shape_with(|x| {
- x.glyphs.into_iter().for_each(|x| {
- characters[x.data as usize] = *x;
- })
- });
+ tokenized
+ .clone()
+ .chunk_by($rule)
+ .into_iter()
+ .filter(|x| x.0)
+ .for_each(|(_, y)| {
+ let x = y.map(|x| x.0).collect::<Vec<_>>();
+ let mut shaper = scx
+ .builder($font)
+ .size(ppem)
+ .script(Script::Latin)
+ .features([
+ ("ss19", 1),
+ ("ss01", 1),
+ ("ss20", 1),
+ ("liga", 1),
+ ("rlig", 1),
+ ])
+ .build();
+ let mut parser =
+ Parser::new(Script::Latin, x.into_iter());
+ while parser.next(&mut cluster) {
+ cluster.map(|ch| $font.charmap().map(ch));
+ shaper.add_cluster(&cluster);
+ }
+ shaper.shape_with(|x| {
+ x.glyphs.into_iter().for_each(|x| {
+ characters[x.data as usize] = *x;
+ })
+ });
+ });
};
}
input!(|x| x.1 & Style::ITALIC == 0, *fonts.regular);
@@ -392,16 +397,52 @@ fn x() {
});
let mut i = Image::alloc(4000, 1000);
unsafe {
+ let z = [
+ Cell {
+ style: Style {
+ bg: [31, 36, 48],
+ color: [255, 255, 255],
+ flags: 5,
+ },
+ letter: Some('['),
+ },
+ Cell {
+ style: Style {
+ bg: [31, 36, 48],
+ color: [255, 173, 102],
+ flags: 5,
+ },
+ letter: Some('='),
+ },
+ Cell {
+ style: Style {
+ bg: [31, 36, 48],
+ color: [204, 202, 194],
+ flags: 0,
+ },
+ letter: Some('s'),
+ },
+ Cell {
+ style: Style {
+ bg: [31, 36, 48],
+ color: [255, 173, 102],
+ flags: 5,
+ },
+ letter: Some('>'),
+ },
+ Cell {
+ style: Style {
+ bg: [31, 36, 48],
+ color: [255, 255, 255],
+ flags: 5,
+ },
+ letter: Some(']'),
+ },
+ ];
render(
- &[
- Cell::basic('='),
- Cell::basic('='),
- Cell::basic('='),
- Cell::basic('='),
- Cell::basic('='),
- ],
+ &z,
(5, 0),
- 800.0,
+ 200.0,
[0; 3],
&mut Fonts::new(*FONT, *FONT, *FONT, *FONT),
2.0,