diff options
Diffstat (limited to 'third_party/rust/dwrote/src/test.rs')
-rw-r--r-- | third_party/rust/dwrote/src/test.rs | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/third_party/rust/dwrote/src/test.rs b/third_party/rust/dwrote/src/test.rs new file mode 100644 index 0000000000..1396ab6df6 --- /dev/null +++ b/third_party/rust/dwrote/src/test.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/. */ + +use super::*; +use std::sync::Arc; + +#[test] +fn test_system_family_iter() { + let system_fc = FontCollection::system(); + let count = system_fc.families_iter().count(); + assert!(count > 0); + assert!(system_fc + .families_iter() + .find(|f| f.name() == "Arial") + .is_some()); +} + +#[test] +fn test_descriptor_round_trip() { + let system_fc = FontCollection::system(); + + let arial_family = system_fc.get_font_family_by_name("Arial").unwrap(); + let arial_font = arial_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + + let descriptor = arial_font.to_descriptor(); + assert!(descriptor.family_name == "Arial"); + + let arial_font_2 = system_fc.get_font_from_descriptor(&descriptor).unwrap(); + let descriptor2 = arial_font_2.to_descriptor(); + assert_eq!(descriptor, descriptor2); +} + +#[test] +fn test_get_font_file_bytes() { + let system_fc = FontCollection::system(); + + let arial_family = system_fc.get_font_family_by_name("Arial").unwrap(); + let arial_font = arial_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + let face = arial_font.create_font_face(); + let files = face.get_files(); + assert!(files.len() > 0); + + let bytes = files[0].get_font_file_bytes(); + assert!(bytes.len() > 0); +} + +#[test] +fn test_font_file_is_monospace() { + let system_fc = FontCollection::system(); + + let arial_family = system_fc.get_font_family_by_name("Arial").unwrap(); + let arial_font = arial_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + assert!(arial_font.is_monospace() == Some(false)); + + let courier_new_family = system_fc.get_font_family_by_name("Courier New").unwrap(); + let courier_new_font = courier_new_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + assert!(courier_new_font.is_monospace() == Some(true)); +} + +#[test] +fn test_create_font_file_from_bytes() { + let system_fc = FontCollection::system(); + + let arial_family = system_fc.get_font_family_by_name("Arial").unwrap(); + let arial_font = arial_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + let face = arial_font.create_font_face(); + let files = face.get_files(); + assert!(files.len() > 0); + + let bytes = files[0].get_font_file_bytes(); + assert!(bytes.len() > 0); + + // now go back + let new_font = FontFile::new_from_data(Arc::new(bytes)); + assert!(new_font.is_some()); + + let _new_font = new_font.unwrap(); +} + +#[test] +fn test_glyph_image() { + let system_fc = FontCollection::system(); + let arial_family = system_fc.get_font_family_by_name("Arial").unwrap(); + let arial_font = arial_family.get_first_matching_font( + FontWeight::Regular, + FontStretch::Normal, + FontStyle::Normal, + ); + + let face = arial_font.create_font_face(); + let a_index = face.get_glyph_indices(&['A' as u32])[0]; + + let gm = face.get_design_glyph_metrics(&[a_index], false)[0]; + + let device_pixel_ratio = 1.0f32; + let em_size = 10.0f32; + + let design_units_per_em = match face.metrics() { + FontMetrics::Metrics0(ref metrics) => metrics.designUnitsPerEm, + FontMetrics::Metrics1(ref metrics) => metrics.designUnitsPerEm, + }; + let design_units_per_pixel = design_units_per_em as f32 / 16.; + + let scaled_design_units_to_pixels = (em_size * device_pixel_ratio) / design_units_per_pixel; + + let width = (gm.advanceWidth as i32 - (gm.leftSideBearing + gm.rightSideBearing)) as f32 + * scaled_design_units_to_pixels; + let height = (gm.advanceHeight as i32 - (gm.topSideBearing + gm.bottomSideBearing)) as f32 + * scaled_design_units_to_pixels; + let x = (-gm.leftSideBearing) as f32 * scaled_design_units_to_pixels; + let y = (gm.verticalOriginY - gm.topSideBearing) as f32 * scaled_design_units_to_pixels; + + // FIXME I'm pretty sure we need to do a proper RoundOut type + // operation on this rect to properly handle any aliasing + let left_i = x.floor() as i32; + let top_i = (height - y).floor() as i32; + let width_u = width.ceil() as u32; + let height_u = height.ceil() as u32; + + println!( + "GlyphDimensions: {} {} {} {}", + left_i, top_i, width_u, height_u + ); + + let gdi_interop = GdiInterop::create(); + let rt = gdi_interop.create_bitmap_render_target(width_u, height_u); + let rp = RenderingParams::create_for_primary_monitor(); + rt.set_pixels_per_dip(device_pixel_ratio); + rt.draw_glyph_run( + x as f32, + y as f32, + DWRITE_MEASURING_MODE_NATURAL, + &face, + em_size, + &[a_index], + &[0f32], + &[GlyphOffset { + advanceOffset: 0., + ascenderOffset: 0., + }], + &rp, + &(255.0f32, 255.0f32, 255.0f32), + ); + let bytes = rt.get_opaque_values_as_mask(); + println!("bytes length: {}", bytes.len()); +} |