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 #![allow(non_upper_case_globals)]
6 
7 #[cfg(feature = "serde_serialization")]
8 extern crate serde;
9 #[cfg_attr(feature = "serde_serialization", macro_use)]
10 #[cfg(feature = "serde_serialization")]
11 extern crate serde_derive;
12 
13 #[macro_use]
14 extern crate lazy_static;
15 extern crate libc;
16 extern crate winapi;
17 
18 include!("types.rs");
19 
20 use std::ffi::CString;
21 use std::ptr;
22 use winapi::Interface;
23 use winapi::shared::guiddef::REFIID;
24 use winapi::shared::winerror::S_OK;
25 use winapi::um::dwrite::DWRITE_FACTORY_TYPE;
26 use winapi::um::dwrite::DWRITE_FACTORY_TYPE_SHARED;
27 use winapi::um::dwrite::IDWriteFactory;
28 use winapi::um::dwrite::IDWriteRenderingParams;
29 use winapi::um::unknwnbase::IUnknown;
30 use winapi::um::winnt::LPCSTR;
31 
32 pub use winapi::um::winnt::HRESULT;
33 
34 mod helpers;
35 use helpers::ToWide;
36 use std::os::raw::c_void;
37 
38 #[cfg(test)]
39 mod test;
40 
41 // We still use the DWrite structs for things like metrics; re-export them
42 // here
43 pub use winapi::shared::windef::RECT;
44 pub use winapi::um::dcommon::DWRITE_MEASURING_MODE;
45 pub use winapi::um::dcommon::{
46     DWRITE_MEASURING_MODE_GDI_CLASSIC, DWRITE_MEASURING_MODE_GDI_NATURAL,
47     DWRITE_MEASURING_MODE_NATURAL,
48 };
49 pub use winapi::um::dwrite::DWRITE_FONT_METRICS as FontMetrics0;
50 pub use winapi::um::dwrite::DWRITE_FONT_SIMULATIONS;
51 pub use winapi::um::dwrite::DWRITE_GLYPH_OFFSET as GlyphOffset;
52 pub use winapi::um::dwrite::DWRITE_RENDERING_MODE;
53 pub use winapi::um::dwrite::DWRITE_TEXTURE_TYPE;
54 pub use winapi::um::dwrite::{DWRITE_TEXTURE_ALIASED_1x1, DWRITE_TEXTURE_CLEARTYPE_3x1};
55 pub use winapi::um::dwrite::{
56     DWRITE_FONT_SIMULATIONS_BOLD, DWRITE_FONT_SIMULATIONS_NONE, DWRITE_FONT_SIMULATIONS_OBLIQUE,
57 };
58 pub use winapi::um::dwrite::{DWRITE_GLYPH_RUN, DWRITE_MATRIX};
59 pub use winapi::um::dwrite::{
60     DWRITE_RENDERING_MODE_ALIASED, DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC,
61     DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL, DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL,
62     DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC, DWRITE_RENDERING_MODE_DEFAULT,
63     DWRITE_RENDERING_MODE_GDI_CLASSIC, DWRITE_RENDERING_MODE_GDI_NATURAL,
64     DWRITE_RENDERING_MODE_NATURAL, DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC,
65     DWRITE_RENDERING_MODE_OUTLINE,
66 };
67 pub use winapi::um::dwrite_1::DWRITE_FONT_METRICS1 as FontMetrics1;
68 pub use winapi::um::dwrite_3::DWRITE_FONT_AXIS_VALUE;
69 use winapi::um::libloaderapi::{GetProcAddress, LoadLibraryW};
70 
71 #[macro_use]
72 mod com_helpers;
73 
74 mod bitmap_render_target;
75 pub use bitmap_render_target::BitmapRenderTarget;
76 mod font;
77 pub use font::{Font, FontMetrics, InformationalStringId};
78 mod font_collection;
79 pub use font_collection::FontCollection;
80 mod font_face;
81 pub use font_face::{FontFace, FontFaceType};
82 mod font_fallback;
83 pub use font_fallback::{FallbackResult, FontFallback};
84 mod font_family;
85 pub use font_family::FontFamily;
86 mod font_file;
87 pub use font_file::FontFile;
88 mod gdi_interop;
89 pub use gdi_interop::GdiInterop;
90 mod outline_builder;
91 pub use outline_builder::OutlineBuilder;
92 mod rendering_params;
93 pub use rendering_params::RenderingParams;
94 mod text_analysis_source;
95 pub use text_analysis_source::TextAnalysisSource;
96 mod glyph_run_analysis;
97 pub use glyph_run_analysis::GlyphRunAnalysis;
98 
99 // This is an internal implementation of FontFileLoader, for our utility
100 // functions.  We don't wrap the DWriteFontFileLoader interface and
101 // related things.
102 mod font_file_loader_impl;
103 
104 // This is an implementation of `FontCollectionLoader` for client code.
105 mod font_collection_impl;
106 pub use font_collection_impl::CustomFontCollectionLoaderImpl;
107 
108 // This is an implementation of `TextAnalysisSource` for client code.
109 mod text_analysis_source_impl;
110 pub use text_analysis_source_impl::{
111     CustomTextAnalysisSourceImpl, NumberSubstitution, TextAnalysisSourceMethods,
112 };
113 
114 // This is an internal implementation of `GeometrySink` so that we can
115 // expose `IDWriteGeometrySink` in an idiomatic way.
116 mod geometry_sink_impl;
117 
118 lazy_static! {
119     static ref DWRITE_FACTORY_RAW_PTR: usize = {
120         unsafe {
121             type DWriteCreateFactoryType =
122                 extern "system" fn(DWRITE_FACTORY_TYPE, REFIID, *mut *mut IUnknown) -> HRESULT;
123 
124             let dwrite_dll = LoadLibraryW("dwrite.dll".to_wide_null().as_ptr());
125             assert!(!dwrite_dll.is_null());
126             let create_factory_name = CString::new("DWriteCreateFactory").unwrap();
127             let dwrite_create_factory_ptr =
128                 GetProcAddress(dwrite_dll, create_factory_name.as_ptr() as LPCSTR);
129             assert!(!dwrite_create_factory_ptr.is_null());
130 
131             let dwrite_create_factory = mem::transmute::<*const c_void, DWriteCreateFactoryType>(
132                 dwrite_create_factory_ptr as *const _,
133             );
134 
135             let mut factory: *mut IDWriteFactory = ptr::null_mut();
136             let hr = dwrite_create_factory(
137                 DWRITE_FACTORY_TYPE_SHARED,
138                 &IDWriteFactory::uuidof(),
139                 &mut factory as *mut *mut IDWriteFactory as *mut *mut IUnknown,
140             );
141             assert!(hr == S_OK);
142             factory as usize
143         }
144     };
145     static ref DEFAULT_DWRITE_RENDERING_PARAMS_RAW_PTR: usize = {
146         unsafe {
147             let mut default_rendering_params: *mut IDWriteRenderingParams = ptr::null_mut();
148             let hr = (*DWriteFactory()).CreateRenderingParams(&mut default_rendering_params);
149             assert!(hr == S_OK);
150             default_rendering_params as usize
151         }
152     };
153 } // end lazy static
154 
155 // FIXME vlad would be nice to return, say, FactoryPtr<IDWriteFactory>
156 // that has a DerefMut impl, so that we can write
157 // DWriteFactory().SomeOperation() as opposed to
158 // (*DWriteFactory()).SomeOperation()
159 #[allow(non_snake_case)]
DWriteFactory() -> *mut IDWriteFactory160 fn DWriteFactory() -> *mut IDWriteFactory {
161     (*DWRITE_FACTORY_RAW_PTR) as *mut IDWriteFactory
162 }
163 
164 #[allow(non_snake_case)]
DefaultDWriteRenderParams() -> *mut IDWriteRenderingParams165 fn DefaultDWriteRenderParams() -> *mut IDWriteRenderingParams {
166     (*DEFAULT_DWRITE_RENDERING_PARAMS_RAW_PTR) as *mut IDWriteRenderingParams
167 }
168