Skip to content

Commit 3f178fa

Browse files
committed
chore: render direct
1 parent ca9ee6d commit 3f178fa

File tree

21 files changed

+483
-593
lines changed

21 files changed

+483
-593
lines changed

crates/canvas-2d/src/android.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
1+
use std::os::raw::c_void;
12
#[cfg(feature = "vulkan")]
23
use ash::vk;
34
#[cfg(feature = "vulkan")]
45
use ash::vk::Handle;
6+
use skia_safe::gpu;
7+
use crate::context::{Context, State, SurfaceData, SurfaceEngine};
8+
use crate::context::text_styles::text_direction::TextDirection;
59

610
#[cfg(feature = "vulkan")]
711
impl Context {
@@ -63,7 +67,7 @@ impl Context {
6367
};
6468

6569
let info = skia_safe::ImageInfo::new(
66-
skia_safe::ISize::new((width * density).floor() as i32, (height * density).floor() as i32),
70+
skia_safe::ISize::new(width as i32, height as i32),
6771
skia_safe::ColorType::N32,
6872
alpha_type,
6973
Some(skia_safe::ColorSpace::new_srgb()),
@@ -91,15 +95,16 @@ impl Context {
9195
bounds,
9296
scale: density,
9397
ppi,
98+
engine: SurfaceEngine::Vulkan,
9499
},
95100
surface,
96101
vk_surface,
97102
ash_graphics: None,
98-
recorder: Arc::new(parking_lot::Mutex::new(Recorder::new(bounds))),
99103
path: Path::default(),
100104
state,
101105
state_stack: vec![],
102106
font_color: Color::new(font_color as u32),
107+
is_dirty: false,
103108
}
104109
}
105110

@@ -119,7 +124,7 @@ impl Context {
119124
};
120125

121126
let info = skia_safe::ImageInfo::new(
122-
skia_safe::ISize::new((width * context.surface_data.scale).floor() as i32, (height * context.surface_data.scale).floor() as i32),
127+
skia_safe::ISize::new(width as i32, height as i32),
123128
skia_safe::ColorType::N32,
124129
alpha_type,
125130
Some(skia_safe::ColorSpace::new_srgb()),
@@ -139,7 +144,6 @@ impl Context {
139144

140145
let bounds = skia_safe::Rect::from_wh(width, height);
141146
context.surface_data.bounds = bounds;
142-
context.recorder = Arc::new(parking_lot::Mutex::new(Recorder::new(bounds)));
143147
context.surface = surface;
144148
}
145149
}

crates/canvas-2d/src/context/drawing_images/mod.rs

+13-12
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
use skia_safe::canvas::SrcRectConstraint;
21
use skia_safe::{Image, Rect};
2+
use skia_safe::canvas::SrcRectConstraint;
33

44
use canvas_core::image_asset::ImageAsset;
55

@@ -141,13 +141,13 @@ impl Context {
141141
.paint
142142
.image_smoothing_quality_set(self.state.image_filter_quality());
143143

144-
let paint = self.state.paint.image_paint();
145-
146-
self.render_to_canvas(paint,|canvas, paint| {
144+
let paint = self.state.paint.image_paint().clone();
145+
let quality = self.state.image_smoothing_quality;
146+
self.render_to_canvas(&paint, |canvas, paint| {
147147
canvas.draw_image_with_sampling_options(
148148
image,
149149
skia_safe::Point::new(x, y),
150-
self.state.image_smoothing_quality,
150+
quality,
151151
Some(paint),
152152
);
153153
});
@@ -173,14 +173,14 @@ impl Context {
173173
.paint
174174
.image_smoothing_quality_set(self.state.image_filter_quality());
175175

176-
let paint = self.state.paint.image_paint();
177-
178-
self.render_to_canvas(paint, |canvas, paint| {
176+
let paint = self.state.paint.image_paint().clone();
177+
let quality = self.state.image_smoothing_quality;
178+
self.render_to_canvas(&paint, |canvas, paint| {
179179
canvas.draw_image_rect_with_sampling_options(
180180
image,
181181
Some((&src, SrcRectConstraint::Strict)),
182182
dst,
183-
self.state.image_smoothing_quality,
183+
quality,
184184
paint,
185185
);
186186
});
@@ -202,14 +202,15 @@ impl Context {
202202
self.state
203203
.paint
204204
.image_smoothing_quality_set(self.state.image_filter_quality());
205-
let paint = self.state.paint.image_paint();
205+
let paint = self.state.paint.image_paint().clone();
206206

207-
self.render_to_canvas(paint,|canvas, paint| {
207+
let quality = self.state.image_smoothing_quality;
208+
self.render_to_canvas(&paint, |canvas, paint| {
208209
canvas.draw_image_rect_with_sampling_options(
209210
image,
210211
Some((&src, SrcRectConstraint::Strict)),
211212
dst,
212-
self.state.image_smoothing_quality,
213+
quality,
213214
paint,
214215
);
215216
});

crates/canvas-2d/src/context/drawing_paths/mod.rs

+34-45
Original file line numberDiff line numberDiff line change
@@ -9,26 +9,28 @@ use crate::context::paths::path::Path;
99
pub mod fill_rule;
1010

1111
impl Context {
12-
fn fill_or_stroke(&self, is_fill: bool, path: Option<&mut Path>, fill_rule: Option<FillRule>) {
12+
fn fill_or_stroke(&mut self, is_fill: bool, path: Option<&mut Path>, fill_rule: Option<FillRule>) {
1313
let paint;
1414
if is_fill {
15-
paint = self.state.paint.fill_paint();
15+
paint = self.state.paint.fill_paint().clone();
1616
} else {
17-
paint = self.state.paint.stroke_paint();
17+
paint = self.state.paint.stroke_paint().clone();
1818
}
1919

2020
if let Some(rule) = fill_rule {
2121
let mut path = path.map(|path| path.clone()).unwrap_or(self.path.clone());
2222
path.0.set_fill_type(rule.to_fill_type());
2323
let path = path.path();
2424

25-
self.render_to_canvas(paint,|canvas, paint| {
26-
if let Some(paint) = self.state.paint.fill_shadow_paint(
27-
self.state.shadow_offset,
28-
self.state.shadow_color,
29-
self.state.shadow_blur,
30-
) {
31-
canvas.draw_path(path, &paint);
25+
let shadow_paint = self.state.paint.fill_shadow_paint(
26+
self.state.shadow_offset,
27+
self.state.shadow_color,
28+
self.state.shadow_blur,
29+
);
30+
31+
self.render_to_canvas(&paint, |canvas, paint| {
32+
if let Some(paint) = &shadow_paint {
33+
canvas.draw_path(path, paint);
3234
}
3335

3436
canvas.draw_path(path, paint);
@@ -38,25 +40,23 @@ impl Context {
3840
path.0.set_fill_type(skia_safe::path::FillType::Winding);
3941
let path = path.path();
4042

41-
self.render_to_canvas(paint,|canvas, paint| {
42-
if is_fill {
43-
if let Some(paint) = self.state.paint.fill_shadow_paint(
44-
self.state.shadow_offset,
45-
self.state.shadow_color,
46-
self.state.shadow_blur,
47-
) {
48-
canvas.draw_path(path, &paint);
49-
}
50-
} else {
51-
if let Some(paint) = self.state.paint.stroke_shadow_paint(
52-
self.state.shadow_offset,
53-
self.state.shadow_color,
54-
self.state.shadow_blur,
55-
) {
56-
canvas.draw_path(path, &paint);
57-
}
43+
let shadow_paint = if is_fill {
44+
self.state.paint.fill_shadow_paint(
45+
self.state.shadow_offset,
46+
self.state.shadow_color,
47+
self.state.shadow_blur,
48+
)
49+
} else {
50+
self.state.paint.stroke_shadow_paint(
51+
self.state.shadow_offset,
52+
self.state.shadow_color,
53+
self.state.shadow_blur,
54+
)
55+
};
56+
self.render_to_canvas(&paint, |canvas, paint| {
57+
if let Some(paint) = &shadow_paint {
58+
canvas.draw_path(path, paint);
5859
}
59-
6060
canvas.draw_path(path, paint);
6161
});
6262
}
@@ -75,26 +75,15 @@ impl Context {
7575
}
7676

7777
pub fn clip(&mut self, path: Option<&mut Path>, fill_rule: Option<FillRule>) {
78-
let mut clip = path
78+
let mut path = path
7979
.map(|path| path.clone())
8080
.unwrap_or_else(|| self.path.clone());
8181

82-
clip.set_fill_type(fill_rule.unwrap_or(FillRule::NonZero));
83-
84-
self.state.clip = match &self.state.clip {
85-
Some(old_clip) => match old_clip
86-
.path()
87-
.op(clip.path(), skia_safe::PathOp::Intersect)
88-
{
89-
None => None,
90-
Some(path) => Some(Path(path)),
91-
},
92-
None => Some(clip.clone()),
93-
};
94-
95-
self.with_recorder(|mut recorder| {
96-
recorder.set_clip(&self.state.clip)
97-
});
82+
path.set_fill_type(fill_rule.unwrap_or(FillRule::NonZero));
83+
84+
self.surface
85+
.canvas()
86+
.clip_path(path.path(), Some(ClipOp::Intersect), Some(true));
9887
}
9988

10089
pub fn point_in_path(&self, path: Option<&Path>, x: f32, y: f32, rule: FillRule) -> bool {

crates/canvas-2d/src/context/drawing_rectangles.rs

+28-44
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,21 @@
11
use std::os::raw::c_float;
22

3-
use skia_safe::{BlendMode, Contains, Paint, Rect};
3+
use skia_safe::{BlendMode, Color, Paint, Rect};
44

55
use crate::context::Context;
66

77
impl Context {
88
pub fn clear_rect(&mut self, x: c_float, y: c_float, width: c_float, height: c_float) {
9-
match self
10-
.state
11-
.matrix
12-
.map_rect(Rect::new(x, y, width, height))
13-
.0
14-
.contains(&self.surface_data.bounds)
15-
{
16-
// if rect fully encloses canvas, erase existing content (but preserve CTM, path, etc.)
17-
true => {
18-
self.with_recorder(|mut recorder|{
19-
recorder.set_bounds(self.surface_data.bounds);
20-
recorder.set_matrix(self.state.matrix);
21-
recorder.set_clip(&self.state.clip);
22-
});
23-
}
24-
25-
// otherwise, paint over the specified region but preserve overdrawn vectors
26-
false => {
27-
let mut paint = Paint::default();
28-
paint
29-
.set_anti_alias(true)
30-
.set_style(skia_safe::PaintStyle::Fill)
31-
.set_blend_mode(BlendMode::Clear);
329

33-
self.render_to_canvas(&paint, |canvas, paint| {
34-
let rect = Rect::from_xywh(x, y, width, height);
35-
canvas.draw_rect(&rect, paint);
36-
});
37-
}
38-
}
10+
let mut paint = Paint::default();
11+
paint.set_anti_alias(true);
12+
paint.set_style(skia_safe::paint::Style::Fill);
13+
paint.set_blend_mode(BlendMode::Clear);
14+
paint.set_color(Color::TRANSPARENT);;
15+
self.render_to_canvas(&paint, |canvas, paint| {
16+
let rect = Rect::from_xywh(x, y, width, height);
17+
canvas.draw_rect(&rect, paint);
18+
});
3919
}
4020

4121
pub fn fill_rect_xywh(&mut self, x: c_float, y: c_float, width: c_float, height: c_float) {
@@ -44,13 +24,15 @@ impl Context {
4424
}
4525

4626
pub fn fill_rect(&mut self, rect: &Rect) {
47-
self.render_to_canvas(self.state.paint.fill_paint(), |canvas, paint| {
48-
if let Some(paint) = self.state.paint.fill_shadow_paint(
49-
self.state.shadow_offset,
50-
self.state.shadow_color,
51-
self.state.shadow_blur,
52-
) {
53-
canvas.draw_rect(rect, &paint);
27+
let paint = self.state.paint.fill_paint().clone();
28+
let shadow_paint = self.state.paint.fill_shadow_paint(
29+
self.state.shadow_offset,
30+
self.state.shadow_color,
31+
self.state.shadow_blur,
32+
);
33+
self.render_to_canvas(&paint, |canvas, paint| {
34+
if let Some(paint) = &shadow_paint {
35+
canvas.draw_rect(rect, paint);
5436
}
5537
canvas.draw_rect(rect, paint);
5638
});
@@ -62,13 +44,15 @@ impl Context {
6244
}
6345

6446
pub fn stroke_rect(&mut self, rect: &Rect) {
65-
self.render_to_canvas(self.state.paint.stroke_paint(), |canvas, paint| {
66-
if let Some(paint) = &mut self.state.paint.stroke_shadow_paint(
67-
self.state.shadow_offset,
68-
self.state.shadow_color,
69-
self.state.shadow_blur,
70-
) {
71-
canvas.draw_rect(rect, &paint);
47+
let paint = self.state.paint.stroke_paint().clone();
48+
let shadow_paint = self.state.paint.stroke_shadow_paint(
49+
self.state.shadow_offset,
50+
self.state.shadow_color,
51+
self.state.shadow_blur,
52+
);
53+
self.render_to_canvas(&paint, |canvas, paint| {
54+
if let Some(paint) = &shadow_paint {
55+
canvas.draw_rect(rect, paint);
7256
}
7357
canvas.draw_rect(rect, paint);
7458
});

0 commit comments

Comments
 (0)