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 ctx.reporter.name_table = ctx.name_table.table;
61 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 callback(EventMessage::create_end_message());
71 ()
72}