mirror of
https://github.com/storytold/deckcraft.git
synced 2026-10-31 15:48:18 +00:00
M1.2: deduplicate font collection offsets early
This commit is contained in:
1 parent
23c19d8e0c
commit
cfd30ce4b2
1 file changed
+9
-7
@@ -611,11 +611,11 @@ const MAX_COLLECTION_ENTRIES_SCANNED: u32 = 16_384;
|
||||
/// Maximum named instances read from a single face.
|
||||
const MAX_NAMED_INSTANCES_PER_FACE: usize = 1024;
|
||||
|
||||
fn distinct_face_indices(entries: impl IntoIterator<Item = (u32, usize)>) -> Vec<u32> {
|
||||
let mut directories = std::collections::HashSet::new();
|
||||
fn distinct_face_indices(entries: impl IntoIterator<Item = (u32, u32)>) -> Vec<u32> {
|
||||
let mut offsets = std::collections::HashSet::new();
|
||||
let mut indices = Vec::with_capacity(MAX_COLLECTION_FACES as usize);
|
||||
for (index, directory) in entries.into_iter().take(MAX_COLLECTION_ENTRIES_SCANNED as usize) {
|
||||
if directories.insert(directory) {
|
||||
for (index, offset) in entries.into_iter().take(MAX_COLLECTION_ENTRIES_SCANNED as usize) {
|
||||
if offsets.insert(offset) {
|
||||
indices.push(index);
|
||||
if indices.len() == MAX_COLLECTION_FACES as usize {
|
||||
break;
|
||||
@@ -636,8 +636,10 @@ fn enumerate_faces(data: &[u8]) -> Vec<Found> {
|
||||
Ok(FileRef::Font(_)) => vec![0],
|
||||
Ok(FileRef::Collection(c)) => {
|
||||
let entries = (0..c.len().min(MAX_COLLECTION_ENTRIES_SCANNED)).filter_map(|i| {
|
||||
let f = skrifa::FontRef::from_index(data, i).ok()?;
|
||||
Some((i, f.table_directory().table_records().as_ptr() as usize))
|
||||
let start = 12usize.checked_add((i as usize).checked_mul(4)?)?;
|
||||
let end = start.checked_add(4)?;
|
||||
let offset = u32::from_be_bytes(data.get(start..end)?.try_into().ok()?);
|
||||
Some((i, offset))
|
||||
});
|
||||
distinct_face_indices(entries)
|
||||
}
|
||||
@@ -1470,7 +1472,7 @@ mod font_dir_tests {
|
||||
#[test]
|
||||
fn duplicate_collection_offsets_do_not_consume_face_cap() {
|
||||
let mut entries = vec![(0, 7); MAX_COLLECTION_FACES as usize];
|
||||
entries.extend((0..MAX_COLLECTION_FACES).map(|i| (i + MAX_COLLECTION_FACES, i as usize + 8)));
|
||||
entries.extend((0..MAX_COLLECTION_FACES).map(|i| (i + MAX_COLLECTION_FACES, i + 8)));
|
||||
let faces = distinct_face_indices(entries);
|
||||
assert_eq!(faces.len(), MAX_COLLECTION_FACES as usize);
|
||||
assert_eq!(faces.first(), Some(&0));
|
||||
|
||||
Reference in new issue
Block a user