1 /// The implementation of an actual font implementation 2 /// 3 /// This exists since for the image rendering task, we want to use 4 /// the system font. But in wasm application, we want the browser 5 /// to handle all the font issue. 6 /// 7 /// Thus we need different mechanism for the font implementation 8 9 #[cfg(all( 10 not(all(target_arch = "wasm32", not(target_os = "wasi"))), 11 feature = "ttf" 12 ))] 13 mod ttf; 14 #[cfg(all( 15 not(all(target_arch = "wasm32", not(target_os = "wasi"))), 16 feature = "ttf" 17 ))] 18 use ttf::FontDataInternal; 19 20 #[cfg(all( 21 not(target_arch = "wasm32"), 22 not(target_os = "wasi"), 23 feature = "ab_glyph" 24 ))] 25 mod ab_glyph; 26 #[cfg(all( 27 not(target_arch = "wasm32"), 28 not(target_os = "wasi"), 29 feature = "ab_glyph" 30 ))] 31 pub use self::ab_glyph::register_font; 32 #[cfg(all( 33 not(target_arch = "wasm32"), 34 not(target_os = "wasi"), 35 feature = "ab_glyph", 36 not(feature = "ttf") 37 ))] 38 use self::ab_glyph::FontDataInternal; 39 40 #[cfg(all( 41 not(all(target_arch = "wasm32", not(target_os = "wasi"))), 42 not(feature = "ttf"), 43 not(feature = "ab_glyph") 44 ))] 45 mod naive; 46 #[cfg(all( 47 not(all(target_arch = "wasm32", not(target_os = "wasi"))), 48 not(feature = "ttf"), 49 not(feature = "ab_glyph") 50 ))] 51 use naive::FontDataInternal; 52 53 #[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))] 54 mod web; 55 #[cfg(all(target_arch = "wasm32", not(target_os = "wasi")))] 56 use web::FontDataInternal; 57 58 mod font_desc; 59 pub use font_desc::*; 60 61 /// Represents a box where a text label can be fit 62 pub type LayoutBox = ((i32, i32), (i32, i32)); 63 64 pub trait FontData: Clone { 65 type ErrorType: Sized + std::error::Error + Clone; new(family: FontFamily, style: FontStyle) -> Result<Self, Self::ErrorType>66 fn new(family: FontFamily, style: FontStyle) -> Result<Self, Self::ErrorType>; estimate_layout(&self, size: f64, text: &str) -> Result<LayoutBox, Self::ErrorType>67 fn estimate_layout(&self, size: f64, text: &str) -> Result<LayoutBox, Self::ErrorType>; draw<E, DrawFunc: FnMut(i32, i32, f32) -> Result<(), E>>( &self, _pos: (i32, i32), _size: f64, _text: &str, _draw: DrawFunc, ) -> Result<Result<(), E>, Self::ErrorType>68 fn draw<E, DrawFunc: FnMut(i32, i32, f32) -> Result<(), E>>( 69 &self, 70 _pos: (i32, i32), 71 _size: f64, 72 _text: &str, 73 _draw: DrawFunc, 74 ) -> Result<Result<(), E>, Self::ErrorType> { 75 panic!("The font implementation is unable to draw text"); 76 } 77 } 78