Skip to content

How to solve the problem of TTF format fonts generated by allsort not opening on Windows? #108

@bianbiandashen

Description

@bianbiandashen

fn subset_font(
font_data_bytes: &[u8],
text: &str,
) -> Result<Vec, Box> {
use std::collections::HashSet;
use allsorts::binary::read::ReadScope;
use allsorts::font_data::FontData;
use allsorts::subset::subset;
use allsorts::Font;
use allsorts::font::MatchingPresentation;

// 第一次读取字体数据,获取 provider,用于创建 Font 对象
let scope1 = ReadScope::new(font_data_bytes);
let font_data1 = match scope1.read::<FontData<'_>>() {
    Ok(data) => data,
    Err(e) => {
        error!("读取字体数据失败: {:?}", e);
        return Err(Box::new(e));
    }
};
let provider1 = font_data1.table_provider(0)?;

// 创建字体对象
let mut font = Font::new(provider1)?;

// 获取要保留的字形 ID 集合
let mut glyph_ids = HashSet::new();
glyph_ids.insert(0u16); // 始终包含 .notdef 字形

// 临时添加一个中文字符
let mut temp_text = String::from("中");
temp_text.push_str(text);

for ch in temp_text.chars() {
    let (glyph_id, _) = font.lookup_glyph_index(
        ch,
        MatchingPresentation::NotRequired,
        None, // 让编译器自动推断类型
    );
    if glyph_id != 0 {
        glyph_ids.insert(glyph_id);
    } else {
        info!("未找到字形: {},可能是空格或未定义字符", ch);
    }
}

// 将 HashSet<u16> 转换为 Vec<u16>,并排序
let mut glyph_ids_vec: Vec<u16> = glyph_ids.into_iter().collect();
glyph_ids_vec.sort_unstable();

// 第二次读取字体数据,获取新的 provider,用于子集化
let scope2 = ReadScope::new(font_data_bytes);
let font_data2 = scope2.read::<FontData<'_>>()?;
let provider2 = font_data2.table_provider(0)?;

// 调用子集化函数,使用新的 provider2
let subset_font = subset(&provider2, &glyph_ids_vec)?;

if subset_font.is_empty() {
    error!("子集化后的字体数据为空");
} else {
    info!("子集化后的字体数据大小: {} 字节", subset_font.len());
}

Ok(subset_font)

}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions