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
|
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
use std::cell::UnsafeCell;
use std::ptr;
use winapi::um::dwrite::IDWriteLocalizedStrings;
use winapi::um::dwrite::{IDWriteFont, IDWriteFontCollection, IDWriteFontFamily};
use wio::com::ComPtr;
use super::*;
use helpers::*;
pub struct FontFamily {
native: UnsafeCell<ComPtr<IDWriteFontFamily>>,
}
impl FontFamily {
pub fn take(native: ComPtr<IDWriteFontFamily>) -> FontFamily {
FontFamily {
native: UnsafeCell::new(native),
}
}
pub unsafe fn as_ptr(&self) -> *mut IDWriteFontFamily {
(*self.native.get()).as_raw()
}
pub fn name(&self) -> String {
unsafe {
let mut family_names: *mut IDWriteLocalizedStrings = ptr::null_mut();
let hr = (*self.native.get()).GetFamilyNames(&mut family_names);
assert!(hr == 0);
get_locale_string(&mut ComPtr::from_raw(family_names))
}
}
pub fn get_first_matching_font(
&self,
weight: FontWeight,
stretch: FontStretch,
style: FontStyle,
) -> Font {
unsafe {
let mut font: *mut IDWriteFont = ptr::null_mut();
let hr = (*self.native.get()).GetFirstMatchingFont(
weight.t(),
stretch.t(),
style.t(),
&mut font,
);
assert!(hr == 0);
Font::take(ComPtr::from_raw(font))
}
}
pub fn get_font_collection(&self) -> FontCollection {
unsafe {
let mut collection: *mut IDWriteFontCollection = ptr::null_mut();
let hr = (*self.native.get()).GetFontCollection(&mut collection);
assert!(hr == 0);
FontCollection::take(ComPtr::from_raw(collection))
}
}
pub fn get_font_count(&self) -> u32 {
unsafe { (*self.native.get()).GetFontCount() }
}
pub fn get_font(&self, index: u32) -> Font {
unsafe {
let mut font: *mut IDWriteFont = ptr::null_mut();
let hr = (*self.native.get()).GetFont(index, &mut font);
assert!(hr == 0);
Font::take(ComPtr::from_raw(font))
}
}
}
|