Skip to content

Commit 26e53ef

Browse files
authored
Skia Raster (#26)
* skia raster * reformat lib.rs * set skia cache limits in image renderer
1 parent cd3f5df commit 26e53ef

File tree

6 files changed

+130
-3
lines changed

6 files changed

+130
-3
lines changed

Cargo.lock

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/anyrender_skia/Cargo.toml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ license.workspace = true
99
edition.workspace = true
1010

1111
[features]
12-
log_frame_times = ["debug_timer/enable"]
12+
pixels_window_renderer = ["dep:pixels_window_renderer"]
13+
softbuffer_window_renderer = ["dep:softbuffer_window_renderer"]
14+
log_frame_times = ["debug_timer/enable", "pixels_window_renderer?/log_frame_times", "softbuffer_window_renderer?/log_frame_times"]
1315
vulkan = ["skia-safe/vulkan"]
1416

1517
[dependencies]
@@ -18,6 +20,8 @@ debug_timer = { workspace = true }
1820
kurbo = { workspace = true }
1921
peniko = { workspace = true }
2022
raw-window-handle = { workspace = true }
23+
softbuffer_window_renderer = { workspace = true, optional = true }
24+
pixels_window_renderer = { workspace = true, optional = true }
2125
skia-safe = { version = "0.89.1", features = ["gl", "pdf", "textlayout"]}
2226
oaty = "0.1"
2327
gl = "0.14.0"
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,100 @@
1+
use anyrender::ImageRenderer;
2+
use debug_timer::debug_timer;
3+
use skia_safe::{AlphaType, Color, ColorType, ImageInfo, SurfaceProps, graphics, surfaces};
14

5+
use crate::{SkiaScenePainter, scene::SkiaSceneCache};
6+
7+
pub struct SkiaImageRenderer {
8+
image_info: ImageInfo,
9+
surface_props: SurfaceProps,
10+
scene_cache: SkiaSceneCache,
11+
}
12+
13+
impl ImageRenderer for SkiaImageRenderer {
14+
type ScenePainter<'a>
15+
= SkiaScenePainter<'a>
16+
where
17+
Self: 'a;
18+
19+
fn new(width: u32, height: u32) -> Self {
20+
graphics::set_font_cache_count_limit(100);
21+
graphics::set_typeface_cache_count_limit(100);
22+
graphics::set_resource_cache_total_bytes_limit(10485760);
23+
24+
Self {
25+
image_info: ImageInfo::new(
26+
(width as i32, height as i32),
27+
ColorType::RGBA8888,
28+
AlphaType::Opaque,
29+
None,
30+
),
31+
surface_props: SurfaceProps::default(),
32+
scene_cache: SkiaSceneCache::default(),
33+
}
34+
}
35+
36+
fn resize(&mut self, width: u32, height: u32) {
37+
self.image_info = ImageInfo::new(
38+
(width as i32, height as i32),
39+
ColorType::RGBA8888,
40+
AlphaType::Opaque,
41+
None,
42+
);
43+
}
44+
45+
fn reset(&mut self) {}
46+
47+
fn render_to_vec<F: FnOnce(&mut Self::ScenePainter<'_>)>(
48+
&mut self,
49+
draw_fn: F,
50+
buffer: &mut Vec<u8>,
51+
) {
52+
debug_timer!(timer, feature = "log_frame_times");
53+
54+
let mut surface = surfaces::wrap_pixels(
55+
&self.image_info,
56+
&mut buffer[..],
57+
None,
58+
Some(&self.surface_props),
59+
)
60+
.unwrap();
61+
62+
surface.canvas().clear(Color::WHITE);
63+
64+
draw_fn(&mut SkiaScenePainter {
65+
inner: surface.canvas(),
66+
cache: &mut self.scene_cache,
67+
});
68+
timer.record_time("render");
69+
70+
self.scene_cache.next_gen();
71+
timer.record_time("cache next gen");
72+
73+
timer.print_times("skia_raster: ");
74+
}
75+
76+
fn render<F: FnOnce(&mut Self::ScenePainter<'_>)>(&mut self, draw_fn: F, buffer: &mut [u8]) {
77+
debug_timer!(timer, feature = "log_frame_times");
78+
79+
let mut surface = surfaces::wrap_pixels(
80+
&self.image_info,
81+
&mut buffer[..],
82+
None,
83+
Some(&self.surface_props),
84+
)
85+
.unwrap();
86+
87+
surface.canvas().clear(Color::WHITE);
88+
89+
draw_fn(&mut SkiaScenePainter {
90+
inner: surface.canvas(),
91+
cache: &mut self.scene_cache,
92+
});
93+
timer.record_time("render");
94+
95+
self.scene_cache.next_gen();
96+
timer.record_time("cache next gen");
97+
98+
timer.print_times("skia_raster: ");
99+
}
100+
}

crates/anyrender_skia/src/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ mod opengl;
1111
#[cfg(feature = "vulkan")]
1212
mod vulkan;
1313

14+
pub use image_renderer::SkiaImageRenderer;
1415
pub use scene::SkiaScenePainter;
15-
pub use window_renderer::SkiaWindowRenderer;
16+
pub use window_renderer::*;

crates/anyrender_skia/src/scene.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ impl Default for SkiaSceneCache {
4343
typeface: GenerationalCache::new(1),
4444
normalized_typeface: GenerationalCache::new(1),
4545
image_shader: GenerationalCache::new(1),
46-
font: GenerationalCache::new(1),
46+
font: GenerationalCache::new(10),
4747
font_mgr: FontMgr::new(),
4848
glyph_id_buf: Default::default(),
4949
glyph_pos_buf: Default::default(),

crates/anyrender_skia/src/window_renderer.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,3 +109,24 @@ impl WindowRenderer for SkiaWindowRenderer {
109109
timer.print_times("skia: ");
110110
}
111111
}
112+
113+
#[cfg(any(
114+
feature = "pixels_window_renderer",
115+
feature = "softbuffer_window_renderer"
116+
))]
117+
pub mod raster {
118+
#[cfg(feature = "pixels_window_renderer")]
119+
pub use pixels_window_renderer::PixelsWindowRenderer;
120+
#[cfg(feature = "softbuffer_window_renderer")]
121+
pub use softbuffer_window_renderer::SoftbufferWindowRenderer;
122+
123+
#[cfg(feature = "pixels_window_renderer")]
124+
pub type SkiaRasterWindowRenderer =
125+
PixelsWindowRenderer<crate::image_renderer::SkiaImageRenderer>;
126+
#[cfg(all(
127+
feature = "softbuffer_window_renderer",
128+
not(feature = "pixels_window_renderer")
129+
))]
130+
pub type SkiaRasterWindowRenderer =
131+
SoftbufferWindowRenderer<crate::image_renderer::SkiaImageRenderer>;
132+
}

0 commit comments

Comments
 (0)