Remove ReX

This commit is contained in:
Laurenz 2023-01-22 13:19:48 +01:00
parent 79d851cd0b
commit 760936af49
5 changed files with 20 additions and 255 deletions

88
Cargo.lock generated
View file

@ -304,12 +304,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "either"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
[[package]]
name = "elsa"
version = "1.7.0"
@ -473,15 +467,6 @@ dependencies = [
"libc",
]
[[package]]
name = "itertools"
version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "284f18f85651fe11e8a991b2adb42cb078325c996ed026d994719efcfca1d54b"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "0.4.8"
@ -550,19 +535,6 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "lexical-core"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
dependencies = [
"arrayvec 0.5.2",
"bitflags",
"cfg-if",
"ryu",
"static_assertions",
]
[[package]]
name = "libc"
version = "0.2.139"
@ -647,17 +619,6 @@ dependencies = [
"windows-sys",
]
[[package]]
name = "nom"
version = "5.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffb4262d26ed83a1c0a33a38fe2bb15797329c85770da05e6b828ddb782627af"
dependencies = [
"lexical-core",
"memchr",
"version_check",
]
[[package]]
name = "notify"
version = "5.0.0"
@ -732,9 +693,9 @@ checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468"
[[package]]
name = "pixglyph"
version = "0.1.0"
source = "git+https://github.com/typst/pixglyph#131ea492ceada591c7e2d6dd2a5958ae325bd0d4"
source = "git+https://github.com/typst/pixglyph#e3ff0272d6723cdada91a00b0c99cda0e5adb56d"
dependencies = [
"ttf-parser 0.17.1",
"ttf-parser 0.18.1",
]
[[package]]
@ -864,17 +825,6 @@ dependencies = [
"usvg",
]
[[package]]
name = "rex"
version = "0.1.2"
source = "git+https://github.com/laurmaedje/ReX#523b29bd39a4daf50f9bb3ee48689c66b209c4ff"
dependencies = [
"itertools",
"nom",
"ttf-parser 0.17.1",
"unicode-math",
]
[[package]]
name = "rgb"
version = "0.8.34"
@ -997,12 +947,6 @@ version = "1.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
[[package]]
name = "static_assertions"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "subsetter"
version = "0.1.0"
@ -1128,6 +1072,12 @@ version = "0.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "375812fa44dab6df41c195cd2f7fecb488f6c09fbaafb62807488cefab642bff"
[[package]]
name = "ttf-parser"
version = "0.18.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0609f771ad9c6155384897e1df4d948e692667cc0588548b68eb44d052b27633"
[[package]]
name = "typed-arena"
version = "2.0.1"
@ -1150,7 +1100,6 @@ dependencies = [
"pixglyph",
"regex",
"resvg",
"rex",
"roxmltree",
"rustybuzz",
"serde",
@ -1160,8 +1109,9 @@ dependencies = [
"symmie",
"thin-vec",
"tiny-skia",
"ttf-parser 0.17.1",
"ttf-parser 0.18.1",
"typst-macros",
"unicode-math-class",
"unicode-segmentation",
"unicode-xid",
"unscanny",
@ -1198,17 +1148,16 @@ dependencies = [
"kurbo",
"lipsum",
"once_cell",
"rex",
"roxmltree",
"rustybuzz",
"serde_json",
"symmie",
"syntect",
"ttf-parser 0.17.1",
"ttf-parser 0.18.1",
"typed-arena",
"typst",
"unicode-bidi",
"unicode-math",
"unicode-math-class",
"unicode-script",
"unicode-segmentation",
"xi-unicode",
@ -1271,12 +1220,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
[[package]]
name = "unicode-math"
name = "unicode-math-class"
version = "0.1.0"
source = "git+https://github.com/s3bk/unicode-math/#8ab17ee2b125747876f48dfb579d58482bf876e5"
dependencies = [
"regex",
]
source = "git+https://github.com/typst/unicode-math-class#a7ac7dd75cd79ab2e0bdb629036cb913371608d2"
[[package]]
name = "unicode-script"
@ -1328,12 +1274,6 @@ dependencies = [
"svgtypes",
]
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "walkdir"
version = "2.3.2"

View file

@ -25,7 +25,6 @@ pdf-writer = "0.6"
pixglyph = { git = "https://github.com/typst/pixglyph" }
regex = "1"
resvg = { version = "0.22", default-features = false }
rex = { git = "https://github.com/laurmaedje/ReX" }
roxmltree = "0.14"
rustybuzz = "0.5"
serde = { version = "1", features = ["derive"] }
@ -35,7 +34,8 @@ svg2pdf = "0.4"
symmie = { git = "https://github.com/typst/symmie" }
thin-vec = "0.2"
tiny-skia = "0.6.2"
ttf-parser = "0.17"
ttf-parser = "0.18.1"
unicode-math-class = { git = "https://github.com/typst/unicode-math-class" }
unicode-segmentation = "1"
unicode-xid = "0.2"
unscanny = "0.1"

View file

@ -17,16 +17,15 @@ hypher = "0.1"
kurbo = "0.8"
lipsum = { git = "https://github.com/reknih/lipsum" }
once_cell = "1"
rex = { git = "https://github.com/laurmaedje/ReX" }
roxmltree = "0.14"
rustybuzz = "0.5"
serde_json = "1"
symmie = { git = "https://github.com/typst/symmie" }
syntect = { version = "5", default-features = false, features = ["default-syntaxes", "regex-fancy"] }
ttf-parser = "0.17"
ttf-parser = "0.18.1"
typed-arena = "2"
unicode-bidi = "0.3.5"
unicode-math = { git = "https://github.com/s3bk/unicode-math/" }
unicode-math-class = { git = "https://github.com/typst/unicode-math-class" }
unicode-script = "0.5"
unicode-segmentation = "1"
xi-unicode = "0.3"

View file

@ -1,151 +0,0 @@
use rex::error::{Error, LayoutError};
use rex::font::FontContext;
use rex::layout::{LayoutSettings, Style};
use rex::parser::color::RGBA;
use rex::render::{Backend, Cursor, Renderer};
use typst::font::Font;
use crate::prelude::*;
use crate::text::{families, variant, TextNode};
/// Layout a TeX formula into a frame.
pub fn layout_tex(
vt: &Vt,
tex: &str,
display: bool,
styles: StyleChain,
) -> Result<Fragment, &'static str> {
// Load the font.
let variant = variant(styles);
let world = vt.world();
let mut font = None;
for family in families(styles) {
font = world.book().select(family, variant).and_then(|id| world.font(id));
if font.as_ref().map_or(false, |font| font.math().is_some()) {
break;
}
}
// Prepare the font context.
let Some(font) = font else { return Err("failed to find suitable math font") };
let Some(ctx) = font
.math()
.map(|math| FontContext::new(font.ttf(), math))
else {
return Err("failed to create math font context");
};
// Layout the formula.
let em = styles.get(TextNode::SIZE);
let style = if display { Style::Display } else { Style::Text };
let settings = LayoutSettings::new(&ctx, em.to_pt(), style);
let renderer = Renderer::new();
let Ok(layout) = renderer
.layout(&tex, settings)
.map_err(|err| match err {
Error::Parse(err) => err.to_string(),
Error::Layout(LayoutError::Font(err)) => err.to_string(),
})
else {
return Err("failed to layout math");
};
// Determine the metrics.
let (x0, y0, x1, y1) = renderer.size(&layout);
let width = Abs::pt(x1 - x0);
let mut top = Abs::pt(y1);
let mut bottom = Abs::pt(-y0);
if style != Style::Display {
let metrics = font.metrics();
top = styles.get(TextNode::TOP_EDGE).resolve(styles, metrics);
bottom = -styles.get(TextNode::BOTTOM_EDGE).resolve(styles, metrics);
};
// Prepare a frame rendering backend.
let size = Size::new(width, top + bottom);
let mut backend = FrameBackend {
frame: {
let mut frame = Frame::new(size);
frame.set_baseline(top);
frame
},
baseline: top,
font: font.clone(),
paint: styles.get(TextNode::FILL),
lang: styles.get(TextNode::LANG),
colors: vec![],
};
// Render into the frame.
renderer.render(&layout, &mut backend);
Ok(Fragment::frame(backend.frame))
}
/// A ReX rendering backend that renders into a frame.
struct FrameBackend {
frame: Frame,
baseline: Abs,
font: Font,
paint: Paint,
lang: Lang,
colors: Vec<RGBA>,
}
impl FrameBackend {
/// The currently active paint.
fn paint(&self) -> Paint {
self.colors
.last()
.map(|&RGBA(r, g, b, a)| RgbaColor::new(r, g, b, a).into())
.unwrap_or(self.paint)
}
/// Convert a cursor to a point.
fn transform(&self, cursor: Cursor) -> Point {
Point::new(Abs::pt(cursor.x), self.baseline + Abs::pt(cursor.y))
}
}
impl Backend for FrameBackend {
fn symbol(&mut self, pos: Cursor, gid: u16, scale: f64) {
self.frame.push(
self.transform(pos),
Element::Text(Text {
font: self.font.clone(),
size: Abs::pt(scale),
fill: self.paint(),
lang: self.lang,
glyphs: vec![Glyph {
id: gid,
x_advance: Em::new(0.0),
x_offset: Em::new(0.0),
c: ' ',
}],
}),
);
}
fn rule(&mut self, pos: Cursor, width: f64, height: f64) {
if height == 0.0 {
return;
}
self.frame.push(
self.transform(pos) + Point::with_y(Abs::pt(height) / 2.0),
Element::Shape(Shape {
geometry: Geometry::Line(Point::new(Abs::pt(width), Abs::zero())),
fill: None,
stroke: Some(Stroke { paint: self.paint(), thickness: Abs::pt(height) }),
}),
);
}
fn begin_color(&mut self, color: RGBA) {
self.colors.push(color);
}
fn end_color(&mut self) {
self.colors.pop();
}
}

View file

@ -10,9 +10,7 @@ use std::fmt::{self, Debug, Formatter};
use std::hash::{Hash, Hasher};
use std::sync::Arc;
use once_cell::unsync::OnceCell;
use rex::font::MathHeader;
use ttf_parser::{GlyphId, Tag};
use ttf_parser::GlyphId;
use crate::geom::Em;
use crate::util::Buffer;
@ -37,8 +35,6 @@ struct Repr {
ttf: ttf_parser::Face<'static>,
/// The underlying rustybuzz face.
rusty: rustybuzz::Face<'static>,
/// The parsed ReX math header.
math: OnceCell<Option<MathHeader>>,
}
impl Font {
@ -58,15 +54,7 @@ impl Font {
let metrics = FontMetrics::from_ttf(&ttf);
let info = FontInfo::from_ttf(&ttf)?;
Some(Self(Arc::new(Repr {
data,
index,
info,
metrics,
ttf,
rusty,
math: OnceCell::new(),
})))
Some(Self(Arc::new(Repr { data, index, info, metrics, ttf, rusty })))
}
/// Parse all fonts in the given data.
@ -131,17 +119,6 @@ impl Font {
// internal 'static lifetime.
&self.0.rusty
}
/// Access the math header, if any.
pub fn math(&self) -> Option<&MathHeader> {
self.0
.math
.get_or_init(|| {
let data = self.ttf().raw_face().table(Tag::from_bytes(b"MATH"))?;
MathHeader::parse(data).ok()
})
.as_ref()
}
}
impl Hash for Font {