small changes
| -rw-r--r-- | Cargo.lock | 114 | ||||
| -rw-r--r-- | Cargo.toml | 1 | ||||
| -rw-r--r-- | src/lib.rs | 119 |
3 files changed, 146 insertions, 88 deletions
@@ -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", ] @@ -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" @@ -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, |