[subset] Add no subset tables and passthrough unrecognized tables to the subset api.

Matches fontTools options.
This commit is contained in:
Garret Rieger 2021-06-09 17:46:47 -07:00
parent 668f2bd93e
commit a6c6cda486
6 changed files with 64 additions and 11 deletions

View File

@ -50,6 +50,7 @@ hb_subset_input_create_or_fail ()
hb_set_add (input->name_languages, 0x0409);
input->layout_features = hb_set_create ();
input->drop_tables = hb_set_create ();
input->no_subset_tables = hb_set_create ();
input->drop_hints = false;
input->desubroutinize = false;
input->retain_gids = false;
@ -58,6 +59,7 @@ hb_subset_input_create_or_fail ()
input->notdef_outline = false;
input->no_prune_unicode_ranges = false;
input->retain_all_layout_features = false;
input->passthrough_unrecognized = false;
hb_tag_t default_drop_tables[] = {
// Layout disabled by default
@ -83,9 +85,24 @@ hb_subset_input_create_or_fail ()
HB_TAG ('S', 'i', 'l', 'f'),
HB_TAG ('S', 'i', 'l', 'l'),
};
input->drop_tables->add_array (default_drop_tables, ARRAY_LENGTH (default_drop_tables));
hb_tag_t default_no_subset_tables[] = {
HB_TAG ('a', 'v', 'a', 'r'),
HB_TAG ('f', 'v', 'a', 'r'),
HB_TAG ('g', 'a', 's', 'p'),
HB_TAG ('c', 'v', 't', ' '),
HB_TAG ('f', 'p', 'g', 'm'),
HB_TAG ('p', 'r', 'e', 'p'),
HB_TAG ('V', 'D', 'M', 'X'),
HB_TAG ('D', 'S', 'I', 'G'),
HB_TAG ('M', 'V', 'A', 'R'),
HB_TAG ('c', 'v', 'a', 'r'),
HB_TAG ('S', 'T', 'A', 'T'),
};
input->no_subset_tables->add_array (default_no_subset_tables,
ARRAY_LENGTH (default_no_subset_tables));
//copied from _layout_features_groups in fonttools
hb_tag_t default_layout_features[] = {
// default shaper
@ -276,6 +293,11 @@ hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input)
return subset_input->drop_tables;
}
HB_EXTERN hb_set_t *
hb_subset_input_no_subset_tables_set (hb_subset_input_t *subset_input)
{
return subset_input->no_subset_tables;
}
HB_EXTERN hb_bool_t
hb_subset_input_get_flag (hb_subset_input_t *input,
@ -293,6 +315,8 @@ hb_subset_input_get_flag (hb_subset_input_t *input,
return input->name_legacy;
case HB_SUBSET_FLAG_SET_OVERLAPS_FLAG:
return input->overlaps_flag;
case HB_SUBSET_FLAG_PASSTHROUGH_UNRECOGNIZED:
return input->passthrough_unrecognized;
default:
return false;
}
@ -320,6 +344,9 @@ hb_subset_input_set_flag (hb_subset_input_t *input,
case HB_SUBSET_FLAG_SET_OVERLAPS_FLAG:
input->overlaps_flag = value;
break;
case HB_SUBSET_FLAG_PASSTHROUGH_UNRECOGNIZED:
input->passthrough_unrecognized = value;
break;
default:
// Do nothing.
break;

View File

@ -42,6 +42,7 @@ struct hb_subset_input_t
hb_set_t *glyphs;
hb_set_t *name_ids;
hb_set_t *name_languages;
hb_set_t *no_subset_tables;
hb_set_t *drop_tables;
hb_set_t *layout_features;
@ -54,6 +55,8 @@ struct hb_subset_input_t
hb_bool_t notdef_outline;
hb_bool_t no_prune_unicode_ranges;
hb_bool_t retain_all_layout_features;
hb_bool_t passthrough_unrecognized;
/* TODO
*
* features

View File

@ -427,6 +427,7 @@ hb_subset_plan_create (hb_face_t *face,
plan->notdef_outline = input->notdef_outline;
plan->prune_unicode_ranges = !input->no_prune_unicode_ranges;
plan->retain_all_layout_features = input->retain_all_layout_features;
plan->passthrough_unrecognized = input->passthrough_unrecognized;
plan->unicodes = hb_set_create ();
plan->name_ids = hb_set_copy (input->name_ids);
_nameid_closure (face, plan->name_ids);
@ -434,6 +435,7 @@ hb_subset_plan_create (hb_face_t *face,
plan->layout_features = hb_set_copy (input->layout_features);
plan->glyphs_requested = hb_set_copy (input->glyphs);
plan->drop_tables = hb_set_copy (input->drop_tables);
plan->no_subset_tables = hb_set_copy (input->no_subset_tables);
plan->source = hb_face_reference (face);
plan->dest = hb_face_builder_create ();

View File

@ -48,6 +48,7 @@ struct hb_subset_plan_t
bool notdef_outline : 1;
bool prune_unicode_ranges : 1;
bool retain_all_layout_features : 1;
bool passthrough_unrecognized : 1;
// For each cp that we'd like to retain maps to the corresponding gid.
hb_set_t *unicodes;
@ -64,6 +65,9 @@ struct hb_subset_plan_t
//glyph ids requested to retain
hb_set_t *glyphs_requested;
// Tables which should not be processed, just pass them through.
hb_set_t *no_subset_tables;
// Tables which should be dropped.
hb_set_t *drop_tables;

View File

@ -244,9 +244,22 @@ _should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
}
}
static bool
_passthrough (hb_subset_plan_t *plan, hb_tag_t tag)
{
hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
bool result = plan->add_table (tag, source_table);
hb_blob_destroy (source_table);
return result;
}
static bool
_subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
{
if (plan->no_subset_tables->has (tag)) {
return _passthrough (plan, tag);
}
DEBUG_MSG (SUBSET, nullptr, "subset %c%c%c%c", HB_UNTAG (tag));
switch (tag)
{
@ -288,10 +301,11 @@ _subset_table (hb_subset_plan_t *plan, hb_tag_t tag)
#endif
default:
hb_blob_t *source_table = hb_face_reference_table (plan->source, tag);
bool result = plan->add_table (tag, source_table);
hb_blob_destroy (source_table);
return result;
if (plan->passthrough_unrecognized)
return _passthrough (plan, tag);
// Drop table
return true;
}
}

View File

@ -41,11 +41,12 @@ typedef struct hb_subset_input_t hb_subset_input_t;
typedef enum
{
HB_SUBSET_FLAG_HINTING = 1,
HB_SUBSET_FLAG_RETAIN_GIDS = 2,
HB_SUBSET_FLAG_DESUBROUTINIZE = 3,
HB_SUBSET_FLAG_NAME_LEGACY = 4,
HB_SUBSET_FLAG_SET_OVERLAPS_FLAG = 5,
HB_SUBSET_FLAG_HINTING = 1,
HB_SUBSET_FLAG_RETAIN_GIDS = 2,
HB_SUBSET_FLAG_DESUBROUTINIZE = 3,
HB_SUBSET_FLAG_NAME_LEGACY = 4,
HB_SUBSET_FLAG_SET_OVERLAPS_FLAG = 5,
HB_SUBSET_FLAG_PASSTHROUGH_UNRECOGNIZED = 6,
} hb_subset_flag_t;
HB_EXTERN hb_subset_input_t *
@ -79,8 +80,10 @@ HB_EXTERN hb_bool_t
hb_subset_input_get_retain_all_features (hb_subset_input_t *subset_input);
HB_EXTERN hb_set_t *
hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input);
hb_subset_input_no_subset_tables_set (hb_subset_input_t *subset_input);
HB_EXTERN hb_set_t *
hb_subset_input_drop_tables_set (hb_subset_input_t *subset_input);
HB_EXTERN hb_bool_t
hb_subset_input_get_flag (hb_subset_input_t *input,