Add an initial implementation of canvas `measureText`
This commit is contained in:
parent
ce127caf76
commit
8d078ff345
|
@ -61,6 +61,8 @@ impl CanvasRenderingContext2D {
|
||||||
self.scene
|
self.scene
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Drawing rectangles
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn fill_rect(&mut self, rect: RectF) {
|
pub fn fill_rect(&mut self, rect: RectF) {
|
||||||
let mut path = Path2D::new();
|
let mut path = Path2D::new();
|
||||||
|
@ -75,6 +77,8 @@ impl CanvasRenderingContext2D {
|
||||||
self.stroke_path(path);
|
self.stroke_path(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Drawing text
|
||||||
|
|
||||||
pub fn fill_text(&mut self, string: &str, position: Point2DF) {
|
pub fn fill_text(&mut self, string: &str, position: Point2DF) {
|
||||||
// TODO(pcwalton): Report errors.
|
// TODO(pcwalton): Report errors.
|
||||||
let paint_id = self.scene.push_paint(&self.current_state.fill_paint);
|
let paint_id = self.scene.push_paint(&self.current_state.fill_paint);
|
||||||
|
@ -103,6 +107,23 @@ impl CanvasRenderingContext2D {
|
||||||
paint_id));
|
paint_id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn measure_text(&self, string: &str) -> TextMetrics {
|
||||||
|
let layout = skribo::layout(&TextStyle { size: self.current_state.font_size },
|
||||||
|
&self.current_state.font_collection,
|
||||||
|
string);
|
||||||
|
let width = match layout.glyphs.last() {
|
||||||
|
None => 0.0,
|
||||||
|
Some(last_glyph) => {
|
||||||
|
let glyph_id = last_glyph.glyph_id;
|
||||||
|
let font_metrics = last_glyph.font.font.metrics();
|
||||||
|
let glyph_rect = last_glyph.font.font.typographic_bounds(glyph_id).unwrap();
|
||||||
|
let scale_factor = layout.size / font_metrics.units_per_em as f32;
|
||||||
|
last_glyph.offset.x + glyph_rect.max_x() * scale_factor
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TextMetrics { width }
|
||||||
|
}
|
||||||
|
|
||||||
// Line styles
|
// Line styles
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
|
@ -319,6 +340,12 @@ impl FillStyle {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(pcwalton): Support other fields.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
pub struct TextMetrics {
|
||||||
|
pub width: f32,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub struct CanvasFontContext {
|
pub struct CanvasFontContext {
|
||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
|
|
Loading…
Reference in New Issue