Decouple caching from layering and simplify everything

This commit is contained in:
Héctor Ramón Jiménez 2024-04-05 23:59:21 +02:00
parent 4a356cfc16
commit 6d3e1d835e
No known key found for this signature in database
GPG key ID: 7CC46565708259A7
15 changed files with 896 additions and 1199 deletions

View file

@ -113,13 +113,11 @@ where
region: Rectangle,
f: impl FnOnce(&mut Self) -> R,
) -> R {
let mut frame = self.draft(region.size());
let mut frame = self.draft(region);
let result = f(&mut frame);
let origin = Point::new(region.x, region.y);
self.paste(frame, origin);
self.paste(frame, Point::new(region.x, region.y));
result
}
@ -129,14 +127,14 @@ where
/// Draw its contents back to this [`Frame`] with [`paste`].
///
/// [`paste`]: Self::paste
pub fn draft(&mut self, size: Size) -> Self {
fn draft(&mut self, clip_bounds: Rectangle) -> Self {
Self {
raw: self.raw.draft(size),
raw: self.raw.draft(clip_bounds),
}
}
/// Draws the contents of the given [`Frame`] with origin at the given [`Point`].
pub fn paste(&mut self, frame: Self, at: Point) {
fn paste(&mut self, frame: Self, at: Point) {
self.raw.paste(frame.raw, at);
}
@ -187,7 +185,7 @@ pub trait Backend: Sized {
fn scale(&mut self, scale: impl Into<f32>);
fn scale_nonuniform(&mut self, scale: impl Into<Vector>);
fn draft(&mut self, size: Size) -> Self;
fn draft(&mut self, clip_bounds: Rectangle) -> Self;
fn paste(&mut self, frame: Self, at: Point);
fn stroke<'a>(&mut self, path: &Path, stroke: impl Into<Stroke<'a>>);
@ -232,7 +230,7 @@ impl Backend for () {
fn scale(&mut self, _scale: impl Into<f32>) {}
fn scale_nonuniform(&mut self, _scale: impl Into<Vector>) {}
fn draft(&mut self, _size: Size) -> Self {}
fn draft(&mut self, _clip_bounds: Rectangle) -> Self {}
fn paste(&mut self, _frame: Self, _at: Point) {}
fn stroke<'a>(&mut self, _path: &Path, _stroke: impl Into<Stroke<'a>>) {}

View file

@ -1,6 +1,6 @@
//! Draw triangles!
use crate::color;
use crate::core::{Rectangle, Size, Transformation};
use crate::core::{Rectangle, Transformation};
use crate::gradient;
use bytemuck::{Pod, Zeroable};
@ -16,8 +16,8 @@ pub enum Mesh {
/// The [`Transformation`] for the vertices of the [`Mesh`].
transformation: Transformation,
/// The [`Size`] of the [`Mesh`].
size: Size,
/// The clip bounds of the [`Mesh`].
clip_bounds: Rectangle,
},
/// A mesh with a gradient.
Gradient {
@ -27,8 +27,8 @@ pub enum Mesh {
/// The [`Transformation`] for the vertices of the [`Mesh`].
transformation: Transformation,
/// The [`Size`] of the [`Mesh`].
size: Size,
/// The clip bounds of the [`Mesh`].
clip_bounds: Rectangle,
},
}
@ -53,15 +53,15 @@ impl Mesh {
pub fn clip_bounds(&self) -> Rectangle {
match self {
Self::Solid {
size,
clip_bounds,
transformation,
..
}
| Self::Gradient {
size,
clip_bounds,
transformation,
..
} => Rectangle::with_size(*size) * *transformation,
} => *clip_bounds * *transformation,
}
}
}

View file

@ -11,7 +11,7 @@ pub use cosmic_text;
use crate::core::alignment;
use crate::core::font::{self, Font};
use crate::core::text::{LineHeight, Shaping};
use crate::core::text::Shaping;
use crate::core::{Color, Pixels, Point, Rectangle, Size, Transformation};
use once_cell::sync::OnceCell;
@ -50,7 +50,7 @@ pub enum Text {
/// The size of the text in logical pixels.
size: Pixels,
/// The line height of the text.
line_height: LineHeight,
line_height: Pixels,
/// The font of the text.
font: Font,
/// The horizontal alignment of the text.