From 8bce1b60ed64a0815f959f9444213bc81dbaa900 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Thu, 13 Sep 2012 19:37:57 -0700 Subject: [PATCH] Precalculate the size of TextRuns --- src/servo/text/text_run.rs | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/src/servo/text/text_run.rs b/src/servo/text/text_run.rs index 1f7acc1bfe3..b9988a23d70 100644 --- a/src/servo/text/text_run.rs +++ b/src/servo/text/text_run.rs @@ -9,29 +9,36 @@ use shaper::shape_text; #[doc="A single, unbroken line of text."] struct TextRun { - glyphs: ~[Glyph], + priv glyphs: ~[Glyph], + priv size_: Size2D, } impl TextRun { - fn size() -> Size2D { - let height = px_to_au(20); - let pen_start_x = px_to_au(0); - let pen_start_y = height; - let pen_start = Point2D(pen_start_x, pen_start_y); - let pen_end = self.glyphs.foldl(pen_start, |cur, glyph| { - Point2D(cur.x.add(glyph.pos.offset.x).add(glyph.pos.advance.x), - cur.y.add(glyph.pos.offset.y).add(glyph.pos.advance.y)) - }); - return Size2D(pen_end.x, pen_end.y); - } + fn size() -> Size2D { self.size_ } } fn TextRun(font: Font, text: ~str) -> TextRun { + let glyphs = shape_text(&font, text); + let size = glyph_run_size(glyphs); + TextRun { - glyphs : shape_text(&font, text) + size_: size, + glyphs: shape_text(&font, text) } } +fn glyph_run_size(glyphs: &[Glyph]) -> Size2D { + let height = px_to_au(20); + let pen_start_x = px_to_au(0); + let pen_start_y = height; + let pen_start = Point2D(pen_start_x, pen_start_y); + let pen_end = glyphs.foldl(pen_start, |cur, glyph| { + Point2D(cur.x.add(glyph.pos.offset.x).add(glyph.pos.advance.x), + cur.y.add(glyph.pos.offset.y).add(glyph.pos.advance.y)) + }); + return Size2D(pen_end.x, pen_end.y); +} + fn should_calculate_the_total_size() { #[test]; #[ignore(cfg(target_os = "macos"))];