cn_font_split/
runner.rs

1use crate::link_subset::link_subset;
2use crate::loader::smart_load_woff2;
3use crate::message::EventFactory;
4use crate::pre_subset::fvar::FvarTable;
5use crate::pre_subset::name_table::NameTableSets;
6use crate::pre_subset::pre_subset;
7use crate::run_subset::{run_subset, RunSubsetResult};
8use cn_font_proto::api_interface::{EventMessage, InputTemplate, OutputReport};
9use harfbuzz_rs_now::{Face, Owned};
10use log::info;
11use prost::Message;
12
13pub struct Context<'a, 'b, 'c>
14where
15    'b: 'a,
16    'c: 'a,
17{
18    pub input: &'c InputTemplate,
19    pub binary: &'c [u8],
20    pub pre_subset_result: Vec<Vec<u32>>,
21    pub run_subset_result: Vec<RunSubsetResult>,
22    pub name_table: NameTableSets,
23    pub face: &'a mut Owned<Face<'b>>,
24    pub callback: &'a dyn Fn(EventMessage),
25    pub reporter: &'a mut OutputReport,
26    pub fvar_table: Option<FvarTable>,
27}
28
29pub fn font_split<F: Fn(EventMessage)>(config: InputTemplate, callback: F) {
30    let mut reporter = OutputReport::default();
31    let binary = smart_load_woff2(&config.input);
32    let mut face = Face::from_bytes(&binary, 0);
33    let mut ctx = Context {
34        input: &config,
35        binary: &binary,
36        pre_subset_result: vec![],
37        run_subset_result: vec![],
38        name_table: NameTableSets { table: vec![] },
39        callback: &(|data| {
40            callback(data);
41        }),
42        face: &mut face,
43        reporter: &mut reporter,
44        fvar_table: None,
45    };
46
47    ctx.reporter.version = env!("CARGO_PKG_VERSION").to_string();
48    ctx.reporter.platform = current_platform::CURRENT_PLATFORM.to_string();
49
50    info!(
51        "version {}; platform {}",
52        ctx.reporter.version, ctx.reporter.platform
53    );
54
55    for process in [pre_subset, run_subset, link_subset] {
56        process(&mut ctx)
57    }
58
59    // name_table 转 proto
60    ctx.reporter.name_table = ctx.name_table.table;
61    // 日志转二进制输出
62    let mut reporter_buffer = Vec::new();
63    ctx.reporter.encode(&mut reporter_buffer).unwrap();
64
65    if ctx.input.reporter.unwrap_or(true) {
66        callback(EventMessage::output_data("reporter.bin", reporter_buffer));
67    }
68
69    // 发送一个结束信息
70    callback(EventMessage::create_end_message());
71    ()
72}