diff options
Diffstat (limited to '')
| -rw-r--r-- | wgpu/src/backend.rs | 13 | ||||
| -rw-r--r-- | wgpu/src/geometry.rs | 1 | ||||
| -rw-r--r-- | wgpu/src/layer.rs | 3 | ||||
| -rw-r--r-- | wgpu/src/layer/text.rs | 5 | ||||
| -rw-r--r-- | wgpu/src/text.rs | 28 | 
5 files changed, 41 insertions, 9 deletions
diff --git a/wgpu/src/backend.rs b/wgpu/src/backend.rs index 6b847aff..def80a81 100644 --- a/wgpu/src/backend.rs +++ b/wgpu/src/backend.rs @@ -352,18 +352,26 @@ impl backend::Text for Backend {          &self,          contents: &str,          size: f32, +        line_height: core::text::LineHeight,          font: Font,          bounds: Size,          shaping: core::text::Shaping,      ) -> (f32, f32) { -        self.text_pipeline -            .measure(contents, size, font, bounds, shaping) +        self.text_pipeline.measure( +            contents, +            size, +            line_height, +            font, +            bounds, +            shaping, +        )      }      fn hit_test(          &self,          contents: &str,          size: f32, +        line_height: core::text::LineHeight,          font: Font,          bounds: Size,          shaping: core::text::Shaping, @@ -373,6 +381,7 @@ impl backend::Text for Backend {          self.text_pipeline.hit_test(              contents,              size, +            line_height,              font,              bounds,              shaping, diff --git a/wgpu/src/geometry.rs b/wgpu/src/geometry.rs index f6397ab7..8cfed1e5 100644 --- a/wgpu/src/geometry.rs +++ b/wgpu/src/geometry.rs @@ -331,6 +331,7 @@ impl Frame {              },              color: text.color,              size: text.size, +            line_height: text.line_height,              font: text.font,              horizontal_alignment: text.horizontal_alignment,              vertical_alignment: text.vertical_alignment, diff --git a/wgpu/src/layer.rs b/wgpu/src/layer.rs index b9fd044e..dcae0648 100644 --- a/wgpu/src/layer.rs +++ b/wgpu/src/layer.rs @@ -62,6 +62,7 @@ impl<'a> Layer<'a> {                  ),                  color: Color::new(0.9, 0.9, 0.9, 1.0),                  size: 20.0, +                line_height: core::text::LineHeight::Relative(1.2),                  font: Font::MONOSPACE,                  horizontal_alignment: alignment::Horizontal::Left,                  vertical_alignment: alignment::Vertical::Top, @@ -114,6 +115,7 @@ impl<'a> Layer<'a> {                  content,                  bounds,                  size, +                line_height,                  color,                  font,                  horizontal_alignment, @@ -126,6 +128,7 @@ impl<'a> Layer<'a> {                      content,                      bounds: *bounds + translation,                      size: *size, +                    line_height: *line_height,                      color: *color,                      font: *font,                      horizontal_alignment: *horizontal_alignment, diff --git a/wgpu/src/layer/text.rs b/wgpu/src/layer/text.rs index 665f7188..ba1bdca8 100644 --- a/wgpu/src/layer/text.rs +++ b/wgpu/src/layer/text.rs @@ -14,9 +14,12 @@ pub struct Text<'a> {      /// The color of the [`Text`], in __linear RGB_.      pub color: Color, -    /// The size of the [`Text`]. +    /// The size of the [`Text`] in logical pixels.      pub size: f32, +    /// The line height of the [`Text`]. +    pub line_height: text::LineHeight, +      /// The font of the [`Text`].      pub font: Font, diff --git a/wgpu/src/text.rs b/wgpu/src/text.rs index ad7bdc8d..ff68772d 100644 --- a/wgpu/src/text.rs +++ b/wgpu/src/text.rs @@ -1,7 +1,7 @@  use crate::core::alignment;  use crate::core::font::{self, Font}; -use crate::core::text::{Hit, Shaping}; -use crate::core::{Point, Rectangle, Size}; +use crate::core::text::{Hit, LineHeight, Shaping}; +use crate::core::{Pixels, Point, Rectangle, Size};  use crate::layer::Text;  use rustc_hash::{FxHashMap, FxHashSet}; @@ -77,6 +77,11 @@ impl Pipeline {                      Key {                          content: section.content,                          size: section.size * scale_factor, +                        line_height: f32::from( +                            section +                                .line_height +                                .to_absolute(Pixels(section.size)), +                        ) * scale_factor,                          font: section.font,                          bounds: Size {                              width: (section.bounds.width * scale_factor).ceil(), @@ -114,7 +119,7 @@ impl Pipeline {                      });                  let total_height = -                    total_lines as f32 * section.size * 1.2 * scale_factor; +                    total_lines as f32 * buffer.metrics().line_height;                  let left = match section.horizontal_alignment {                      alignment::Horizontal::Left => x, @@ -212,17 +217,21 @@ impl Pipeline {          &self,          content: &str,          size: f32, +        line_height: LineHeight,          font: Font,          bounds: Size,          shaping: Shaping,      ) -> (f32, f32) {          let mut measurement_cache = self.measurement_cache.borrow_mut(); +        let line_height = f32::from(line_height.to_absolute(Pixels(size))); +          let (_, paragraph) = measurement_cache.allocate(              &mut self.font_system.borrow_mut(),              Key {                  content,                  size, +                line_height,                  font,                  bounds,                  shaping, @@ -236,13 +245,14 @@ impl Pipeline {                  (i + 1, buffer.line_w.max(max))              }); -        (max_width, size * 1.2 * total_lines as f32) +        (max_width, line_height * total_lines as f32)      }      pub fn hit_test(          &self,          content: &str,          size: f32, +        line_height: LineHeight,          font: Font,          bounds: Size,          shaping: Shaping, @@ -251,11 +261,14 @@ impl Pipeline {      ) -> Option<Hit> {          let mut measurement_cache = self.measurement_cache.borrow_mut(); +        let line_height = f32::from(line_height.to_absolute(Pixels(size))); +          let (_, paragraph) = measurement_cache.allocate(              &mut self.font_system.borrow_mut(),              Key {                  content,                  size, +                line_height,                  font,                  bounds,                  shaping, @@ -353,21 +366,23 @@ impl Cache {              key.content.hash(&mut hasher);              key.size.to_bits().hash(&mut hasher); +            key.line_height.to_bits().hash(&mut hasher);              key.font.hash(&mut hasher);              key.bounds.width.to_bits().hash(&mut hasher);              key.bounds.height.to_bits().hash(&mut hasher); +            key.shaping.hash(&mut hasher);              hasher.finish()          };          if let hash_map::Entry::Vacant(entry) = self.entries.entry(hash) { -            let metrics = glyphon::Metrics::new(key.size, key.size * 1.2); +            let metrics = glyphon::Metrics::new(key.size, key.line_height);              let mut buffer = glyphon::Buffer::new(font_system, metrics);              buffer.set_size(                  font_system,                  key.bounds.width, -                key.bounds.height.max(key.size * 1.2), +                key.bounds.height.max(key.line_height),              );              buffer.set_text(                  font_system, @@ -399,6 +414,7 @@ impl Cache {  struct Key<'a> {      content: &'a str,      size: f32, +    line_height: f32,      font: Font,      bounds: Size,      shaping: Shaping,  | 
