diff options
Diffstat (limited to 'third_party/rust/dwrote/src/lib.rs')
-rw-r--r-- | third_party/rust/dwrote/src/lib.rs | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/third_party/rust/dwrote/src/lib.rs b/third_party/rust/dwrote/src/lib.rs new file mode 100644 index 0000000000..b392bcaf5a --- /dev/null +++ b/third_party/rust/dwrote/src/lib.rs @@ -0,0 +1,167 @@ +/* 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/. */ + +#![allow(non_upper_case_globals)] + +#[cfg(feature = "serde_serialization")] +extern crate serde; +#[cfg_attr(feature = "serde_serialization", macro_use)] +#[cfg(feature = "serde_serialization")] +extern crate serde_derive; + +#[macro_use] +extern crate lazy_static; +extern crate libc; +extern crate winapi; + +include!("types.rs"); + +use std::ffi::CString; +use std::ptr; +use winapi::Interface; +use winapi::shared::guiddef::REFIID; +use winapi::shared::winerror::S_OK; +use winapi::um::dwrite::DWRITE_FACTORY_TYPE; +use winapi::um::dwrite::DWRITE_FACTORY_TYPE_SHARED; +use winapi::um::dwrite::IDWriteFactory; +use winapi::um::dwrite::IDWriteRenderingParams; +use winapi::um::unknwnbase::IUnknown; +use winapi::um::winnt::LPCSTR; + +pub use winapi::um::winnt::HRESULT; + +mod helpers; +use helpers::ToWide; +use std::os::raw::c_void; + +#[cfg(test)] +mod test; + +// We still use the DWrite structs for things like metrics; re-export them +// here +pub use winapi::shared::windef::RECT; +pub use winapi::um::dcommon::DWRITE_MEASURING_MODE; +pub use winapi::um::dcommon::{ + DWRITE_MEASURING_MODE_GDI_CLASSIC, DWRITE_MEASURING_MODE_GDI_NATURAL, + DWRITE_MEASURING_MODE_NATURAL, +}; +pub use winapi::um::dwrite::DWRITE_FONT_METRICS as FontMetrics0; +pub use winapi::um::dwrite::DWRITE_FONT_SIMULATIONS; +pub use winapi::um::dwrite::DWRITE_GLYPH_OFFSET as GlyphOffset; +pub use winapi::um::dwrite::DWRITE_RENDERING_MODE; +pub use winapi::um::dwrite::DWRITE_TEXTURE_TYPE; +pub use winapi::um::dwrite::{DWRITE_TEXTURE_ALIASED_1x1, DWRITE_TEXTURE_CLEARTYPE_3x1}; +pub use winapi::um::dwrite::{ + DWRITE_FONT_SIMULATIONS_BOLD, DWRITE_FONT_SIMULATIONS_NONE, DWRITE_FONT_SIMULATIONS_OBLIQUE, +}; +pub use winapi::um::dwrite::{DWRITE_GLYPH_RUN, DWRITE_MATRIX}; +pub use winapi::um::dwrite::{ + DWRITE_RENDERING_MODE_ALIASED, DWRITE_RENDERING_MODE_CLEARTYPE_GDI_CLASSIC, + DWRITE_RENDERING_MODE_CLEARTYPE_GDI_NATURAL, DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL, + DWRITE_RENDERING_MODE_CLEARTYPE_NATURAL_SYMMETRIC, DWRITE_RENDERING_MODE_DEFAULT, + DWRITE_RENDERING_MODE_GDI_CLASSIC, DWRITE_RENDERING_MODE_GDI_NATURAL, + DWRITE_RENDERING_MODE_NATURAL, DWRITE_RENDERING_MODE_NATURAL_SYMMETRIC, + DWRITE_RENDERING_MODE_OUTLINE, +}; +pub use winapi::um::dwrite_1::DWRITE_FONT_METRICS1 as FontMetrics1; +pub use winapi::um::dwrite_3::DWRITE_FONT_AXIS_VALUE; +use winapi::um::libloaderapi::{GetProcAddress, LoadLibraryW}; + +#[macro_use] +mod com_helpers; + +mod bitmap_render_target; +pub use bitmap_render_target::BitmapRenderTarget; +mod font; +pub use font::{Font, FontMetrics, InformationalStringId}; +mod font_collection; +pub use font_collection::FontCollection; +mod font_face; +pub use font_face::{FontFace, FontFaceType}; +mod font_fallback; +pub use font_fallback::{FallbackResult, FontFallback}; +mod font_family; +pub use font_family::FontFamily; +mod font_file; +pub use font_file::FontFile; +mod gdi_interop; +pub use gdi_interop::GdiInterop; +mod outline_builder; +pub use outline_builder::OutlineBuilder; +mod rendering_params; +pub use rendering_params::RenderingParams; +mod text_analysis_source; +pub use text_analysis_source::TextAnalysisSource; +mod glyph_run_analysis; +pub use glyph_run_analysis::GlyphRunAnalysis; + +// This is an internal implementation of FontFileLoader, for our utility +// functions. We don't wrap the DWriteFontFileLoader interface and +// related things. +mod font_file_loader_impl; + +// This is an implementation of `FontCollectionLoader` for client code. +mod font_collection_impl; +pub use font_collection_impl::CustomFontCollectionLoaderImpl; + +// This is an implementation of `TextAnalysisSource` for client code. +mod text_analysis_source_impl; +pub use text_analysis_source_impl::{ + CustomTextAnalysisSourceImpl, NumberSubstitution, TextAnalysisSourceMethods, +}; + +// This is an internal implementation of `GeometrySink` so that we can +// expose `IDWriteGeometrySink` in an idiomatic way. +mod geometry_sink_impl; + +lazy_static! { + static ref DWRITE_FACTORY_RAW_PTR: usize = { + unsafe { + type DWriteCreateFactoryType = + extern "system" fn(DWRITE_FACTORY_TYPE, REFIID, *mut *mut IUnknown) -> HRESULT; + + let dwrite_dll = LoadLibraryW("dwrite.dll".to_wide_null().as_ptr()); + assert!(!dwrite_dll.is_null()); + let create_factory_name = CString::new("DWriteCreateFactory").unwrap(); + let dwrite_create_factory_ptr = + GetProcAddress(dwrite_dll, create_factory_name.as_ptr() as LPCSTR); + assert!(!dwrite_create_factory_ptr.is_null()); + + let dwrite_create_factory = mem::transmute::<*const c_void, DWriteCreateFactoryType>( + dwrite_create_factory_ptr as *const _, + ); + + let mut factory: *mut IDWriteFactory = ptr::null_mut(); + let hr = dwrite_create_factory( + DWRITE_FACTORY_TYPE_SHARED, + &IDWriteFactory::uuidof(), + &mut factory as *mut *mut IDWriteFactory as *mut *mut IUnknown, + ); + assert!(hr == S_OK); + factory as usize + } + }; + static ref DEFAULT_DWRITE_RENDERING_PARAMS_RAW_PTR: usize = { + unsafe { + let mut default_rendering_params: *mut IDWriteRenderingParams = ptr::null_mut(); + let hr = (*DWriteFactory()).CreateRenderingParams(&mut default_rendering_params); + assert!(hr == S_OK); + default_rendering_params as usize + } + }; +} // end lazy static + +// FIXME vlad would be nice to return, say, FactoryPtr<IDWriteFactory> +// that has a DerefMut impl, so that we can write +// DWriteFactory().SomeOperation() as opposed to +// (*DWriteFactory()).SomeOperation() +#[allow(non_snake_case)] +fn DWriteFactory() -> *mut IDWriteFactory { + (*DWRITE_FACTORY_RAW_PTR) as *mut IDWriteFactory +} + +#[allow(non_snake_case)] +fn DefaultDWriteRenderParams() -> *mut IDWriteRenderingParams { + (*DEFAULT_DWRITE_RENDERING_PARAMS_RAW_PTR) as *mut IDWriteRenderingParams +} |