summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend_cairo/text.rs9
-rw-r--r--src/backend_qt/text.rs2
-rw-r--r--src/backend_utils/text.rs16
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(),
});
}