1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4 
5 use std::borrow::Cow;
6 use std::marker::PhantomData;
7 use winapi::ctypes::wchar_t;
8 use winapi::um::dwrite::IDWriteTextAnalysisSource;
9 use wio::com::ComPtr;
10 
11 use super::*;
12 use crate::com_helpers::Com;
13 
14 pub struct TextAnalysisSource<'a> {
15     native: ComPtr<IDWriteTextAnalysisSource>,
16     phantom: PhantomData<CustomTextAnalysisSourceImpl<'a>>
17 }
18 
19 impl<'a> TextAnalysisSource<'a> {
20     /// Create a new custom TextAnalysisSource for the given text and a trait
21     /// implementation.
22     ///
23     /// Note: this method has no NumberSubsitution specified. See
24     /// `from_text_and_number_subst` if you need number substitution.
from_text( inner: Box<dyn TextAnalysisSourceMethods + 'a>, text: Cow<'a, [wchar_t]>, ) -> TextAnalysisSource<'a>25     pub fn from_text(
26         inner: Box<dyn TextAnalysisSourceMethods + 'a>,
27         text: Cow<'a, [wchar_t]>,
28     ) -> TextAnalysisSource<'a> {
29         let native = unsafe {
30             ComPtr::from_raw(
31                 CustomTextAnalysisSourceImpl::from_text_native(inner, text).into_interface()
32             )
33         };
34         TextAnalysisSource { native, phantom: PhantomData }
35     }
36 
37     /// Create a new custom TextAnalysisSource for the given text and a trait
38     /// implementation.
39     ///
40     /// Note: this method only supports a single `NumberSubstitution` for the
41     /// entire string.
from_text_and_number_subst( inner: Box<dyn TextAnalysisSourceMethods + 'a>, text: Cow<'a, [wchar_t]>, number_subst: NumberSubstitution, ) -> TextAnalysisSource<'a>42     pub fn from_text_and_number_subst(
43         inner: Box<dyn TextAnalysisSourceMethods + 'a>,
44         text: Cow<'a, [wchar_t]>,
45         number_subst: NumberSubstitution,
46     ) -> TextAnalysisSource<'a> {
47         let native = unsafe {
48             ComPtr::from_raw(
49                 CustomTextAnalysisSourceImpl::from_text_and_number_subst_native(
50                     inner,
51                     text,
52                     number_subst,
53                 )
54                 .into_interface()
55             )
56         };
57         TextAnalysisSource { native, phantom: PhantomData }
58     }
59 
as_ptr(&self) -> *mut IDWriteTextAnalysisSource60     pub fn as_ptr(&self) -> *mut IDWriteTextAnalysisSource {
61         self.native.as_raw()
62     }
63 }
64