From de20a21a584a90da682a64e9a79cd18a95195b70 Mon Sep 17 00:00:00 2001 From: Laurenz Date: Mon, 5 Apr 2021 22:32:09 +0200 Subject: [PATCH] =?UTF-8?q?Reshaping=20with=20unsafe-to-break=20=E2=9A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Martin --- Cargo.toml | 2 +- src/font.rs | 74 ++++--- src/layout/frame.rs | 61 ++---- src/layout/par.rs | 79 +++---- src/layout/shaping.rs | 369 ++++++++++++++++++++++---------- src/lib.rs | 1 + src/pdf/mod.rs | 8 +- src/util.rs | 80 +++++++ tests/ref/full/coma.png | Bin 59071 -> 59057 bytes tests/ref/library/paragraph.png | Bin 4336 -> 4337 bytes tests/ref/text/basic.png | Bin 37172 -> 37176 bytes tests/ref/text/bidi.png | Bin 14839 -> 15004 bytes tests/typeset.rs | 37 ++-- 13 files changed, 455 insertions(+), 256 deletions(-) create mode 100644 src/util.rs diff --git a/Cargo.toml b/Cargo.toml index 4eef9f8cb..ab8c4bcbd 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,7 +26,7 @@ fontdock = { path = "../fontdock", default-features = false } image = { version = "0.23", default-features = false, features = ["jpeg", "png"] } miniz_oxide = "0.3" pdf-writer = { path = "../pdf-writer" } -rustybuzz = "0.3" +rustybuzz = { git = "https://github.com/laurmaedje/rustybuzz" } ttf-parser = "0.9" unicode-bidi = "0.3" unicode-xid = "0.2" diff --git a/src/font.rs b/src/font.rs index bcc646272..a816ed066 100644 --- a/src/font.rs +++ b/src/font.rs @@ -4,12 +4,19 @@ use std::fmt::{self, Display, Formatter}; use fontdock::FaceFromVec; +use crate::geom::Length; + /// An owned font face. pub struct FaceBuf { data: Box<[u8]>, index: u32, ttf: ttf_parser::Face<'static>, buzz: rustybuzz::Face<'static>, + units_per_em: f64, + ascender: f64, + cap_height: f64, + x_height: f64, + descender: f64, } impl FaceBuf { @@ -36,6 +43,22 @@ impl FaceBuf { // lifetime. &self.buzz } + + /// Look up a vertical metric at a given font size. + pub fn vertical_metric(&self, size: Length, metric: VerticalFontMetric) -> Length { + self.convert(size, match metric { + VerticalFontMetric::Ascender => self.ascender, + VerticalFontMetric::CapHeight => self.cap_height, + VerticalFontMetric::XHeight => self.x_height, + VerticalFontMetric::Baseline => 0.0, + VerticalFontMetric::Descender => self.descender, + }) + } + + /// Convert from font units to a length at a given font size. + pub fn convert(&self, size: Length, units: impl Into) -> Length { + units.into() / self.units_per_em * size + } } impl FaceFromVec for FaceBuf { @@ -47,11 +70,26 @@ impl FaceFromVec for FaceBuf { let slice: &'static [u8] = unsafe { std::slice::from_raw_parts(data.as_ptr(), data.len()) }; + let ttf = ttf_parser::Face::from_slice(slice, index).ok()?; + let buzz = rustybuzz::Face::from_slice(slice, index)?; + + // Look up some metrics we may need often. + let units_per_em = ttf.units_per_em().unwrap_or(1000); + let ascender = ttf.typographic_ascender().unwrap_or(ttf.ascender()); + let cap_height = ttf.capital_height().filter(|&h| h > 0).unwrap_or(ascender); + let x_height = ttf.x_height().filter(|&h| h > 0).unwrap_or(ascender); + let descender = ttf.typographic_descender().unwrap_or(ttf.descender()); + Some(Self { data, index, - ttf: ttf_parser::Face::from_slice(slice, index).ok()?, - buzz: rustybuzz::Face::from_slice(slice, index)?, + ttf, + buzz, + units_per_em: f64::from(units_per_em), + ascender: f64::from(ascender), + cap_height: f64::from(cap_height), + x_height: f64::from(x_height), + descender: f64::from(descender), }) } } @@ -77,38 +115,6 @@ pub enum VerticalFontMetric { Descender, } -impl VerticalFontMetric { - /// Look up the metric in the given font face. - pub fn lookup(self, face: &ttf_parser::Face) -> i16 { - match self { - VerticalFontMetric::Ascender => lookup_ascender(face), - VerticalFontMetric::CapHeight => face - .capital_height() - .filter(|&h| h > 0) - .unwrap_or_else(|| lookup_ascender(face)), - VerticalFontMetric::XHeight => face - .x_height() - .filter(|&h| h > 0) - .unwrap_or_else(|| lookup_ascender(face)), - VerticalFontMetric::Baseline => 0, - VerticalFontMetric::Descender => lookup_descender(face), - } - } -} - -/// The ascender of the face. -fn lookup_ascender(face: &ttf_parser::Face) -> i16 { - // We prefer the typographic ascender over the Windows ascender because - // it can be overly large if the font has large glyphs. - face.typographic_ascender().unwrap_or_else(|| face.ascender()) -} - -/// The descender of the face. -fn lookup_descender(face: &ttf_parser::Face) -> i16 { - // See `lookup_ascender` for reason. - face.typographic_descender().unwrap_or_else(|| face.descender()) -} - impl Display for VerticalFontMetric { fn fmt(&self, f: &mut Formatter) -> fmt::Result { f.pad(match self { diff --git a/src/layout/frame.rs b/src/layout/frame.rs index b6100b83e..21fdbf28c 100644 --- a/src/layout/frame.rs +++ b/src/layout/frame.rs @@ -40,62 +40,45 @@ impl Frame { #[derive(Debug, Clone, PartialEq)] pub enum Element { /// Shaped text. - Text(ShapedText), + Text(Text), /// A geometric shape. Geometry(Geometry), /// A raster image. Image(Image), } -/// A shaped run of text. +/// A run of shaped text. #[derive(Debug, Clone, PartialEq)] -pub struct ShapedText { - /// The font face the text was shaped with. - pub face: FaceId, +pub struct Text { + /// The font face the glyphs are contained in. + pub face_id: FaceId, /// The font size. pub size: Length, - /// The width. - pub width: Length, - /// The extent to the top. - pub top: Length, - /// The extent to the bottom. - pub bottom: Length, /// The glyph fill color / texture. pub color: Fill, - /// The shaped glyphs. - pub glyphs: Vec, - /// The horizontal offsets of the glyphs. This is indexed parallel to - /// `glyphs`. Vertical offsets are not yet supported. - pub offsets: Vec, + /// The glyphs. + pub glyphs: Vec, } -impl ShapedText { - /// Create a new shape run with `width` zero and empty `glyphs` and `offsets`. - pub fn new( - face: FaceId, - size: Length, - top: Length, - bottom: Length, - color: Fill, - ) -> Self { - Self { - face, - size, - width: Length::ZERO, - top, - bottom, - glyphs: vec![], - offsets: vec![], - color, - } - } +/// A glyph in a run of shaped text. +#[derive(Debug, Copy, Clone, PartialEq)] +pub struct Glyph { + /// The glyph's ID in the face. + pub id: GlyphId, + /// The advance width of the glyph. + pub x_advance: Length, + /// The horizontal offset of the glyph. + pub x_offset: Length, +} +impl Text { /// Encode the glyph ids into a big-endian byte buffer. pub fn encode_glyphs_be(&self) -> Vec { let mut bytes = Vec::with_capacity(2 * self.glyphs.len()); - for &GlyphId(g) in &self.glyphs { - bytes.push((g >> 8) as u8); - bytes.push((g & 0xff) as u8); + for glyph in &self.glyphs { + let id = glyph.id.0; + bytes.push((id >> 8) as u8); + bytes.push((id & 0xff) as u8); } bytes } diff --git a/src/layout/par.rs b/src/layout/par.rs index 5232c9467..cad53cd59 100644 --- a/src/layout/par.rs +++ b/src/layout/par.rs @@ -1,4 +1,3 @@ -use std::cmp::Ordering; use std::fmt::{self, Debug, Formatter}; use std::mem; @@ -7,6 +6,7 @@ use xi_unicode::LineBreakIterator; use super::*; use crate::exec::FontProps; +use crate::util::RangeExt; type Range = std::ops::Range; @@ -74,7 +74,6 @@ impl ParNode { /// A paragraph representation in which children are already layouted and text /// is separated into shapable runs. -#[derive(Debug)] struct ParLayout<'a> { /// The top-level direction. dir: Dir, @@ -87,12 +86,11 @@ struct ParLayout<'a> { } /// A prepared item in a paragraph layout. -#[derive(Debug)] enum ParItem<'a> { /// Spacing between other items. Spacing(Length), /// A shaped text run with consistent direction. - Text(ShapeResult<'a>, Align), + Text(ShapedText<'a>, Align), /// A layouted child node. Frame(Frame, Align), } @@ -151,24 +149,22 @@ impl<'a> ParLayout<'a> { // TODO: Provide line break opportunities on alignment changes. for (end, mandatory) in LineBreakIterator::new(self.bidi.text) { let mut line = LineLayout::new(&self, start .. end, ctx); - let mut size = line.measure().0; - if !stack.areas.current.fits(size) { + if !stack.areas.current.fits(line.size) { if let Some((last_line, last_end)) = last.take() { stack.push(last_line); start = last_end; line = LineLayout::new(&self, start .. end, ctx); - size = line.measure().0; } } - if !stack.areas.current.height.fits(size.height) + if !stack.areas.current.height.fits(line.size.height) && !stack.areas.in_full_last() { - stack.finish_area(); + stack.finish_area(ctx); } - if mandatory || !stack.areas.current.width.fits(size.width) { + if mandatory || !stack.areas.current.width.fits(line.size.width) { stack.push(line); start = end; last = None; @@ -185,7 +181,7 @@ impl<'a> ParLayout<'a> { stack.push(line); } - stack.finish() + stack.finish(ctx) } /// Find the index of the item whose range contains the `text_offset`. @@ -200,7 +196,7 @@ impl ParItem<'_> { pub fn measure(&self) -> (Size, Length) { match self { Self::Spacing(amount) => (Size::new(*amount, Length::ZERO), Length::ZERO), - Self::Text(shaped, _) => shaped.measure(), + Self::Text(shaped, _) => (shaped.size, shaped.baseline), Self::Frame(frame, _) => (frame.size, frame.baseline), } } @@ -239,6 +235,8 @@ struct LineLayout<'a> { items: &'a [ParItem<'a>], last: Option>, ranges: &'a [Range], + size: Size, + baseline: Length, } impl<'a> LineLayout<'a> { @@ -265,7 +263,7 @@ impl<'a> LineLayout<'a> { let end = line.end - range.start; // Trim whitespace at the end of the line. - let end = start + shaped.text()[start .. end].trim_end().len(); + let end = start + shaped.text[start .. end].trim_end().len(); line.end = range.start + end; if start != end || rest.is_empty() { @@ -291,28 +289,32 @@ impl<'a> LineLayout<'a> { items = rest; } - Self { par, line, first, items, last, ranges } - } - - /// Measure the size of the line without actually building its frame. - fn measure(&self) -> (Size, Length) { let mut width = Length::ZERO; let mut top = Length::ZERO; let mut bottom = Length::ZERO; - for item in self.iter() { + for item in first.iter().chain(items).chain(&last) { let (size, baseline) = item.measure(); width += size.width; top = top.max(baseline); bottom = bottom.max(size.height - baseline); } - (Size::new(width, top + bottom), top) + Self { + par, + line, + first, + items, + last, + ranges, + size: Size::new(width, top + bottom), + baseline: top, + } } /// Build the line's frame. - fn build(&self, width: Length) -> Frame { - let (size, baseline) = self.measure(); + fn build(&self, ctx: &mut LayoutContext, width: Length) -> Frame { + let (size, baseline) = (self.size, self.baseline); let full_size = Size::new(size.width.max(width), size.height); let mut output = Frame::new(full_size, baseline); @@ -325,7 +327,9 @@ impl<'a> LineLayout<'a> { offset += amount; return; } - ParItem::Text(ref shaped, align) => (shaped.build(), align), + ParItem::Text(ref shaped, align) => { + (shaped.build(&mut ctx.env.fonts), align) + } ParItem::Frame(ref frame, align) => (frame.clone(), align), }; @@ -400,18 +404,7 @@ impl<'a> LineLayout<'a> { /// Find the range that contains the position. fn find_range(ranges: &[Range], pos: usize) -> Option { - ranges.binary_search_by(|r| cmp(r, pos)).ok() -} - -/// Comparison function for a range and a position used in binary search. -fn cmp(range: &Range, pos: usize) -> Ordering { - if pos < range.start { - Ordering::Greater - } else if pos < range.end { - Ordering::Equal - } else { - Ordering::Less - } + ranges.binary_search_by(|r| r.locate(pos)).ok() } /// Stacks lines into paragraph frames. @@ -435,19 +428,17 @@ impl<'a> LineStack<'a> { } fn push(&mut self, line: LineLayout<'a>) { - let size = line.measure().0; - - self.size.width = self.size.width.max(size.width); - self.size.height += size.height; + self.size.width = self.size.width.max(line.size.width); + self.size.height += line.size.height; if !self.lines.is_empty() { self.size.height += self.line_spacing; } - self.areas.current.height -= size.height + self.line_spacing; + self.areas.current.height -= line.size.height + self.line_spacing; self.lines.push(line); } - fn finish_area(&mut self) { + fn finish_area(&mut self, ctx: &mut LayoutContext) { let expand = self.areas.expand.horizontal; let full = self.areas.full.width; self.size.width = expand.resolve(self.size.width, full); @@ -457,7 +448,7 @@ impl<'a> LineStack<'a> { let mut first = true; for line in mem::take(&mut self.lines) { - let frame = line.build(self.size.width); + let frame = line.build(ctx, self.size.width); let height = frame.size.height; if first { @@ -474,8 +465,8 @@ impl<'a> LineStack<'a> { self.size = Size::ZERO; } - fn finish(mut self) -> Vec { - self.finish_area(); + fn finish(mut self, ctx: &mut LayoutContext) -> Vec { + self.finish_area(ctx); self.finished } } diff --git a/src/layout/shaping.rs b/src/layout/shaping.rs index 7ead0dff1..b062f602d 100644 --- a/src/layout/shaping.rs +++ b/src/layout/shaping.rs @@ -1,3 +1,4 @@ +use std::borrow::Cow; use std::fmt::{self, Debug, Formatter}; use std::ops::Range; @@ -5,86 +6,179 @@ use fontdock::FaceId; use rustybuzz::UnicodeBuffer; use ttf_parser::GlyphId; -use super::{Element, Frame, ShapedText}; +use super::{Element, Frame, Glyph, Text}; use crate::env::FontLoader; use crate::exec::FontProps; +use crate::font::FaceBuf; use crate::geom::{Dir, Length, Point, Size}; +use crate::util::SliceExt; -/// Shape text into a frame containing [`ShapedText`] runs. -pub fn shape<'a>( - text: &'a str, - dir: Dir, - loader: &mut FontLoader, - props: &'a FontProps, -) -> ShapeResult<'a> { - let iter = props.families.iter(); - let mut results = vec![]; - shape_segment(&mut results, text, dir, loader, props, iter, None); +/// The result of shaping text. +/// +/// This type contains owned or borrowed shaped text runs, which can be +/// measured, used to reshape substrings more quickly and converted into a +/// frame. +pub struct ShapedText<'a> { + /// The text that was shaped. + pub text: &'a str, + /// The text direction. + pub dir: Dir, + /// The properties used for font selection. + pub props: &'a FontProps, + /// The font size. + pub size: Size, + /// The baseline from the top of the frame. + pub baseline: Length, + /// The shaped glyphs. + pub glyphs: Cow<'a, [ShapedGlyph]>, +} - let mut top = Length::ZERO; - let mut bottom = Length::ZERO; - for result in &results { - top = top.max(result.top); - bottom = bottom.max(result.bottom); - } +/// A single glyph resulting from shaping. +#[derive(Debug, Copy, Clone)] +pub struct ShapedGlyph { + /// The font face the glyph is contained in. + pub face_id: FaceId, + /// The glyph's ID in the face. + pub id: GlyphId, + /// The advance width of the glyph. + pub x_advance: i32, + /// The horizontal offset of the glyph. + pub x_offset: i32, + /// The start index of the glyph in the source text. + pub text_index: usize, + /// Whether splitting the shaping result before this glyph would yield the + /// same results as shaping the parts to both sides of `text_index` + /// separately. + pub safe_to_break: bool, +} - let mut frame = Frame::new(Size::new(Length::ZERO, top + bottom), top); +impl<'a> ShapedText<'a> { + /// Build the shaped text's frame. + pub fn build(&self, loader: &mut FontLoader) -> Frame { + let mut frame = Frame::new(self.size, self.baseline); + let mut x = Length::ZERO; - for shaped in results { - let offset = frame.size.width; - frame.size.width += shaped.width; + for (face_id, group) in self.glyphs.as_ref().group_by_key(|g| g.face_id) { + let face = loader.face(face_id); - if !shaped.glyphs.is_empty() { - frame.push(Point::new(offset, top), Element::Text(shaped)); + let pos = Point::new(x, self.baseline); + let mut text = Text { + face_id, + size: self.props.size, + color: self.props.color, + glyphs: vec![], + }; + + for glyph in group { + let x_advance = face.convert(self.props.size, glyph.x_advance); + let x_offset = face.convert(self.props.size, glyph.x_offset); + text.glyphs.push(Glyph { id: glyph.id, x_advance, x_offset }); + x += x_advance; + } + + frame.push(pos, Element::Text(text)); } + + frame } - ShapeResult { frame, text, dir, props } -} - -#[derive(Clone)] -pub struct ShapeResult<'a> { - frame: Frame, - text: &'a str, - dir: Dir, - props: &'a FontProps, -} - -impl<'a> ShapeResult<'a> { + /// Reshape a range of the shaped text, reusing information from this + /// shaping process if possible. pub fn reshape( - &self, - range: Range, + &'a self, + text_range: Range, loader: &mut FontLoader, - ) -> ShapeResult<'_> { - if range.start == 0 && range.end == self.text.len() { - self.clone() + ) -> ShapedText<'a> { + if let Some(glyphs) = self.slice_safe_to_break(text_range.clone()) { + let (size, baseline) = measure(glyphs, loader, self.props); + Self { + text: &self.text[text_range], + dir: self.dir, + props: self.props, + size, + baseline, + glyphs: Cow::Borrowed(glyphs), + } } else { - shape(&self.text[range], self.dir, loader, self.props) + shape(&self.text[text_range], self.dir, loader, self.props) } } - pub fn text(&self) -> &'a str { - self.text + /// Find the subslice of glyphs that represent the given text range if both + /// sides are safe to break. + fn slice_safe_to_break(&self, text_range: Range) -> Option<&[ShapedGlyph]> { + let mut start = self.find_safe_to_break(text_range.start)?; + let mut end = self.find_safe_to_break(text_range.end)?; + + if !self.dir.is_positive() { + std::mem::swap(&mut start, &mut end); + } + + // TODO: Expand to left and right if necessary because + // find_safe_to_break may find any glyph with the text_index. + + Some(&self.glyphs[start .. end]) } - pub fn measure(&self) -> (Size, Length) { - (self.frame.size, self.frame.baseline) - } + /// Find the glyph slice offset at the text index if it's safe to break. + fn find_safe_to_break(&self, text_index: usize) -> Option { + let ltr = self.dir.is_positive(); - pub fn build(&self) -> Frame { - self.frame.clone() + // Handle edge cases. + let len = self.glyphs.len(); + if text_index == 0 { + return Some(if ltr { 0 } else { len }); + } else if text_index == self.text.len() { + return Some(if ltr { len } else { 0 }); + } + + // TODO: Do binary search. Take care that RTL needs reversed ordering. + let idx = self + .glyphs + .iter() + .position(|g| g.text_index == text_index) + .filter(|&i| self.glyphs[i].safe_to_break)?; + + // RTL needs offset one because the the start of the range should + // be exclusive and the end inclusive. + Some(if ltr { idx } else { idx + 1 }) } } -impl Debug for ShapeResult<'_> { +impl Debug for ShapedText<'_> { fn fmt(&self, f: &mut Formatter) -> fmt::Result { write!(f, "Shaped({:?})", self.text) } } -/// Shape text into a frame with font fallback using the `families` iterator. +/// Shape text into [`ShapedText`]. +pub fn shape<'a>( + text: &'a str, + dir: Dir, + loader: &mut FontLoader, + props: &'a FontProps, +) -> ShapedText<'a> { + let mut glyphs = vec![]; + let families = props.families.iter(); + if !text.is_empty() { + shape_segment(&mut glyphs, 0, text, dir, loader, props, families, None); + } + + let (size, baseline) = measure(&glyphs, loader, props); + ShapedText { + text, + dir, + props, + size, + baseline, + glyphs: Cow::Owned(glyphs), + } +} + +/// Shape text with font fallback using the `families` iterator. fn shape_segment<'a>( - results: &mut Vec, + glyphs: &mut Vec, + base: usize, text: &str, dir: Dir, loader: &mut FontLoader, @@ -93,7 +187,7 @@ fn shape_segment<'a>( mut first: Option, ) { // Select the font family. - let (id, fallback) = loop { + let (face_id, fallback) = loop { // Try to load the next available font family. match families.next() { Some(family) => match loader.query(family, props.variant) { @@ -111,22 +205,7 @@ fn shape_segment<'a>( // Register that this is the first available font. if first.is_none() { - first = Some(id); - } - - // Find out some metrics and prepare the shaped text container. - let face = loader.face(id); - let ttf = face.ttf(); - let units_per_em = f64::from(ttf.units_per_em().unwrap_or(1000)); - let convert = |units| f64::from(units) / units_per_em * props.size; - let top = convert(i32::from(props.top_edge.lookup(ttf))); - let bottom = convert(i32::from(-props.bottom_edge.lookup(ttf))); - let mut shaped = ShapedText::new(id, props.size, top, bottom, props.color); - - // For empty text, we want a zero-width box with the correct height. - if text.is_empty() { - results.push(shaped); - return; + first = Some(face_id); } // Fill the buffer with our text. @@ -139,59 +218,117 @@ fn shape_segment<'a>( }); // Shape! - let glyphs = rustybuzz::shape(face.buzz(), &[], buffer); - let info = glyphs.glyph_infos(); - let pos = glyphs.glyph_positions(); - let mut iter = info.iter().zip(pos).peekable(); + let buffer = rustybuzz::shape(loader.face(face_id).buzz(), &[], buffer); + let infos = buffer.glyph_infos(); + let pos = buffer.glyph_positions(); - while let Some((info, pos)) = iter.next() { - // Do font fallback if the glyph is a tofu. - if info.codepoint == 0 && fallback { - // Flush what we have so far. - if !shaped.glyphs.is_empty() { - results.push(shaped); - shaped = ShapedText::new(id, props.size, top, bottom, props.color); - } + // Collect the shaped glyphs, reshaping with the next font if necessary. + let mut i = 0; + while i < infos.len() { + let info = &infos[i]; + let cluster = info.cluster as usize; - // Determine the start and end cluster index of the tofu sequence. - let mut start = info.cluster as usize; - let mut end = info.cluster as usize; - while let Some((info, _)) = iter.peek() { - if info.codepoint != 0 { - break; - } - end = info.cluster as usize; - iter.next(); - } - - // Because Harfbuzz outputs glyphs in visual order, the start - // cluster actually corresponds to the last codepoint in - // right-to-left text. - if !dir.is_positive() { - assert!(end <= start); - std::mem::swap(&mut start, &mut end); - } - - // The end cluster index points right before the last character that - // mapped to the tofu sequence. So we have to offset the end by one - // char. - let offset = text[end ..].chars().next().unwrap().len_utf8(); - let range = start .. end + offset; - let part = &text[range]; - - // Recursively shape the tofu sequence with the next family. - shape_segment(results, part, dir, loader, props, families.clone(), first); - } else { + if info.codepoint != 0 || !fallback { // Add the glyph to the shaped output. // TODO: Don't ignore y_advance and y_offset. - let glyph = GlyphId(info.codepoint as u16); - shaped.glyphs.push(glyph); - shaped.offsets.push(shaped.width + convert(pos.x_offset)); - shaped.width += convert(pos.x_advance); + glyphs.push(ShapedGlyph { + face_id, + id: GlyphId(info.codepoint as u16), + x_advance: pos[i].x_advance, + x_offset: pos[i].x_offset, + text_index: base + cluster, + safe_to_break: !info.unsafe_to_break(), + }); + } else { + // Do font fallback if the glyph is a tofu. + // + // First, search for the end of the tofu sequence. + let k = i; + while infos.get(i + 1).map_or(false, |info| info.codepoint == 0) { + i += 1; + } + + // Determine the source text range for the tofu sequence. + let range = { + // Examples + // + // Here, _ is a tofu. + // Note that the glyph cluster length is greater than 1 char! + // + // Left-to-right clusters: + // h a l i h a l l o + // A _ _ C E + // 0 2 4 6 8 + // + // Right-to-left clusters: + // O L L A H I L A H + // E C _ _ A + // 8 6 4 2 0 + + let ltr = dir.is_positive(); + let first = if ltr { k } else { i }; + let start = infos[first].cluster as usize; + + let last = if ltr { i.checked_add(1) } else { k.checked_sub(1) }; + let end = last + .and_then(|last| infos.get(last)) + .map(|info| info.cluster as usize) + .unwrap_or(text.len()); + + start .. end + }; + + // Recursively shape the tofu sequence with the next family. + shape_segment( + glyphs, + base + range.start, + &text[range], + dir, + loader, + props, + families.clone(), + first, + ); + } + + i += 1; + } +} + +/// Measure the size and baseline of a run of shaped glyphs with the given +/// properties. +fn measure( + glyphs: &[ShapedGlyph], + loader: &mut FontLoader, + props: &FontProps, +) -> (Size, Length) { + let mut top = Length::ZERO; + let mut bottom = Length::ZERO; + let mut width = Length::ZERO; + let mut vertical = |face: &FaceBuf| { + top = top.max(face.vertical_metric(props.size, props.top_edge)); + bottom = bottom.max(-face.vertical_metric(props.size, props.bottom_edge)); + }; + + if glyphs.is_empty() { + // When there are no glyphs, we just use the vertical metrics of the + // first available font. + for family in props.families.iter() { + if let Some(face_id) = loader.query(family, props.variant) { + vertical(loader.face(face_id)); + break; + } + } + } else { + for (face_id, group) in glyphs.group_by_key(|g| g.face_id) { + let face = loader.face(face_id); + vertical(face); + + for glyph in group { + width += face.convert(props.size, glyph.x_advance); + } } } - if !shaped.glyphs.is_empty() { - results.push(shaped); - } + (Size::new(width, top + bottom), top) } diff --git a/src/lib.rs b/src/lib.rs index 9e09a9b45..2802c3866 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -44,6 +44,7 @@ pub mod parse; pub mod pdf; pub mod pretty; pub mod syntax; +pub mod util; use crate::diag::Pass; use crate::env::Env; diff --git a/src/pdf/mod.rs b/src/pdf/mod.rs index a97dfa2c1..656635fce 100644 --- a/src/pdf/mod.rs +++ b/src/pdf/mod.rs @@ -50,7 +50,7 @@ impl<'a> PdfExporter<'a> { for frame in frames { for (_, element) in &frame.elements { match element { - Element::Text(shaped) => fonts.insert(shaped.face), + Element::Text(shaped) => fonts.insert(shaped.face_id), Element::Image(image) => { let img = env.resources.loaded::(image.res); if img.buf.color().has_alpha() { @@ -187,11 +187,11 @@ impl<'a> PdfExporter<'a> { // Then, also check if we need to issue a font switching // action. - if shaped.face != face || shaped.size != size { - face = shaped.face; + if shaped.face_id != face || shaped.size != size { + face = shaped.face_id; size = shaped.size; - let name = format!("F{}", self.fonts.map(shaped.face)); + let name = format!("F{}", self.fonts.map(shaped.face_id)); text.font(Name(name.as_bytes()), size.to_pt() as f32); } diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 000000000..6fda2fb55 --- /dev/null +++ b/src/util.rs @@ -0,0 +1,80 @@ +/// Utilities. +use std::cmp::Ordering; +use std::ops::Range; + +/// Additional methods for slices. +pub trait SliceExt { + /// Split a slice into consecutive groups with the same key. + /// + /// Returns an iterator of pairs of a key and the group with that key. + fn group_by_key(&self, f: F) -> GroupByKey<'_, T, F> + where + F: FnMut(&T) -> K, + K: PartialEq; +} + +impl SliceExt for [T] { + fn group_by_key(&self, f: F) -> GroupByKey<'_, T, F> + where + F: FnMut(&T) -> K, + K: PartialEq, + { + GroupByKey { slice: self, f } + } +} + +/// This struct is produced by [`SliceExt::group_by_key`]. +pub struct GroupByKey<'a, T, F> { + slice: &'a [T], + f: F, +} + +impl<'a, T, K, F> Iterator for GroupByKey<'a, T, F> +where + F: FnMut(&T) -> K, + K: PartialEq, +{ + type Item = (K, &'a [T]); + + fn next(&mut self) -> Option { + let first = self.slice.first()?; + let key = (self.f)(first); + + let mut i = 1; + while self.slice.get(i).map_or(false, |t| (self.f)(t) == key) { + i += 1; + } + + let (head, tail) = self.slice.split_at(i); + self.slice = tail; + Some((key, head)) + } +} + +/// Additional methods for [`Range`]. +pub trait RangeExt { + /// Locate a position relative to a range. + /// + /// This can be used for binary searching the range that contains the + /// position as follows: + /// ``` + /// # use typst::util::RangeExt; + /// assert_eq!( + /// [1..2, 2..7, 7..10].binary_search_by(|r| r.locate(5)), + /// Ok(1), + /// ); + /// ``` + fn locate(&self, pos: usize) -> Ordering; +} + +impl RangeExt for Range { + fn locate(&self, pos: usize) -> Ordering { + if pos < self.start { + Ordering::Greater + } else if pos < self.end { + Ordering::Equal + } else { + Ordering::Less + } + } +} diff --git a/tests/ref/full/coma.png b/tests/ref/full/coma.png index 0949e271e05776fc0173ce6ad403594c1ecffe0f..2d067364a6b50e68496fabd2580dd4d54a745f70 100644 GIT binary patch delta 41316 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

hX3~*f_g%z25VHhx;S`x7ZG3Ke@qkslD+mfMBEf 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

d(EC-h z=3H=NBw^YfBN5K4v=qT$E0E}iAg%J(bZjo&<%1b38SCMnS9AXVkm8rmSPrizswC9q zS#bUk75;VnF`wi|(#q!gJGQd;-y2tpMlAsf%D3Kh9f+7b$0cPm^=2mNaj+}!Vfklt zN(7pO@G%Q((iQ`#ebGh10s87L;&jV$FP6fM~;>0&$*m44e4q5$>uV z8LR0@_RaGWlYVuD|82bd_ZD1WC4F<(Bm08)&WjHPd_F|Qw+^K%-tnqPRQ#xMXWZFT zMr`NkUdpxRDJ!o+P=y7BIsSyk1=ndM4p3e^#&)Wwa^iaG8fxbx6=WNiY6kWUc9L?g zLXUAEG&vyj?&fUa-Pf7F6|KOTg!D}}rnCa|#1pyxFRnVy&dvZ*0Z5<{yGNCv$gDq| zmX!3dF!nYcOSW0Om^re(Im(Yeu|MSZeU}QXkFhB?ADr1M_)~%*yXl|@jIxrow$EQ} z5(B*fPq0UHrs4!}{3)F=6-ZNF5hdp!wQ+~m8ts(tV2mzuQ>`9U0ymXd{%4f@fTqey zK^&}f0v{t~=2$S8%%^=>^v?kS%*o}bfd^|orp`VFD8=VMnktWHKJ@0*vz@O(>LiE* zsmH&#?^yuNtW!PvC7y@V2ZnRY#$GeWPGD-~_dwnvXa^MMPXJ z;sDH&#@#3|T6^O9ik{8W)Xas{pCsd*DcMb(q4B%!So)O0%8HmoXk{_?(v*NRz^&nn z*H!rj1xcH5OGe9~)7s@PB`aA$)vF0SScB5pnfxFaq%qyr%+N z+W>*QSbI{Yopar|z3f_jAB;BOVRjBXvB>GZuPS*k++Vpl=Xe#ROQ=$sE5bQ0||-l{JR5d|FYs{X_xInS-Aa#Ay%u(_4^vCa_bWl z_mThSm%IXZq0{E!ow9(RS_JcQn7e5IcQ3#fw|ntG;yh?)=exR={>nlj0j@u!%Yda< zRVd&*^yxk&+;$dr`2Z#dVU7_^J9b6N(X;x`8aX$ET7B2wb|@5ftMmRd0E(bo`2;XU~?74BzJx`I;&^>cdl8mS^JKI4&P z;99@t&vO&>YaQEj({u&)<`0p<_5u>SsIp#DbLYRgX0`7-z~)D zJ`&+8!lCqk4lV2t8L2$%r{Og!i)XYg=#T8*0;JZm`t+{GjZ?)F#s3F1e znqTpT*F`ez)e_R&VYY7h$JMu_V#(iZ2UEiXX?Ys97Prq3gOT?yT+2a8% zY~sAg*=odKdpb9^|B~3;#YIV?mVLwVKnirahct&;98u*K*#18STh0fAC9ak|MD0JV zneupEpKmzKlp8G}e2c|kJ@VicON6ktnFfmu{b6yZ<%JfJ63>XuX^kA47WAMl+IzpE z@pPA#3`!!u-5RSR?%73Q(X>K+@O(Qzi&0cWme%)pL;S41#%B5gF?_)oSPWnU4qbLX z*kdaDGxI*XLuI{v9E$p=zPV7Yrb~Cqt0!GeS780>cPsmq#m`r@5Qp*R#o}Apv3?ih z8NlsLLSop9Ik1=!bDi;_A>YPn2ftsk(Ai+T>Dm<7>?dG%8n&Dq8hX~+&o(;~Ic%RI z9niZL5|??A1kBJR7%jNc2#0l zdJc7)^NpnqYg?CEec^YJa61w7)sc$uR(4|Zu9^9N=-|m8FtpP_tine;j@UKh5?PB=FRlCar9`)O%m$l|81o7l(;Onvy0wBL z8Uu^{de=UF3oZMLKTKzX3oSt+Ca%D~gZ6T!J3`{xgSRQe<5vinV?kYhFitRVwQTLY^if4{xTMDKPl~J#T&z}(@U}a&jw>ep>Y%Zjegz;kb~aNS7?w#>}*0Kv!A z^t+9~cT=jH#=E$~dt*e305uXU?lLMvCU)4vz(+)9s`&3|u{NF^G+)lj`nfF4lTASr zgS};F3;h-OgQ@OX30Ve?gvWKKb2bv_^I>2>!27oawdcT<*e^K${uYNcwoo1B3o(aT zq%S$`t+{&euJp?2;uGgGsIalCS{5ZXGMcIuKkN8b`audI~9rF0TOzsvg!VG z-D#-!Vq)7FF@BM;ZsIPEx*~mKMgRQ$&mV(=OII~zz8v685!Fe#^tWr+ci*{4t8B5> zfp$+Co8sTBVnA>1M(y>*G7`~T>Zo(1hlz`|20Si(XpcIjNq-!^G1d30_en<6YK(&T z-&O*|rVLk%U%SxyR}=By9|=;S>vL#Wys=I2Hgh05KW6%IEmzD^Py!luj=bJP)Pow@ zp;zy^J}7aykX0+uU^o8Jvvfg6b$7OEW6q`wb(q+aD#w_8%Mo8>w_E~!B!T`#*3xrg z1V$n;WmKEfZ4WsPQWa+BWu%EL>D8a08liEob;;8CWTO2R^fev?!ZtfrS$Ma+J)76j z0JW_JZA#HzoDV|?n`ut)OffhW)}waR1GnJRhZd&&(CW^=Prw5>><_m0d*83FSI=K^ zTesF8#3^*Sr2<`iHHnBe==5C1GyFRZp{6a;J=fa_BorAQ!0uvRjYq-1_a^HI%Max7 zv;8`#ZQgljV$uQ=$x9M7*R%S%R*c4D)-?zaTGwla*EzGDO`ufuZybSq?|@JB`~|oW zIEP^h4EyqPYom5R++%#&p?)4*#;~;U_u-|(+XIPKvD%);b35&rV2bovWss%u%y!`) zQZT$2J8Rkyo3wWACuJ^s9C-W!!mJa!yRFw|st9z_GHqb1O!IfD0gYJh_0E`UO;hNF z&440MQoDG839d5FL7M@;jS^7cFzdbKu@Vk;HU=40zHmEO@*XsC_gR_BAS**5ggk%B zf;?4w{>RQcJukW^-(xje7Q|>}%VlGWcPpO3V^pN`JmlEjydic_|I;7Ok`9(j0Tx^C z4R~W6T-kCK_*7|F?v}gPECjo}y zE=O5NfjzMw;V*mNmRpVIf<^K>jLqO{%p+_0+leXu!@@i4`?N26`Y=VF6i+r{vvmiSvFFv~5_HA!K$kOK+g%>$=Belm55e zxe-qNb>lZ%l8gUF2ISZN>AoS@7a*_TOI-aXR(`%*J+ABx9;PKDjQJ6GV7Z~bSf_?( z9kkagXNk#HRpOq5g-82WCje2}FZHMG_x7#+_;^c2>|}z=?+>0cx?BpZ^BNa)-nfK< z_Ss77{9n?W5`mC5oj-4Pj!Xw&UD@y`0IJ__!~8u|l0aO}8U;uDTe#ab{#{&eF_19X zuh(cey=?K>T;FiBLwdiH;84m9Qhrp{xZkido^f4W56!5`Qjv&HuT*c2?b47MWF zd|Fc`2FilrHAo%X8fAT^5KpA|#ZwNY9yN>)b=^@XzgTGLYKw*;V)^@15k#r?#mBNG zr}K@{<{wvkg7(cEUAMVYp1>b4bX((bTGB|ZpEyv8-N1= z%7j;^wJpB0{RX6SGKf7phpccMZEFC3D75^440z|D8_g&4pp*^qqbp5R3V^cEFj~~* zh-_+NFe771bR&;)%GS$|ZQT69_pM?AWP|IDUF|~dRB$uMqF$&SLug27V|Sq_gEHW8 z-QQoKgM(ds5zf06-D3@b>?|Po!&q__g^DxLsGSpDCy(Eor%FqWs4rtROM+VVzFQZe z_MR8lY0#yc^BO7LgV`#JVSr8%V1bgPN`h&;HlKA<9sP-f^oYjqin#4Q|Mi*S?n&&> zt0!sFz@zUCCWO+9y)SO4mtSW9WO{`V^Cs9u*1Mk-BFzWO5bl@ph7HT~{BGWhX2ekacJMbAH>hKeZ z2NXy8=f@*bIlL~QqEMXdfgDA1K6akca!v_8{(rZ{@ReY_#ru+Lu=f^$y`K-FD$vHy zZxMMIcRuOva8;k4A&aeT4EDoWp;mL>E}`!dB+DRH4xwALSl6`xpHWRgr*Ip<&Xu4R zZ&|c2;Q(40wRct?xB3x_=Bq{JP0;^7o@s&51khh8=jQ^r4qoFaZu|4EE+6pxi)=D~ zvCA{xqp6Jkf$5{<$c0(MPOwI^5^qsUT%NrOBQ#5YBHZsa%8JsNJ{7Q?`7H}U$Fi1= zWqv0`=-uJ#Vu;Ig#wa+=b3Lij!Qc5}EAL>oD)A!d*#dNt^izRt_&H`grsH>MQZLqn%GJhZ-nTfTy>vQeG{gD$48A;+9BZ>G-PRp>1yJ&3_^w_ zE=D71oOjqX3u@QBd8BNhrP@9E+7h_x*S=*hJQDrWL0sn1$@YH0 z#^5M9FT*c+iplifn_0`T{on1RZw!M5F)A;w?7Wp&BwcqE2h+C&6bbv8lol*&k-#>&ITUKL7+!h7?qO%Sj-*?4^Ln=g`R2sUdf&i2g=xA6XLqQQcqz7(?{L=YdF<9&ZgR|B2%#PLv9lVjq_wgo?VyC5z z```C)C`duMNr(rH!sQyJ-{+4r02!E$mzF4a)dPsL3SbGF4kmrH*e?hxr!sZC6mjlJ z7fUqs6Nw)4$4bnW8?_(mxudU97O9S1 z;JF7WWPs>ReXf8Z-a)=UrJ1R{s1Q-!GabE9JZhp{5_Es(S05}B@c8f5h6EY{h?Sh< zthj1uuEGS1Etv54@wf_foJAX7d({m{keq&fQ1Ld*FNeufA z?C5*co=HfwEJDBVY_`ciqq<5G9TuFqYfonZ00784Ed6jZD-y9?SOgjv3C=G1)pzC2 z8$%jJnwhegNLPVG_NoI!Qm!II_B|GM41y1v0FDK~_)=RT@EC9iQA|eTN4hP|rF7#) zTnLAw6%(~`ew(SL>yt8BV!yM-CEtVQv&x2^>QMtX&!0c|r}d7&x0`cJC2RV5=K%ad zx7m~uAwWY*7}P%^hd}{KDFPK;*cF%%`3%hhGy_SLlM=yQ_Rh+F+f&pM-Ie?ewxX_= z{6-bvtJViov|WK3*dL45=QVuG3E+=FOk=a6*#^+bbrvmn!CElw{_`QgL46P9Z1~L5 zfDLqE2~nyKb~7a2_jg@N@J`R>+MLX8ES~RBdw09m&L~G@MuNC~`^^^uIK}`psfwdA zn!>FK9J+{$$ufEClC0t9D`AeDdw^=YKIB3Z<@l~pE_t-y7c9reQN^U_M>LD414)AD zd$%eKFHtJAv!?^n4=)$J4}7N^7lTMqp9Gsg{jvYa`P)>c(qReF&(%WJXie=lV}uDp zW+tH@DgZC8K#>v#0=F)If(~Kef>9b%St@Spp6#aAZ&=ICa1|FAqC3Q5-LP6Q8CQ|i zg=&L=_8hzbN4)n76I+O`ef`=n`f7N2`M{%F#J*uGx0e;Y*z671ITuD6p{w8REq}rt zxc^|&eEjntqYo*QR-NoihOyGg0BJAfo2m$eRtZnzOveD&P$|)De>o^i1vz%)iJuh2R~T&9 zf>vL5@sRYm4P2f649=vE4=Pdnm~zQUvq)*&gihl8^?(%H?%guP#kOGcmQtmi`FgrH zvt8xwB>VM^4a|={L_r_`YR2hT$dl6QKtRxeoS;Ay`8-E0Bt*8S8nlHy+`Ee{wSRtw zN0kE%0igl$;Csa8`h(|hmmq>J<)e_{-!`&3JLV*88lT^-1U^4+{YFaDJI-@@i zLn%ErC*tof@SI63FEjpjJW2Q77ZS#%zyfwO%&{LWFd$a9%6!me&S*GY%<$?LS+vLM zXNHKsAO=v^B7Vccrxz6B<^x}cIS!)RXG;*onHZpCa8js+>GD@epO~6~FZ~%< zZa1d;*7>YNauZ%c4k^A)ShBQ1k3Eh@WdXm(c>5!eZCmnLl3<#<8XXzy5=^VXn{htS zCs)GH>UZ96nEt*E$1?lC_rROhDCi%vxniB#qt@HyBR@@dJaU-Fii7E;KHDr5spR#Hn#i|Y3sJM%~1UeZV3 z@zYv;Z~GbDTs`%b8c#4Il#|^!=-PE4iB~r5{`N!xuiNfhfm;ExOiWDoX++=puHL+P zvySq0^ylzL{PK2=W1vFFghHgx#{c8L7sCE}cRE`giqtdE(_x!Gl-W&~d#%&2Z!3V@ z9L<^(%Je*1&&OMvDybw1UI(Sj zY+>Q!vnj$)DB_FWt_zd?uBNTl2jIfV?yPzmh1c1BGlcg0els?=NA$*i>`D*IEkOIn z67)X4@i~^eR}l+Uq=73U=oK5#tA2w$cDk4P*5}Wgv1h&X(BWWO=)?=#zd>1XQ-=}r z^Yh@l74Uv)X+h6an1tZ=xtt%aNe0|Kzqr7qOBS$uL`tgp=8g0_(GrhV8>d4&uBLB@ zYz|%c)nPwZ2(F7HJzn$dVWk^m$EVH%g3u+1dv=>uFdRWuCT|lIs7u;quRPrN@^=&a zvuBQfe=l!0L8G}!lv-MS{{H@;VOL>!23`BSeDC@sCoDW11&VF1V$vaaDHFIG5a(*c?LTibm(r7!%}SC~mj~)Eh^Iq{^zETJ0hE1D9r1(Ig9Qe?UT# zQyK^R{Nu+DaQr|)K$=(H9!wx;eTzaqeSO;>H}-Np#UTt;dk7bkpk|u44R(r|R9lmfLb#M^fKkgKYg_A(NByQdfJCQhhk_H#4Q_^0LCz=B6 z$W)o3A@=gd#@TMw@cPcP;`Q_ME7B~X_we#ui`UX~%_sbYIaPZ4^tto8 z;_KJ1(}Z0E38_Wg!otE#BX9B6L0%`@64!qSCe=Y4C-YiF#5wIum2}zH=HSrj)L5I< z=-|*4-U(snbN(goAD!NCVUbj~(eLgSRERck_EOQjahaQ}@bYC>M+otx)hbw)eGoS1 zdC9{6UvJkL*3`CbEyn|jBBI0s=m`iIs&qp=A~i}05ReuG31C!uN7xoXihxLobfqP9 zA#gy7QS3lKkVuy!NN>^wDQ|M_zx&&S~U%h zZmo4PN_>~NAhX?HQ#D}(Z@?&w4i6u~nnXlJAsqYm8K<+Jdpen06g~AbSAR#sOXxa0 zO~wQ=JX$Q&qb(V~8rp1I_*1Spl)O`KVq^PqnnXP;OMgT)%$)g5HO!~upd>NMOs%@L zI#10wF}S|9d)F=x&(-txK5y0K4bzP775zTgtloqIR-W zBr7W`JUrZynUXkBNvuD4`Ngg0Z|7I*SH4cJZ`lTn3pM=iDi{|^jLFOJHXs~4o#FLi zU{(u->Ne-=9a(oa+j&*Rk&>D^sWLpnGPiZlh_50wp+*mLzICoV>(X~F`@JUEYH6c& zc~t5O`+m8TN6w!=|6B7E4s{2M9564oM6Q{}KMV~G1;aq$BqqbG>4=jbZ-n^bJTsqN z(6F*d)h1w1MLo?K_kG{c-lTZF_in;#BQ=D)Jw!jOD_@)sBtG z4DK*8L$rI3`FdI{%H3n&jn2ky^nscRprtjp8PSF zO6BbrvaE2%j|>*OybEU22tO=hz@-q+D{UXrW@G<3ubpuzC*c&bUN-0FJ}zhfyA%wg zfm-xl*?H5Z?gtlhPbGQ0YGWd&%WKXgeu&}2mM^|G&WMOrJbBcn)-}j!)mW_V=$Pa-@k=H zfy*<~l{?2I=YYR$p9au(JT{8dlyvBy;qvl0+fDwSpCqk}%GlVtT9Vqz=SG}Lw0L-- z`I4lva_?$_jQ_mDsLoK48R4m(1tVBhT2>ij8?;1#NT5jC%r7jYpW;7v<@Vf@v2MD^ zPFX}5lbx0I;N)TN$u9>EZoOS?lX`J^Y@O$Y+qYfP_b726G(@ywvZ{O}+*?SLw=Q7U z`l$>zv;AVYx7btGW6QGxj>$ScSg^=-YCWkAb-B5r_fUhX^F)b-JnOyzk(Q(4HTKZ6 zRQ_7uPbf312Cx52VHLs(Njqg(<-)%ck*$3sU=0B7)k4bjcXYnwwYa&#SPopoj~ZV$ zRGIs2=e;U;5sESs9@eY1Xd2RaEQY0NX7)v2vEQpcKKhEMlug2>`(T4$tcty<``vEr z!NwYakaNB>d~J8P&(vvZV2G(lsiw{Iy0?cWc)(B(XOaPR-j3wf7!4zL(nT7QBJO4f z99IqSTIE*)m>LWrLmpv@6YIL(zaNd=y%xP!svdt+x0+=AX7Hg~(-=R8%zSxx5~{tu z9k#-$lf5guv_%oO(5Uc|_WNedUDrFn$?yT7EB0tAVuIR z{=Rv-{L{r7H;Q6oV-YU<@%CKK`-1W-6H1dAhFOZYxa;kDS6^d8-!|dY)GE-Y`{tKR zgtRzatW(kxWS%(`QUNbx;S5<>&&~DKpo<|PA!$n91vJ{&WGMrs@$=_TJ|(a4+sWw( z7b%j2k4)g_u#;~~x-#gi)fYj(pqv{I7%L_&-rU%TklS-2xa`+|&TXT@K7CrmGgwEk zaUceRf!sr|Z3p%?;7G^vaaJ~z!pfKuJg^N&k~s4}LS094NdVisat27*=)emhy& z+WwN3nuBUTudKFC^*yI^*}uHKGvokKTY$sngGlBrWA?V^o}-hh_`L7d{Pb+U!B=sn z!c8fO3A~CfrsLz#{ZO)E-JP8i8C*)N4^OkuOJ#m}a(*}ZO_bCNzxvS=z32DZK_1Dl z_!uXsvkz_g*A4%Ak;d=e9lUF&5GXeYc>ECNwivU6L`ptk=HcO?mBE-Cl$O7)Aap-+ z($S&Pl6B4D-Gk#i{=q&zJ^Ye%0TIXRgxy5^Xkx(9s?F$G5)7kXV8`Sh8) zdpJbb6pddjv?!BR2NK21!v*T@X`&n{NlAH0SjN&9tHh1o6`W5|dZ6>Y3m(aG9QR+( zL1N@UD|w9>bu$ot_24?C)ziYl+!yI*gUMg=O{nDzX-Q%ojcjI=*kD>tr}HY@I1@59 zz(7b_3g^yUzS#@=7DouFM8j>Is(PVI029K#Z(qUG0IKvL{pf@K=Vwm$mCK@&+)~~| z@`!b8{&`f2STr?&!~9wt7YrHe$UnT2tuG)gjkh`U^`QS~dgEp>-l){?iK?)0Sp1QW zAmq@YL*yqxL+_$Bk7Pg)&}EWNbQD|pj<%!|{L^_vd}yJz1)szVqL_{gD=SAe>K5BC z!U1qX@|(UxxEfj)My=&zA^o8>A49%eXXy$jLRNEXn%$IQTUuLLO8dFC#C9(K_2_9W)^h}*)gSDuOtY{N=9P1H%U1jo zFXYschQHvOd22qxis%Mb8d-TTJe+;k)J-7{ZWqRekMBl@DRs`uwVuE}2TWM@6Q?0M zF0`ArFdlwL@E^kE)fsmG?PPXoZvBgFzw#padwXWT<}H&~mX<&T(`$*JyDsVO=R5bX zDTjhUuoc2fSTZq5KIfiQQ*B-26>&B&{`I%VGNee+CnF`DriXbZI!g@+`}~eXh&OA8 zg@qO1LPQKRyk^B**CcTINzCR}bo*BUDccuCEyn;3+-Ak7d3gnTRf(eB5u)Y2)4SO? z>)Hs@opUgb9OxM+xzFeX#>2%YClOxW$&p=Bpis!=Q?O*inNGcf_nQ%n0Z#%Z_>D}-^2p80p z?^3^BXxv*%`Im(Ff{_dGILGJuVl~f_l@ULbkN*LpT|Ygpgh*1hH;gYUDU8S~& zI$E={#71>ZJ9!VbboTNwz*YJ2BX?G4u8a*cc08aQjGo_O^i1un8v2duO5bY-i`HOY z8CllHEht;3>I^so`JV{(x^+th&O%=ZV@Cs3`qt*Fhr^M9uGJQN+R*}`h}zm*VT5vl zg{P0h%`XN{>#IB!ZbI^gWx_@=WI}ChY-^DPU1fs^8);3*V6U~GhDi$VcVPesg>V7< ztti@oKAlORcd#>o7?c3zJK~7C|snKJf zgRY~%g&+}~6861S&0UNz12?JKel>u;gT-WDEgWQiS_VIsTeWI^=9v-5wf^fyvL$O~+WqLipwIbh9rmi9lzed==xJi`Kwlryhmx?Q*>M0~fE2-}^Krfp*?YLd_#S!njtjH;2)D~| zeiv-uQu*=SIlS4oE$0fB0r<_Dc2?ZzHfEQ;(REfb-UV-J+VS)P8(P!N4Vo2S((u_G z8)J)$UP^ByKy2hLqe_xi-?MS@8CCt=(9ke;z?27=Y$pKaY&t@iF44twS_)ohkhtn2 z-Yl83Bai^w<9SDTG!ds2h0*Bq`boKd@m4B8_{a}yYdHVJbr)MHqTlR3sPgj9K!V%;^7-^j@r=7%Nu}}a)X{Z3rVFihofB1InXxTZ)NQ0W^(mk`kcjTLd zaveA!clNbR3^Wv(F+Vd~TdAHd&A^jb`CqLHdypo&?<_G=k&u{BaN80l_qgy^8b+*D zWnusBY1%$+3%}Hb0v}f?c{i=b1in=Gdg6GGFv$XO3`tWn1Of=ifF5T)uqTc1Cr|!Z zqn7`}mB?I+&qp(4KcbnBr7s+)pyuR!(n=J{<->a9q%;zYjIM+YJ$L)2aqss7NC+1P zO8g1p2H677|De8SL(01PO48LwGJ}I#8VwSzQ|kf}it)sPgo+9|`HK#X2^dFg-XlEX zotJ|36s|Y5c=hU)Mz~qAW%2|KjExX3;As+~S?iv|MYas$#{OsUm1J09%y#7#bh1(6 zE&}jfS7q;s1WVTDQYT`YI`NXPeQq^QA7)4|@P)YepqaTAmM=!(W)C|WjMVdV{@x7L zK+~`dpq%aIJVL`@h|mn?VeB216)Hn}p^h>}ixf>3$}+P{xjFTjhC@TX$V^PsvVB^v z>+tO+JQETwb%o534%J%r^_Aj)^{G5B*iSf5MhJoN!urkrenanL%@f1s=V>@R8q5uo zdk!$RioIoe7{g4pV$r7H)nSU4`5v$%3?y{Vj_UdVYKC$F$8sna7X>^el7OBpj-f-w z+H<2UV(~;~t63tcDqZ~&)h5=uKA`f1t$NT}1vd86H@9uui{1U#bk*mpNT-R4yxB%a z+F8517O`d3qMgZw#AIo9Qg02eTf@?_sx`R8;%Uh@xJlR=FowNpRQ_*ulO!o8CB!6xKfY?!u z#pzy3iRbW-Z?7jr`g{k1oR+W3Pps@kLjpv`R81kR*MY*I6YB#s!hsW#-Cu@kX~}XH z!R?x{4$B;Wdi#$(y&u8_F4yPb+l1l=faxM4BA@T%>a9*!4NO!9s|X2c*+e)tKR(Zv zWF~Vl$Aa#t5w19J%Y^c4slZGd*jzsDPNYCwC{_3P(WBIfx^sLn@Ya$&5kjrl+uGt0 zCq~&q6zHug_qYNc3SG9{vy}B^Q=Ito1~BqHj%$nK6Q{4tTL`oOKtfAOC>Otym(kWJ zxNmu)THi_Lr9{{>5PlQrn(G@Ipsn(dy(hpRj7K`brur3t#G@Pgz}eh}RvEL>@nW+|!nR)o{nqE*X>&12JYS+8L$bFY1X;iu*)>tr%RmtC zFZ!1*brebf2?cTl%dBJHS@av|?^CgV!%pY9cTex(hlX@8l{${xHNJK0*5J^P_YFMK zmAoN}NG!SblorlU<#qAD|GeEVC&SphaG#S^hBYg!Y##af>z8YPO{Id@*socJYtFN+ z*v!n#n25WtznyJQZy)8OPw9==wY9ZDWJ)cVY(S}ZvMUQFHL*JlDp#S_sNA>@4fP!v zNu+@Fx%b}Jqnk0!$o0-gGKaenn8i^Y1=iwb0^pkm>nXT|N-b9d$8#yxl{Dy`olpzZ z7s~B>5mb9(M%3i;<;N}uL|-J&6kyfV)W9mYV9tD6Utb4)%Od;+ZgcSvrGr3}3>oXG zyw034GDSs*_g!nx(JN6CC7(=nIq)b@lHWJ+Evhr6zw8g`NgSd-t&bsTYlp!*D&*wR zxCDf!6h(4$OhOC-0Yt7ZQ!1QVGfH|&Ts|E=;_Q?8>al=;b@VsZ6z2wrrKT<2OsuDN zDeC6ex^9A1M{ImoS650ul_t(@Q5`h}^Rs&D@uyEl^_Fsq0rv{U%{F>H6l(I8^AbFU z8xx0pX$ahxC=nSMDaz1t{95o@qA_iC2)?OnoRu}7Iy5vCpOHZ{2{gfB{eJvCFZg3% zYty_GwFK*Q9Tgf9(lI54=?mokBTh@}cte}e>u_h?K&FvG2Ju!ke7 zP>bzR@vumF{&RW%n?|6fS3Mn^fR30)mDtppZDNb_X6?iPvhkaI7PU6?8joVjN)Hwv zS~FGQCfVoyCe+w5TY^Co9hiE{3dm~nR;H=f)w3_1E_b603Z%pCn0UY;s?|M*jQW>n zPFbzl>Q=w?SVX8PUvrJ8|M)vHh9gTShHtz83(XHD-3yrL^emgUa!V5pjk|>->}YY+ zMF=&>nLt@<$iYTN4_z3SBJ=C9jb6Pss~{Y-ND$;qPJSg*@FCkz9og0lz~8-ZwB=sE zMsh6M>R~8Rjp!TvqJ`BvEDT!ueFtntI+5*ShSFbWptuj7OfIir2ry)5ks!aObab`7 zsF1$;&bda)8Ge!_0>C#XU$~zEmQM4b5a{liRKS1t1v`dB)HxwfHvNo{2eo05Gr76B zPX>Je5$rpWb z{!op9K9-(ULDic*a>XKSR4R3wMrdD;EHtc}d&dhEkIGyf{BcNC;bP_`r;|S2w6Ziu z91QF-B&3>>C6 z@kHp~4xEJa_P7HVaoe?2kn7tC6^;6aRuV-k| SRL;V`JM^>+G)pwD-2ESb^#05M delta 41344 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 N002ovPDHLkV1k?F1w8-& diff --git a/tests/ref/text/basic.png b/tests/ref/text/basic.png index aa5d9664c112620cadcafe20e00052f8a8582c31..ef265cbf02b1463f0a460da72be58fecf62c9e0b 100644 GIT binary patch delta 5560 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 W!t-i`^mTy#m70>aV!6C!$bSH|STaih delta 5556 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 UFNWK<0r(fn^6GMxGUlQG1;emNrT_o{ diff --git a/tests/ref/text/bidi.png b/tests/ref/text/bidi.png index 829fba0c00462ecae4ce6f5f0604256690540685..0b7a8c2bd153b33e4b98ee12c08ecbcf088972ff 100644 GIT binary patch delta 13956 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 delta 13828 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 Pixmap { canvas } -fn draw_text(canvas: &mut Pixmap, env: &Env, ts: Transform, shaped: &ShapedText) { - let ttf = env.fonts.face(shaped.face).ttf(); +fn draw_text(canvas: &mut Pixmap, env: &Env, ts: Transform, shaped: &Text) { + let ttf = env.fonts.face(shaped.face_id).ttf(); + let mut x = 0.0; - for (&glyph, &offset) in shaped.glyphs.iter().zip(&shaped.offsets) { + for glyph in &shaped.glyphs { let units_per_em = ttf.units_per_em().unwrap_or(1000); - let x = offset.to_pt() as f32; let s = (shaped.size / units_per_em as f64).to_pt() as f32; - let ts = ts.pre_translate(x, 0.0); + let dx = glyph.x_offset.to_pt() as f32; + let ts = ts.pre_translate(x + dx, 0.0); // Try drawing SVG if present. if let Some(tree) = ttf - .glyph_svg_image(glyph) + .glyph_svg_image(glyph.id) .and_then(|data| std::str::from_utf8(data).ok()) .map(|svg| { let viewbox = format!("viewBox=\"0 0 {0} {0}\" xmlns", units_per_em); @@ -445,19 +446,19 @@ fn draw_text(canvas: &mut Pixmap, env: &Env, ts: Transform, shaped: &ShapedText) } } } - - continue; + } else { + // Otherwise, draw normal outline. + let mut builder = WrappedPathBuilder(tiny_skia::PathBuilder::new()); + if ttf.outline_glyph(glyph.id, &mut builder).is_some() { + let path = builder.0.finish().unwrap(); + let ts = ts.pre_scale(s, -s); + let mut paint = convert_typst_fill(shaped.color); + paint.anti_alias = true; + canvas.fill_path(&path, &paint, FillRule::default(), ts, None); + } } - // Otherwise, draw normal outline. - let mut builder = WrappedPathBuilder(tiny_skia::PathBuilder::new()); - if ttf.outline_glyph(glyph, &mut builder).is_some() { - let path = builder.0.finish().unwrap(); - let ts = ts.pre_scale(s, -s); - let mut paint = convert_typst_fill(shaped.color); - paint.anti_alias = true; - canvas.fill_path(&path, &paint, FillRule::default(), ts, None); - } + x += glyph.x_advance.to_pt() as f32; } }