summaryrefslogtreecommitdiffstats
path: root/wgpu/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'wgpu/src/lib.rs')
-rw-r--r--wgpu/src/lib.rs51
1 files changed, 42 insertions, 9 deletions
diff --git a/wgpu/src/lib.rs b/wgpu/src/lib.rs
index 178522de..ad88ce3e 100644
--- a/wgpu/src/lib.rs
+++ b/wgpu/src/lib.rs
@@ -62,6 +62,7 @@ pub use geometry::Geometry;
use crate::core::{
Background, Color, Font, Pixels, Point, Rectangle, Size, Transformation,
+ Vector,
};
use crate::graphics::text::{Editor, Paragraph};
use crate::graphics::Viewport;
@@ -78,15 +79,17 @@ pub struct Renderer {
triangle_storage: triangle::Storage,
text_storage: text::Storage,
+ text_viewport: text::Viewport,
// TODO: Centralize all the image feature handling
#[cfg(any(feature = "svg", feature = "image"))]
- image_cache: image::cache::Shared,
+ image_cache: std::cell::RefCell<image::Cache>,
}
impl Renderer {
pub fn new(
- _engine: &Engine,
+ device: &wgpu::Device,
+ engine: &Engine,
default_font: Font,
default_text_size: Pixels,
) -> Self {
@@ -97,9 +100,12 @@ impl Renderer {
triangle_storage: triangle::Storage::new(),
text_storage: text::Storage::new(),
+ text_viewport: engine.text_pipeline.create_viewport(device),
#[cfg(any(feature = "svg", feature = "image"))]
- image_cache: _engine.image_cache().clone(),
+ image_cache: std::cell::RefCell::new(
+ engine.create_image_cache(device),
+ ),
}
}
@@ -121,6 +127,9 @@ impl Renderer {
self.triangle_storage.trim();
self.text_storage.trim();
+
+ #[cfg(any(feature = "svg", feature = "image"))]
+ self.image_cache.borrow_mut().trim();
}
fn prepare(
@@ -134,6 +143,8 @@ impl Renderer {
) {
let scale_factor = viewport.scale_factor() as f32;
+ self.text_viewport.update(queue, viewport.physical_size());
+
for layer in self.layers.iter_mut() {
if !layer.quads.is_empty() {
engine.quad_pipeline.prepare(
@@ -175,12 +186,12 @@ impl Renderer {
engine.text_pipeline.prepare(
device,
queue,
+ &self.text_viewport,
encoder,
&mut self.text_storage,
&layer.text,
layer.bounds,
Transformation::scale(scale_factor),
- viewport.physical_size(),
);
}
@@ -190,6 +201,7 @@ impl Renderer {
device,
encoder,
&mut engine.staging_belt,
+ &mut self.image_cache.borrow_mut(),
&layer.images,
viewport.projection(),
scale_factor,
@@ -245,6 +257,8 @@ impl Renderer {
#[cfg(any(feature = "svg", feature = "image"))]
let mut image_layer = 0;
+ #[cfg(any(feature = "svg", feature = "image"))]
+ let image_cache = self.image_cache.borrow();
let scale_factor = viewport.scale_factor() as f32;
let physical_bounds = Rectangle::<f32>::from(Rectangle::with_size(
@@ -347,6 +361,7 @@ impl Renderer {
if !layer.text.is_empty() {
text_layer += engine.text_pipeline.render(
+ &self.text_viewport,
&self.text_storage,
text_layer,
&layer.text,
@@ -358,6 +373,7 @@ impl Renderer {
#[cfg(any(feature = "svg", feature = "image"))]
if !layer.images.is_empty() {
engine.image_pipeline.render(
+ &image_cache,
image_layer,
scissor_rect,
&mut render_pass,
@@ -378,7 +394,6 @@ impl Renderer {
use crate::core::alignment;
use crate::core::text::Renderer as _;
use crate::core::Renderer as _;
- use crate::core::Vector;
self.with_layer(
Rectangle::with_size(viewport.logical_size()),
@@ -509,7 +524,7 @@ impl core::image::Renderer for Renderer {
type Handle = core::image::Handle;
fn measure_image(&self, handle: &Self::Handle) -> Size<u32> {
- self.image_cache.lock().measure_image(handle)
+ self.image_cache.borrow_mut().measure_image(handle)
}
fn draw_image(
@@ -517,16 +532,25 @@ impl core::image::Renderer for Renderer {
handle: Self::Handle,
filter_method: core::image::FilterMethod,
bounds: Rectangle,
+ rotation: core::Radians,
+ opacity: f32,
) {
let (layer, transformation) = self.layers.current_mut();
- layer.draw_image(handle, filter_method, bounds, transformation);
+ layer.draw_image(
+ handle,
+ filter_method,
+ bounds,
+ transformation,
+ rotation,
+ opacity,
+ );
}
}
#[cfg(feature = "svg")]
impl core::svg::Renderer for Renderer {
fn measure_svg(&self, handle: &core::svg::Handle) -> Size<u32> {
- self.image_cache.lock().measure_svg(handle)
+ self.image_cache.borrow_mut().measure_svg(handle)
}
fn draw_svg(
@@ -534,9 +558,18 @@ impl core::svg::Renderer for Renderer {
handle: core::svg::Handle,
color_filter: Option<Color>,
bounds: Rectangle,
+ rotation: core::Radians,
+ opacity: f32,
) {
let (layer, transformation) = self.layers.current_mut();
- layer.draw_svg(handle, color_filter, bounds, transformation);
+ layer.draw_svg(
+ handle,
+ color_filter,
+ bounds,
+ transformation,
+ rotation,
+ opacity,
+ );
}
}