Skip to content

Commit 84a7b12

Browse files
committed
Fix missing post table field in opentype definition, PostMetrics and Os2Metrics types
1 parent cb3b1e9 commit 84a7b12

File tree

3 files changed

+56
-51
lines changed

3 files changed

+56
-51
lines changed

doodle-formats/src/format/opentype.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1186,6 +1186,7 @@ pub fn main(module: &mut FormatModule, base: &BaseModule) -> FormatRef {
11861186
("version", version16_16(base)),
11871187
("italic_angle", fixed32be(base)),
11881188
("underline_position", s16be(base)),
1189+
("underline_thickness", s16be(base)),
11891190
("is_fixed_pitch", base.u32be()), // nonzero <=> fixed pitch
11901191
("min_mem_type42", base.u32be()),
11911192
("max_mem_type42", base.u32be()),

generated/api_helper.rs

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -604,11 +604,18 @@ pub mod otf_metrics {
604604
lang_tag: Option<String>,
605605
}
606606

607-
// STUB - placeholder for selective field-summary
608-
type Os2Metrics = OpentypeOs2;
607+
#[derive(Clone, Debug)]
608+
struct Os2Metrics {
609+
version: u16,
610+
// STUB - is anything else relevant?
611+
}
609612

610-
// STUB - placeholder for selective field-summary
611-
type PostMetrics = OpentypePost;
613+
#[derive(Clone, Debug)]
614+
struct PostMetrics {
615+
version: u32,
616+
is_fixed_pitch: bool,
617+
// STUB - is anything else relevant?
618+
}
612619

613620
#[derive(Clone, Debug)]
614621
pub struct RequiredTableMetrics {
@@ -756,27 +763,10 @@ pub mod otf_metrics {
756763
}
757764

758765
fn utf16be_convert(buf: &[u8]) -> String {
759-
// NOTE - taken from the source of nightly-only String::from_utf16be_lossy
760-
match (cfg!(target_endian = "big"), unsafe {
761-
buf.align_to::<u16>()
762-
}) {
763-
(true, ([], v, [])) => String::from_utf16_lossy(v),
764-
(true, ([], v, [_remainder])) => String::from_utf16_lossy(v) + "\u{FFFD}",
765-
_ => {
766-
let mut iter = buf.chunks_exact(2);
767-
let string = char::decode_utf16(iter.by_ref().map(|hilo| match hilo {
768-
&[hi, lo] => u16::from_be_bytes([hi, lo]),
769-
_ => unreachable!("bad hilo"),
770-
}))
771-
.map(|r| r.unwrap_or(char::REPLACEMENT_CHARACTER))
772-
.collect();
773-
if iter.remainder().is_empty() {
774-
string
775-
} else {
776-
string + "\u{FFFD}"
777-
}
778-
}
779-
}
766+
UTF_16BE
767+
.decode(buf, DecoderTrap::Ignore)
768+
.unwrap()
769+
.to_owned()
780770
}
781771

782772
pub fn analyze_table_directory(dir: &OpentypeFontDirectory) -> TestResult<SingleFontMetrics> {
@@ -886,13 +876,16 @@ pub mod otf_metrics {
886876
};
887877
let os2 = {
888878
let os2 = &dir.table_links.os2;
889-
// FIXME - implement type for Os2Metrics
890-
os2.clone()
879+
Os2Metrics {
880+
version: os2.version,
881+
}
891882
};
892883
let post = {
893884
let post = &dir.table_links.post;
894-
// FIXME - implement type for PostMetrics
895-
post.clone()
885+
PostMetrics {
886+
version: post.version,
887+
is_fixed_pitch: post.is_fixed_pitch != 0,
888+
}
896889
};
897890
RequiredTableMetrics {
898891
cmap,
@@ -1233,7 +1226,15 @@ pub mod otf_metrics {
12331226

12341227
fn show_post_metrics(post: &PostMetrics) {
12351228
// STUB - Metrics is just an alias for the raw type, enrich and refactor if appropriate
1236-
println!("post: version {}", format_version16dot16(post.version));
1229+
println!(
1230+
"post: version {} ({})",
1231+
format_version16dot16(post.version),
1232+
if post.is_fixed_pitch {
1233+
"monospaced"
1234+
} else {
1235+
"proportionally spaced"
1236+
}
1237+
);
12371238
}
12381239

12391240
// NOTE - scaffolding to mark the values we currently parse into u16 but which are logically i16, to flag changes to the gencode API as they crop up

generated/sample_codegen.rs

Lines changed: 24 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ pub struct deflate_main_codes_reference {
347347
}
348348

349349
#[derive(Debug, Clone)]
350-
pub enum deflate_main_codes__dupX1 {
350+
pub enum deflate_main_codes {
351351
literal(u8),
352352
reference(deflate_main_codes_reference),
353353
}
@@ -364,7 +364,7 @@ pub struct deflate_dynamic_huffman {
364364
literal_length_alphabet_code_lengths_value: Vec<u8>,
365365
distance_alphabet_code_lengths_value: Vec<u8>,
366366
codes: Vec<deflate_dynamic_huffman_codes>,
367-
codes_values: Vec<deflate_main_codes__dupX1>,
367+
codes_values: Vec<deflate_main_codes>,
368368
}
369369

370370
#[derive(Debug, Clone)]
@@ -384,7 +384,7 @@ pub struct deflate_fixed_huffman_codes {
384384
#[derive(Debug, Clone)]
385385
pub struct deflate_fixed_huffman {
386386
codes: Vec<deflate_fixed_huffman_codes>,
387-
codes_values: Vec<deflate_main_codes__dupX1>,
387+
codes_values: Vec<deflate_main_codes>,
388388
}
389389

390390
#[derive(Debug, Clone)]
@@ -393,11 +393,11 @@ pub struct deflate_uncompressed {
393393
len: u16,
394394
nlen: u16,
395395
bytes: Vec<u8>,
396-
codes_values: Vec<deflate_main_codes__dupX1>,
396+
codes_values: Vec<deflate_main_codes>,
397397
}
398398

399399
#[derive(Debug, Clone)]
400-
pub enum deflate_main_codes {
400+
pub enum deflate_main_codes__dupX1 {
401401
dynamic_huffman(deflate_dynamic_huffman),
402402
fixed_huffman(deflate_fixed_huffman),
403403
uncompressed(deflate_uncompressed),
@@ -407,13 +407,13 @@ pub enum deflate_main_codes {
407407
pub struct deflate_block {
408408
r#final: u8,
409409
r#type: u8,
410-
data: deflate_main_codes,
410+
data: deflate_main_codes__dupX1,
411411
}
412412

413413
#[derive(Debug, Clone)]
414414
pub struct deflate_main {
415415
blocks: Vec<deflate_block>,
416-
codes: Vec<deflate_main_codes__dupX1>,
416+
codes: Vec<deflate_main_codes>,
417417
inflate: Vec<u8>,
418418
}
419419

@@ -1861,6 +1861,7 @@ pub struct opentype_post_table {
18611861
version: u32,
18621862
italic_angle: opentype_post_table_italic_angle,
18631863
underline_position: u16,
1864+
underline_thickness: u16,
18641865
is_fixed_pitch: u32,
18651866
min_mem_type42: u32,
18661867
max_mem_type42: u32,
@@ -5947,6 +5948,7 @@ fn Decoder_opentype_post_table<'input>(
59475948
})
59485949
})())?;
59495950
let underline_position = ((|| PResult::Ok((Decoder24(_input))?))())?;
5951+
let underline_thickness = ((|| PResult::Ok((Decoder24(_input))?))())?;
59505952
let is_fixed_pitch = ((|| PResult::Ok((Decoder21(_input))?))())?;
59515953
let min_mem_type42 = ((|| PResult::Ok((Decoder21(_input))?))())?;
59525954
let max_mem_type42 = ((|| PResult::Ok((Decoder21(_input))?))())?;
@@ -6012,6 +6014,7 @@ fn Decoder_opentype_post_table<'input>(
60126014
version,
60136015
italic_angle,
60146016
underline_position,
6017+
underline_thickness,
60156018
is_fixed_pitch,
60166019
min_mem_type42,
60176020
max_mem_type42,
@@ -10151,11 +10154,11 @@ fn Decoder_deflate_main<'input>(_input: &mut Parser<'input>) -> Result<deflate_m
1015110154
PResult::Ok(
1015210155
(try_flat_map_vec(blocks.iter().cloned(), |x: deflate_block| {
1015310156
PResult::Ok(match x.data.clone() {
10154-
deflate_main_codes::uncompressed(y) => y.codes_values.clone(),
10157+
deflate_main_codes__dupX1::uncompressed(y) => y.codes_values.clone(),
1015510158

10156-
deflate_main_codes::fixed_huffman(y) => y.codes_values.clone(),
10159+
deflate_main_codes__dupX1::fixed_huffman(y) => y.codes_values.clone(),
1015710160

10158-
deflate_main_codes::dynamic_huffman(y) => y.codes_values.clone(),
10161+
deflate_main_codes__dupX1::dynamic_huffman(y) => y.codes_values.clone(),
1015910162
})
1016010163
}))?,
1016110164
)
@@ -10164,12 +10167,12 @@ fn Decoder_deflate_main<'input>(_input: &mut Parser<'input>) -> Result<deflate_m
1016410167
PResult::Ok(
1016510168
(try_flat_map_append_vec(
1016610169
codes.iter().cloned(),
10167-
|tuple_var: (&Vec<u8>, deflate_main_codes__dupX1)| {
10170+
|tuple_var: (&Vec<u8>, deflate_main_codes)| {
1016810171
PResult::Ok(match tuple_var {
1016910172
(buffer, symbol) => match symbol {
10170-
deflate_main_codes__dupX1::literal(b) => [b].to_vec(),
10173+
deflate_main_codes::literal(b) => [b].to_vec(),
1017110174

10172-
deflate_main_codes__dupX1::reference(r) => {
10175+
deflate_main_codes::reference(r) => {
1017310176
let ix =
1017410177
(try_sub!((buffer.len()) as u32, (r.distance.clone()) as u32))
1017510178
as usize;
@@ -10208,17 +10211,17 @@ fn Decoder_deflate_block<'input>(_input: &mut Parser<'input>) -> Result<deflate_
1020810211
PResult::Ok(match r#type {
1020910212
0u8 => {
1021010213
let inner = (Decoder_deflate_uncompressed(_input))?;
10211-
deflate_main_codes::uncompressed(inner)
10214+
deflate_main_codes__dupX1::uncompressed(inner)
1021210215
}
1021310216

1021410217
1u8 => {
1021510218
let inner = (Decoder_deflate_fixed_huffman(_input))?;
10216-
deflate_main_codes::fixed_huffman(inner)
10219+
deflate_main_codes__dupX1::fixed_huffman(inner)
1021710220
}
1021810221

1021910222
2u8 => {
1022010223
let inner = (Decoder_deflate_dynamic_huffman(_input))?;
10221-
deflate_main_codes::dynamic_huffman(inner)
10224+
deflate_main_codes__dupX1::dynamic_huffman(inner)
1022210225
}
1022310226

1022410227
_other => {
@@ -10408,7 +10411,7 @@ fn Decoder_deflate_uncompressed<'input>(
1040810411
let codes_values = ((|| {
1040910412
PResult::Ok(
1041010413
(try_flat_map_vec(bytes.iter().cloned(), |x: u8| {
10411-
PResult::Ok([deflate_main_codes__dupX1::literal(x)].to_vec())
10414+
PResult::Ok([deflate_main_codes::literal(x)].to_vec())
1041210415
}))?,
1041310416
)
1041410417
})())?;
@@ -12197,7 +12200,7 @@ fn Decoder_deflate_fixed_huffman<'input>(
1219712200
256u16 => [].to_vec(),
1219812201

1219912202
257u16..=285u16 => match x.extra.clone() {
12200-
Some(ref rec) => [deflate_main_codes__dupX1::reference(
12203+
Some(ref rec) => [deflate_main_codes::reference(
1220112204
deflate_main_codes_reference {
1220212205
length: rec.length.clone(),
1220312206
distance: rec.distance_record.distance.clone(),
@@ -12212,7 +12215,7 @@ fn Decoder_deflate_fixed_huffman<'input>(
1221212215

1221312216
286u16..=287u16 => [].to_vec(),
1221412217

12215-
_ => [deflate_main_codes__dupX1::literal((x.code.clone()) as u8)].to_vec(),
12218+
_ => [deflate_main_codes::literal((x.code.clone()) as u8)].to_vec(),
1221612219
})
1221712220
}))?,
1221812221
)
@@ -13721,7 +13724,7 @@ v => {
1372113724
256u16 => [].to_vec(),
1372213725

1372313726
257u16..=285u16 => match x.extra.clone() {
13724-
Some(ref rec) => [deflate_main_codes__dupX1::reference(
13727+
Some(ref rec) => [deflate_main_codes::reference(
1372513728
deflate_main_codes_reference {
1372613729
length: rec.length.clone(),
1372713730
distance: rec.distance_record.distance.clone(),
@@ -13736,7 +13739,7 @@ v => {
1373613739

1373713740
286u16..=287u16 => [].to_vec(),
1373813741

13739-
_ => [deflate_main_codes__dupX1::literal((x.code.clone()) as u8)].to_vec(),
13742+
_ => [deflate_main_codes::literal((x.code.clone()) as u8)].to_vec(),
1374013743
})
1374113744
}))?,
1374213745
)

0 commit comments

Comments
 (0)