diff --git a/Cargo.lock b/Cargo.lock index e4e4672dfe6..e9f5a3a40e3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -544,6 +544,7 @@ dependencies = [ "log", "lyon_geom 0.14.1", "num-traits", + "pathfinder_geometry", "pixels", "raqote", "servo_arc", diff --git a/components/canvas/Cargo.toml b/components/canvas/Cargo.toml index 7e3267148e6..b841082918c 100644 --- a/components/canvas/Cargo.toml +++ b/components/canvas/Cargo.toml @@ -31,6 +31,7 @@ ipc-channel = "0.14" log = "0.4" lyon_geom = "0.14" num-traits = "0.2" +pathfinder_geometry = "0.5" pixels = { path = "../pixels" } raqote = { version = "0.8", features = ["text"] } servo_arc = { path = "../servo_arc" } diff --git a/components/canvas/raqote_backend.rs b/components/canvas/raqote_backend.rs index 5f39a1260b3..1ef1bc54dab 100644 --- a/components/canvas/raqote_backend.rs +++ b/components/canvas/raqote_backend.rs @@ -527,11 +527,33 @@ impl GenericDrawTarget for raqote::DrawTarget { pattern: &canvas_data::Pattern, options: &DrawOptions, ) { - self.draw_text( + let mut start = pathfinder_geometry::vector::vec2f(start.x, start.y); + let mut ids = Vec::new(); + let mut positions = Vec::new(); + for c in text.chars() { + let id = match font.glyph_for_char(c) { + Some(id) => id, + None => { + warn!("Skipping non-existent glyph {}", c); + continue; + }, + }; + ids.push(id); + positions.push(Point2D::new(start.x(), start.y())); + let advance = match font.advance(id) { + Ok(advance) => advance, + Err(e) => { + warn!("Skipping glyph {} with missing advance: {:?}", c, e); + continue; + }, + }; + start += advance * point_size / 24. / 96.; + } + self.draw_glyphs( font, point_size, - text, - start, + &ids, + &positions, &pattern.source(), options.as_raqote(), );