skia_safe/utils/
ordered_font_mgr.rs1use std::{fmt, mem::transmute, ops::Deref};
2
3use crate::{prelude::*, FontMgr};
4use skia_bindings::{self as sb, SkOrderedFontMgr, SkRefCntBase};
5
6pub type OrderedFontMgr = RCHandle<SkOrderedFontMgr>;
7require_base_type!(SkOrderedFontMgr, sb::SkFontMgr);
8
9impl NativeRefCountedBase for SkOrderedFontMgr {
10 type Base = SkRefCntBase;
11}
12
13impl Deref for OrderedFontMgr {
14 type Target = FontMgr;
15 fn deref(&self) -> &Self::Target {
16 unsafe { transmute_ref(self) }
17 }
18}
19
20impl Default for OrderedFontMgr {
21 fn default() -> Self {
22 Self::new()
23 }
24}
25
26impl From<OrderedFontMgr> for FontMgr {
27 fn from(font_mgr: OrderedFontMgr) -> Self {
28 unsafe { transmute(font_mgr) }
29 }
30}
31
32impl fmt::Debug for OrderedFontMgr {
33 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
34 f.debug_struct("OrderedFontMgr")
35 .field("base", self as &FontMgr)
36 .finish()
37 }
38}
39
40impl OrderedFontMgr {
41 pub fn new() -> Self {
42 Self::from_ptr(unsafe { sb::C_SkOrderedFontMgr_new() }).unwrap()
43 }
44
45 pub fn append(&mut self, font_mgr: impl Into<FontMgr>) {
46 let font_mgr = font_mgr.into();
47 unsafe { sb::C_SkOrderedFontMgr_append(self.native_mut(), font_mgr.into_ptr()) }
48 }
49}
50
51#[cfg(test)]
52mod tests {
53 use super::OrderedFontMgr;
54
55 #[test]
56 fn can_use_font_mgr_functions() {
57 let ordered = OrderedFontMgr::default();
58 let _families = ordered.count_families();
59 }
60
61 #[test]
62 fn can_pass_ordered_font_mgr_where_a_font_mgr_is_expected() {
63 let mut ordered = OrderedFontMgr::default();
64 let another = OrderedFontMgr::default();
65 ordered.append(another);
66 }
67
68 #[test]
69 #[cfg(feature = "textlayout")]
70 fn can_find_fonts_in_multiple_mgrs() {
71 use super::FontMgr;
72 use crate::textlayout::TypefaceFontProvider;
73 use std::fs;
74 use std::path::Path;
75
76 let sys_mgr = FontMgr::default();
77 let single_font_provider = |filename: &str| {
78 let path = Path::new(filename);
79 let font_data = fs::read(path).unwrap();
80 let font = sys_mgr.new_from_data(&font_data, None).unwrap();
81 let mut provider = TypefaceFontProvider::new();
82 provider.register_typeface(font, None);
83 provider
84 };
85
86 let bungee_provider = single_font_provider(
88 "../skia-bindings/skia/modules/canvaskit/tests/assets/Bungee-Regular.ttf",
89 );
90 let noto_provider = single_font_provider(
91 "../skia-bindings/skia/modules/canvaskit/tests/assets/NotoSerif-Regular.ttf",
92 );
93
94 let mut ordered = OrderedFontMgr::new();
96 ordered.append(bungee_provider.clone());
97 ordered.append(noto_provider.clone());
98 assert_eq!(ordered.match_family("Bungee").count(), 1);
99 assert_eq!(ordered.match_family("Noto Serif").count(), 1);
100 assert_eq!(ordered.match_family("Nonesuch").count(), 0);
101 }
102}