Skip to content

Commit 6d658ae

Browse files
committed
Fix AFM handling, a little more safety and debug asserts
1 parent 72b6d07 commit 6d658ae

File tree

4 files changed

+31
-23
lines changed

4 files changed

+31
-23
lines changed

crates/bridge_harfbuzz/src/font_funcs.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,8 @@ unsafe extern "C" fn glyph_origin<
8484
true as sys::hb_bool_t
8585
}
8686
None => {
87+
debug_assert_eq!(*x, 0);
88+
debug_assert_eq!(*y, 0);
8789
*x = 0;
8890
*y = 0;
8991
false as sys::hb_bool_t
@@ -148,6 +150,8 @@ unsafe extern "C" fn glyph_contour_point<
148150
true as sys::hb_bool_t
149151
}
150152
None => {
153+
debug_assert_eq!(*x, 0);
154+
debug_assert_eq!(*y, 0);
151155
*x = 0;
152156
*y = 0;
153157
false as sys::hb_bool_t

crates/xetex_layout/src/c_api/engine.rs

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -452,26 +452,28 @@ pub unsafe extern "C" fn getGlyphs(engine: XeTeXLayoutEngine, glyphs: *mut u32)
452452

453453
#[no_mangle]
454454
pub unsafe extern "C" fn getGlyphAdvances(engine: XeTeXLayoutEngine, advances: *mut f32) {
455-
let hb_positions = (*engine).hb_buffer.get_glyph_position();
455+
let engine = &*engine;
456+
let hb_positions = engine.hb_buffer.get_glyph_position();
456457

457458
for (i, pos) in hb_positions.iter().enumerate() {
458-
let advance = if (*engine).font().layout_dir_vertical() {
459+
let advance = if engine.font().layout_dir_vertical() {
459460
pos.y_advance
460461
} else {
461462
pos.x_advance
462463
};
463464

464-
*advances.add(i) = (*engine).font().units_to_points(advance as f64) as f32;
465+
*advances.add(i) = engine.font().units_to_points(advance as f64) as f32;
465466
}
466467
}
467468

468469
#[no_mangle]
469470
pub unsafe extern "C" fn getGlyphPositions(engine: XeTeXLayoutEngine, positions: *mut FloatPoint) {
470-
let hb_positions = (*engine).hb_buffer.get_glyph_position();
471+
let engine = &mut *engine;
472+
let hb_positions = engine.hb_buffer.get_glyph_position();
471473

472474
let mut x: f32 = 0.0;
473475
let mut y: f32 = 0.0;
474-
let font = (*engine).font();
476+
let font = engine.font();
475477

476478
if font.layout_dir_vertical() {
477479
for (i, pos) in hb_positions.iter().enumerate() {
@@ -494,10 +496,10 @@ pub unsafe extern "C" fn getGlyphPositions(engine: XeTeXLayoutEngine, positions:
494496
(*positions.add(hb_positions.len())).y = -font.units_to_points(y as f64) as f32;
495497
}
496498

497-
if (*engine).extend != 1.0 || (*engine).slant != 0.0 {
499+
if engine.extend != 1.0 || engine.slant != 0.0 {
498500
for i in 0..=hb_positions.len() {
499501
let pos = &mut *positions.add(i);
500-
pos.x = pos.x * (*engine).extend - pos.y * (*engine).slant;
502+
pos.x = pos.x * engine.extend - pos.y * engine.slant;
501503
}
502504
}
503505
}
@@ -565,14 +567,15 @@ pub unsafe extern "C" fn getGraphiteFeatureDefaultSetting(
565567
engine: XeTeXLayoutEngine,
566568
feature_id: u32,
567569
) -> u32 {
568-
let hb_face = (*engine).font().get_hb_font().get_face();
570+
let engine = &*engine;
571+
let hb_face = engine.font().get_hb_font().get_face();
569572
let gr_face = hb_face.get_gr_face();
570573

571574
if !gr_face.is_null() {
572575
let feature = gr_face_find_fref(gr_face, feature_id);
573576
let feature_values = gr_face_featureval_for_lang(
574577
gr_face,
575-
hb::Tag::from_cstr((*engine).language.to_string()).to_raw(),
578+
hb::Tag::from_cstr(engine.language.to_string()).to_raw(),
576579
);
577580

578581
gr_fref_feature_value(feature, feature_values) as u32
@@ -745,7 +748,8 @@ pub unsafe extern "C" fn initGraphiteBreaking(
745748
txt_ptr: *const u16,
746749
txt_len: libc::c_uint,
747750
) -> bool {
748-
let hb_font = (*engine).font().get_hb_font();
751+
let engine = &*engine;
752+
let hb_font = engine.font().get_hb_font();
749753
let hb_face = hb_font.get_face();
750754
let gr_face = hb_face.get_gr_face();
751755
let gr_font = gr_make_font(hb_font.get_ptem(), gr_face);
@@ -761,11 +765,11 @@ pub unsafe extern "C" fn initGraphiteBreaking(
761765

762766
let gr_feature_values = gr_face_featureval_for_lang(
763767
gr_face,
764-
hb::Tag::from_cstr((*engine).language.to_string()).to_raw(),
768+
hb::Tag::from_cstr(engine.language.to_string()).to_raw(),
765769
);
766770

767-
let features = (*engine).features;
768-
for i in (0..(*engine).features.len()).rev() {
771+
let features = engine.features;
772+
for i in (0..engine.features.len()).rev() {
769773
let fref = gr_face_find_fref(gr_face, features[i].tag);
770774
if !fref.is_null() {
771775
gr_fref_set_feature_value(fref, features[i].value as u16, gr_feature_values);
@@ -775,7 +779,7 @@ pub unsafe extern "C" fn initGraphiteBreaking(
775779
GR_SEGMENT.set(gr_make_seg(
776780
gr_font,
777781
gr_face,
778-
(*engine).script.to_raw(),
782+
engine.script.to_raw(),
779783
gr_feature_values,
780784
gr_encform::utf16,
781785
txt_ptr.cast(),

crates/xetex_layout/src/c_api/font.rs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,11 @@ impl XeTeXFontBase {
373373
.to_vec();
374374
let file_ty = afm.rsplit_mut(|c| *c == b'.').next();
375375
if let Some(file_ty) = file_ty {
376-
if file_ty.len() == 4
377-
&& file_ty[1].to_ascii_lowercase() == b'p'
378-
&& file_ty[2].to_ascii_lowercase() == b'f'
376+
if file_ty.len() == 3
377+
&& file_ty[0].to_ascii_lowercase() == b'p'
378+
&& file_ty[1].to_ascii_lowercase() == b'f'
379379
{
380-
file_ty.copy_from_slice(b".afm");
380+
file_ty.copy_from_slice(b"afm");
381381
}
382382
}
383383
afm.push(0);

crates/xetex_layout/src/c_api/manager.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ unsafe fn base_get_op_size_rec_and_style_flags(font: &mut Font) {
126126
Err(_) => return,
127127
};
128128

129-
let size_rec = FontManager::get_op_size(&mut xfont);
129+
let size_rec = FontManager::get_op_size(&xfont);
130130
if let Some(size_rec) = size_rec {
131131
font.op_size_info.design_size = size_rec.design_size;
132132
if size_rec.sub_family_id != 0
@@ -668,7 +668,7 @@ impl FontManager {
668668
name.as_ptr()
669669
}
670670

671-
pub unsafe fn get_design_size(&self, font: XeTeXFont) -> f64 {
671+
pub fn get_design_size(&self, font: &XeTeXFontBase) -> f64 {
672672
let size_rec = Self::get_op_size(font);
673673
match size_rec {
674674
None => 10.0,
@@ -740,8 +740,8 @@ impl FontManager {
740740
list.insert(0, str.into());
741741
}
742742

743-
pub unsafe fn get_op_size(font: XeTeXFont) -> Option<OpSizeRec> {
744-
let hb_font = (*font).try_get_hb_font()?;
743+
pub fn get_op_size(font: &XeTeXFontBase) -> Option<OpSizeRec> {
744+
let hb_font = font.try_get_hb_font()?;
745745

746746
let face = hb_font.get_face();
747747

@@ -823,7 +823,7 @@ pub unsafe extern "C" fn getFullName(font: RawPlatformFontRef) -> *const libc::c
823823

824824
#[no_mangle]
825825
pub unsafe extern "C" fn getDesignSize(font: XeTeXFont) -> f64 {
826-
FontManager::with_font_manager(|mgr| mgr.get_design_size(font))
826+
FontManager::with_font_manager(|mgr| mgr.get_design_size(&*font))
827827
}
828828

829829
#[no_mangle]

0 commit comments

Comments
 (0)