1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use crate::prelude::*;
use crate::{Canvas, Data, Rect};
use crate::{Matrix, Shader, TileMode};
use skia_bindings as sb;
use skia_bindings::{SkPicture, SkRefCntBase};
pub type Picture = RCHandle<SkPicture>;
impl NativeRefCountedBase for SkPicture {
type Base = SkRefCntBase;
}
impl RCHandle<SkPicture> {
pub fn from_data(data: &Data) -> Option<Picture> {
Picture::from_ptr(unsafe { sb::C_SkPicture_MakeFromData(data.native()) })
}
pub fn from_bytes(bytes: &[u8]) -> Option<Picture> {
Picture::from_ptr(unsafe {
sb::C_SkPicture_MakeFromData2(bytes.as_ptr() as _, bytes.len())
})
}
pub fn playback(&self, mut canvas: impl AsMut<Canvas>) {
unsafe { sb::C_SkPicture_playback(self.native(), canvas.as_mut().native_mut()) }
}
pub fn cull_rect(&self) -> Rect {
Rect::from_native(unsafe { sb::C_SkPicture_cullRect(self.native()) })
}
pub fn unique_id(&self) -> u32 {
unsafe { sb::C_SkPicture_uniqueID(self.native()) }
}
pub fn serialize(&self) -> Data {
Data::from_ptr(unsafe { sb::C_SkPicture_serialize(self.native()) }).unwrap()
}
pub fn new_placeholder(cull: impl AsRef<Rect>) -> Picture {
Picture::from_ptr(unsafe { sb::C_SkPicture_MakePlaceholder(cull.as_ref().native()) })
.unwrap()
}
pub fn approximate_op_count(&self) -> usize {
unsafe {
sb::C_SkPicture_approximateOpCount(self.native())
.try_into()
.unwrap()
}
}
pub fn approximate_bytes_used(&self) -> usize {
unsafe {
let mut value = 0;
sb::C_SkPicture_approximateBytesUsed(self.native(), &mut value);
value
}
}
pub fn to_shader<'a, 'b>(
&self,
tm: impl Into<Option<(TileMode, TileMode)>>,
local_matrix: impl Into<Option<&'a Matrix>>,
tile_rect: impl Into<Option<&'b Rect>>,
) -> Shader {
let tm = tm.into();
let local_matrix = local_matrix.into();
let tile_rect = tile_rect.into();
let tmx = tm.map(|tm| tm.0).unwrap_or_default();
let tmy = tm.map(|tm| tm.1).unwrap_or_default();
Shader::from_ptr(unsafe {
sb::C_SkPicture_makeShader(
self.native(),
tmx.into_native(),
tmy.into_native(),
local_matrix.native_ptr_or_null(),
tile_rect.native_ptr_or_null(),
)
})
.unwrap()
}
}