summaryrefslogtreecommitdiffstats
path: root/wgpu
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-05-04 13:00:16 +0200
committerLibravatar Héctor Ramón Jiménez <hector0193@gmail.com>2023-05-04 18:39:31 +0200
commit9499a8f9e6f9971dedfae563cb133232aa3cebc2 (patch)
tree54074dd8b1fc17d63ad92d84b6d2b4415ad29df6 /wgpu
parent8e8808f0e187ed6671441f5016f07bfcba426452 (diff)
downloadiced-9499a8f9e6f9971dedfae563cb133232aa3cebc2.tar.gz
iced-9499a8f9e6f9971dedfae563cb133232aa3cebc2.tar.bz2
iced-9499a8f9e6f9971dedfae563cb133232aa3cebc2.zip
Support configurable `LineHeight` in text widgets
Diffstat (limited to 'wgpu')
-rw-r--r--wgpu/src/backend.rs13
-rw-r--r--wgpu/src/geometry.rs1
-rw-r--r--wgpu/src/layer.rs3
-rw-r--r--wgpu/src/layer/text.rs5
-rw-r--r--wgpu/src/text.rs28
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,