@@ -8,7 +8,7 @@ use std::cell::UnsafeCell;
8
8
use std:: mem:: zeroed;
9
9
10
10
use comptr:: ComPtr ;
11
- use super :: { FontMetrics , FontFile , DefaultDWriteRenderParams } ;
11
+ use super :: { FontMetrics , FontFile , DefaultDWriteRenderParams , DWriteFactory } ;
12
12
13
13
use winapi;
14
14
@@ -35,18 +35,44 @@ impl FontFace {
35
35
( * self . native . get ( ) ) . as_ptr ( )
36
36
}
37
37
38
+ unsafe fn get_raw_files ( & self ) -> Vec < * mut winapi:: IDWriteFontFile > {
39
+ let mut number_of_files: u32 = 0 ;
40
+ let hr = ( * self . native . get ( ) ) . GetFiles ( & mut number_of_files, ptr:: null_mut ( ) ) ;
41
+ assert ! ( hr == 0 ) ;
42
+
43
+ let mut file_ptrs: Vec < * mut winapi:: IDWriteFontFile > =
44
+ vec ! [ ptr:: null_mut( ) ; number_of_files as usize ] ;
45
+ let hr = ( * self . native . get ( ) ) . GetFiles ( & mut number_of_files, file_ptrs. as_mut_ptr ( ) ) ;
46
+ assert ! ( hr == 0 ) ;
47
+ file_ptrs
48
+ }
49
+
38
50
pub fn get_files ( & self ) -> Vec < FontFile > {
39
51
unsafe {
40
- let mut number_of_files: u32 = 0 ;
41
- let hr = ( * self . native . get ( ) ) . GetFiles ( & mut number_of_files, ptr:: null_mut ( ) ) ;
42
- assert ! ( hr == 0 ) ;
52
+ let file_ptrs = self . get_raw_files ( ) ;
53
+ file_ptrs. iter ( ) . map ( |p| FontFile :: take ( ComPtr :: already_addrefed ( * p) ) ) . collect ( )
54
+ }
55
+ }
43
56
44
- let mut file_ptrs: Vec < * mut winapi:: IDWriteFontFile > =
45
- vec ! [ ptr:: null_mut( ) ; number_of_files as usize ] ;
46
- let hr = ( * self . native . get ( ) ) . GetFiles ( & mut number_of_files, file_ptrs. as_mut_ptr ( ) ) ;
57
+ pub fn create_font_face_with_simulations ( & self , simulations : winapi:: DWRITE_FONT_SIMULATIONS ) -> FontFace {
58
+ unsafe {
59
+ let file_ptrs = self . get_raw_files ( ) ;
60
+ let face_type = ( * self . native . get ( ) ) . GetType ( ) ;
61
+ let face_index = ( * self . native . get ( ) ) . GetIndex ( ) ;
62
+ let mut face: ComPtr < winapi:: IDWriteFontFace > = ComPtr :: new ( ) ;
63
+ let hr = ( * DWriteFactory ( ) ) . CreateFontFace (
64
+ face_type,
65
+ file_ptrs. len ( ) as u32 ,
66
+ file_ptrs. as_ptr ( ) ,
67
+ face_index,
68
+ simulations,
69
+ face. getter_addrefs ( )
70
+ ) ;
71
+ for p in file_ptrs {
72
+ let _ = ComPtr :: < winapi:: IDWriteFontFile > :: already_addrefed ( p) ;
73
+ }
47
74
assert ! ( hr == 0 ) ;
48
-
49
- file_ptrs. iter ( ) . map ( |p| FontFile :: take ( ComPtr :: already_addrefed ( * p) ) ) . collect ( )
75
+ FontFace :: take ( face)
50
76
}
51
77
}
52
78
0 commit comments