diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend_cairo/text.rs | 9 | ||||
-rw-r--r-- | src/backend_qt/text.rs | 2 | ||||
-rw-r--r-- | src/backend_utils/text.rs | 16 |
3 files changed, 17 insertions, 10 deletions
diff --git a/src/backend_cairo/text.rs b/src/backend_cairo/text.rs index 63b3e32..0abab83 100644 --- a/src/backend_cairo/text.rs +++ b/src/backend_cairo/text.rs @@ -115,9 +115,6 @@ fn draw_block( let fm = context.get_metrics(&block.font, None).unwrap(); - let mut layout_iter = layout.get_iter().unwrap(); - let baseline_offset = layout_iter.get_baseline().scale(); - let bbox = block.bbox; // Contains only characters path bounding box, @@ -129,7 +126,7 @@ fn draw_block( let old_ts = cr.get_matrix(); if !block.rotate.is_fuzzy_zero() { let mut ts = usvg::Transform::default(); - ts.rotate_at(block.rotate, bbox.x, bbox.y + baseline_offset); + ts.rotate_at(block.rotate, bbox.x, bbox.y + block.font_ascent); cr.transform(ts.to_native()); } @@ -137,7 +134,7 @@ fn draw_block( // // Should be drawn before/under text. if let Some(ref style) = block.decoration.underline { - line_rect.y = bbox.y + baseline_offset - fm.get_underline_position().scale(); + line_rect.y = bbox.y + block.font_ascent - fm.get_underline_position().scale(); draw_line(tree, line_rect, &style.fill, &style.stroke, opt, cr); } @@ -166,7 +163,7 @@ fn draw_block( // // Should be drawn after/over text. if let Some(ref style) = block.decoration.line_through { - line_rect.y = bbox.y + baseline_offset - fm.get_strikethrough_position().scale(); + line_rect.y = bbox.y + block.font_ascent - fm.get_strikethrough_position().scale(); line_rect.height = fm.get_strikethrough_thickness().scale(); draw_line(tree, line_rect, &style.fill, &style.stroke, opt, cr); } diff --git a/src/backend_qt/text.rs b/src/backend_qt/text.rs index c808fb5..f0764a8 100644 --- a/src/backend_qt/text.rs +++ b/src/backend_qt/text.rs @@ -77,7 +77,7 @@ fn draw_block( if !block.rotate.is_fuzzy_zero() { let mut ts = usvg::Transform::default(); - ts.rotate_at(block.rotate, bbox.x, bbox.y + font_metrics.ascent()); + ts.rotate_at(block.rotate, bbox.x, bbox.y + block.font_ascent); p.apply_transform(&ts.to_native()); } diff --git a/src/backend_utils/text.rs b/src/backend_utils/text.rs index 6c80802..f1ee8d7 100644 --- a/src/backend_utils/text.rs +++ b/src/backend_utils/text.rs @@ -114,14 +114,24 @@ pub fn prepare_blocks<Font>( x = new_w; } else { + let baseline_shift = match tspan.baseline_shift { + usvg::BaselineShift::Baseline => 0.0, + usvg::BaselineShift::Subscript => font_metrics.height() / 2.0, + usvg::BaselineShift::Superscript => -font_metrics.height() / 2.0, + usvg::BaselineShift::Percent(n) => -font_metrics.height() * (n / 100.0), + usvg::BaselineShift::Number(n) => -n, + }; + + let font_ascent = font_metrics.ascent(); let width = font_metrics.width(c); - let yy = y - font_metrics.ascent(); + let yy = y - font_ascent + baseline_shift; let height = font_metrics.height(); let bbox = Rect { x, y: yy, width, height }; x += width; + // TODO: rewrite, explain let rotate = match text_kind.rotate { - Some(ref list) => { list[blocks.len()] } + Some(ref list) => list[blocks.len()], None => 0.0, }; @@ -133,7 +143,7 @@ pub fn prepare_blocks<Font>( fill: tspan.fill.clone(), stroke: tspan.stroke.clone(), font: font_metrics.font(), - font_ascent: font_metrics.ascent(), + font_ascent, decoration: tspan.decoration.clone(), }); } |