summaryrefslogtreecommitdiffstats
path: root/tiny_skia
diff options
context:
space:
mode:
authorLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-01-17 14:48:33 +0100
committerLibravatar Héctor Ramón Jiménez <hector@hecrj.dev>2024-01-17 14:49:14 +0100
commit4cb53a6e225f9e533126eb03d3cc34be3fd09f1d (patch)
treeb318d82452559357ef50fc756f318e56d080c371 /tiny_skia
parentdd032d9a7a73dc28c12802e1e702d0aebe92e261 (diff)
downloadiced-4cb53a6e225f9e533126eb03d3cc34be3fd09f1d.tar.gz
iced-4cb53a6e225f9e533126eb03d3cc34be3fd09f1d.tar.bz2
iced-4cb53a6e225f9e533126eb03d3cc34be3fd09f1d.zip
Implement vectorial text support for `iced_tiny_skia`
Diffstat (limited to 'tiny_skia')
-rw-r--r--tiny_skia/src/geometry.rs99
1 files changed, 55 insertions, 44 deletions
diff --git a/tiny_skia/src/geometry.rs b/tiny_skia/src/geometry.rs
index 4cc04c6e..b00f4676 100644
--- a/tiny_skia/src/geometry.rs
+++ b/tiny_skia/src/geometry.rs
@@ -97,54 +97,65 @@ impl Frame {
pub fn fill_text(&mut self, text: impl Into<Text>) {
let text = text.into();
- let (position, size, line_height) = if self.transform.is_identity() {
- (text.position, text.size, text.line_height)
- } else {
- let mut position = [tiny_skia::Point {
- x: text.position.x,
- y: text.position.y,
- }];
-
- self.transform.map_points(&mut position);
-
- let (_, scale_y) = self.transform.get_scale();
-
- let size = text.size.0 * scale_y;
+ let (scale_x, scale_y) = self.transform.get_scale();
+
+ if self.transform.is_scale_translate()
+ && scale_x == scale_y
+ && scale_x > 0.0
+ && scale_y > 0.0
+ {
+ let (position, size, line_height) = if self.transform.is_identity()
+ {
+ (text.position, text.size, text.line_height)
+ } else {
+ let mut position = [tiny_skia::Point {
+ x: text.position.x,
+ y: text.position.y,
+ }];
+
+ self.transform.map_points(&mut position);
+
+ let size = text.size.0 * scale_y;
+
+ let line_height = match text.line_height {
+ LineHeight::Absolute(size) => {
+ LineHeight::Absolute(Pixels(size.0 * scale_y))
+ }
+ LineHeight::Relative(factor) => {
+ LineHeight::Relative(factor)
+ }
+ };
+
+ (
+ Point::new(position[0].x, position[0].y),
+ size.into(),
+ line_height,
+ )
+ };
- let line_height = match text.line_height {
- LineHeight::Absolute(size) => {
- LineHeight::Absolute(Pixels(size.0 * scale_y))
- }
- LineHeight::Relative(factor) => LineHeight::Relative(factor),
+ let bounds = Rectangle {
+ x: position.x,
+ y: position.y,
+ width: f32::INFINITY,
+ height: f32::INFINITY,
};
- (
- Point::new(position[0].x, position[0].y),
- size.into(),
+ // TODO: Honor layering!
+ self.primitives.push(Primitive::Text {
+ content: text.content,
+ bounds,
+ color: text.color,
+ size,
line_height,
- )
- };
-
- let bounds = Rectangle {
- x: position.x,
- y: position.y,
- width: f32::INFINITY,
- height: f32::INFINITY,
- };
-
- // TODO: Use vectorial text instead of primitive
- self.primitives.push(Primitive::Text {
- content: text.content,
- bounds,
- color: text.color,
- size,
- line_height,
- font: text.font,
- horizontal_alignment: text.horizontal_alignment,
- vertical_alignment: text.vertical_alignment,
- shaping: text.shaping,
- clip_bounds: Rectangle::with_size(Size::INFINITY),
- });
+ font: text.font,
+ horizontal_alignment: text.horizontal_alignment,
+ vertical_alignment: text.vertical_alignment,
+ shaping: text.shaping,
+ clip_bounds: Rectangle::with_size(Size::INFINITY),
+ });
+ } else {
+ text.draw_with(|path, color| self.fill(&path, color));
+ }
}
pub fn push_transform(&mut self) {