Clip text to viewport bounds instead of layout bounds

This commit is contained in:
Héctor Ramón Jiménez 2023-12-01 16:04:27 +01:00
parent 99899d49cc
commit 936d480267
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
23 changed files with 177 additions and 115 deletions

View file

@ -1,6 +1,6 @@
use crate::core::{Background, Color, Gradient, Rectangle, Vector};
use crate::graphics::backend;
use crate::graphics::{Damage, Viewport};
use crate::graphics::Viewport;
use crate::primitive::{self, Primitive};
use std::borrow::Cow;
@ -361,11 +361,9 @@ impl Backend {
paragraph,
position,
color,
viewport,
} => {
let physical_bounds =
(Rectangle::new(*position, paragraph.min_bounds)
+ translation)
* scale_factor;
let physical_bounds = (*viewport + translation) * scale_factor;
if !clip_bounds.intersects(&physical_bounds) {
return;
@ -387,10 +385,9 @@ impl Backend {
editor,
position,
color,
viewport,
} => {
let physical_bounds =
(Rectangle::new(*position, editor.bounds) + translation)
* scale_factor;
let physical_bounds = (*viewport + translation) * scale_factor;
if !clip_bounds.intersects(&physical_bounds) {
return;
@ -418,9 +415,9 @@ impl Backend {
horizontal_alignment,
vertical_alignment,
shaping,
viewport,
} => {
let physical_bounds =
(primitive.bounds() + translation) * scale_factor;
let physical_bounds = (*viewport + translation) * scale_factor;
if !clip_bounds.intersects(&physical_bounds) {
return;

View file

@ -109,15 +109,17 @@ impl Frame {
Point::new(transformed[0].x, transformed[0].y)
};
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: Rectangle {
x: position.x,
y: position.y,
width: f32::INFINITY,
height: f32::INFINITY,
},
bounds,
color: text.color,
size: text.size,
line_height: text.line_height,
@ -125,6 +127,7 @@ impl Frame {
horizontal_alignment: text.horizontal_alignment,
vertical_alignment: text.vertical_alignment,
shaping: text.shaping,
viewport: bounds,
});
}