mirror of
https://github.com/typst/typst
synced 2025-06-28 00:03:17 +08:00
Fix wrong table padding in subsetting
This commit is contained in:
parent
778aa4e7df
commit
a247653cd0
@ -109,7 +109,7 @@ impl<'a> Subsetter<'a> {
|
|||||||
for (tag, data) in &mut self.tables {
|
for (tag, data) in &mut self.tables {
|
||||||
if *tag == HEAD {
|
if *tag == HEAD {
|
||||||
// Zero out checksum field in head table.
|
// Zero out checksum field in head table.
|
||||||
data.to_mut()[8 .. 12].copy_from_slice(&[0; 4]);
|
data.to_mut()[8 .. 12].fill(0);
|
||||||
checksum_adjustment_offset = Some(offset + 8);
|
checksum_adjustment_offset = Some(offset + 8);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -121,15 +121,20 @@ impl<'a> Subsetter<'a> {
|
|||||||
length: len as u32,
|
length: len as u32,
|
||||||
});
|
});
|
||||||
|
|
||||||
// Account for the padding to 4 bytes.
|
// Increase offset, plus padding zeros to align to 4 bytes.
|
||||||
offset += len + len % 4;
|
offset += len;
|
||||||
|
while offset % 4 != 0 {
|
||||||
|
offset += 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write tables.
|
// Write tables.
|
||||||
for (_, data) in &self.tables {
|
for (_, data) in &self.tables {
|
||||||
// Write data plus padding zeros to align to 4 bytes.
|
// Write data plus padding zeros to align to 4 bytes.
|
||||||
w.extend(data.as_ref());
|
w.extend(data.as_ref());
|
||||||
w.extend(iter::repeat(0).take(data.len() % 4));
|
while w.len() % 4 != 0 {
|
||||||
|
w.push(0);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Write checksumAdjustment field in head table.
|
// Write checksumAdjustment field in head table.
|
||||||
@ -210,8 +215,9 @@ const LOCA: Tag = Tag::from_bytes(b"loca");
|
|||||||
const GLYF: Tag = Tag::from_bytes(b"glyf");
|
const GLYF: Tag = Tag::from_bytes(b"glyf");
|
||||||
const CFF1: Tag = Tag::from_bytes(b"CFF ");
|
const CFF1: Tag = Tag::from_bytes(b"CFF ");
|
||||||
|
|
||||||
/// Calculate a checksum over the sliced data as sum of u32's. The data length
|
/// Calculate a checksum over the sliced data as a sum of u32s. If the data
|
||||||
/// must be a multiple of four.
|
/// length is not a multiple of four, it is treated as if padded with zero to a
|
||||||
|
/// length that is a multiple of four.
|
||||||
fn checksum(data: &[u8]) -> u32 {
|
fn checksum(data: &[u8]) -> u32 {
|
||||||
let mut sum = 0u32;
|
let mut sum = 0u32;
|
||||||
for chunk in data.chunks(4) {
|
for chunk in data.chunks(4) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user