diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh index 5352156f0..7f84fe08b 100644 --- a/src/hb-ot-glyf-table.hh +++ b/src/hb-ot-glyf-table.hh @@ -281,6 +281,11 @@ struct glyf hb_codepoint_t get_glyph_index () const { return glyphIndex; } void drop_instructions_flag () { flags = (uint16_t) flags & ~WE_HAVE_INSTRUCTIONS; } + void set_overlaps_flag () + { + flags = (uint16_t) flags | OVERLAP_COMPOUND; + } + bool has_instructions () const { return flags & WE_HAVE_INSTRUCTIONS; } bool has_more () const { return flags & MORE_COMPONENTS; } @@ -427,14 +432,14 @@ struct glyf { enum simple_glyph_flag_t { - FLAG_ON_CURVE = 0x01, - FLAG_X_SHORT = 0x02, - FLAG_Y_SHORT = 0x04, - FLAG_REPEAT = 0x08, - FLAG_X_SAME = 0x10, - FLAG_Y_SAME = 0x20, - FLAG_RESERVED1 = 0x40, - FLAG_RESERVED2 = 0x80 + FLAG_ON_CURVE = 0x01, + FLAG_X_SHORT = 0x02, + FLAG_Y_SHORT = 0x04, + FLAG_REPEAT = 0x08, + FLAG_X_SAME = 0x10, + FLAG_Y_SAME = 0x20, + FLAG_OVERLAP_SIMPLE = 0x40, + FLAG_RESERVED2 = 0x80 }; private: @@ -553,6 +558,17 @@ struct glyf dest_end = bytes.sub_array (glyph_length, bytes.length - glyph_length); } + void set_overlaps_flag () + { + if (unlikely (!header.numberOfContours)) return; + + unsigned flags_offset = length (instructions_length ()); + if (unlikely (length (flags_offset + 1) > bytes.length)) return; + + HBUINT8 &first_flag = (HBUINT8 &) StructAtOffset (&bytes, flags_offset); + first_flag = (uint8_t) first_flag | FLAG_OVERLAP_SIMPLE; + } + static bool read_points (const HBUINT8 *&p /* IN/OUT */, contour_point_vector_t &points_ /* IN/OUT */, const hb_bytes_t &bytes, @@ -666,6 +682,12 @@ struct glyf /* Chop instructions off the end */ void drop_hints_bytes (hb_bytes_t &dest_start) const { dest_start = bytes.sub_array (0, bytes.length - instructions_length (bytes)); } + + void set_overlaps_flag () + { + const_cast (StructAfter (header)) + .set_overlaps_flag (); + } }; enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE }; @@ -695,6 +717,15 @@ struct glyf } } + void set_overlaps_flag () + { + switch (type) { + case COMPOSITE: CompositeGlyph (*header, bytes).set_overlaps_flag (); return; + case SIMPLE: SimpleGlyph (*header, bytes).set_overlaps_flag (); return; + default: return; + } + } + void drop_hints_bytes (hb_bytes_t &dest_start, hb_bytes_t &dest_end) const { switch (type) { @@ -1232,6 +1263,9 @@ struct glyf if (plan->drop_hints) Glyph (dest_glyph).drop_hints (); + if (plan->overlaps_flag) + Glyph (dest_glyph).set_overlaps_flag (); + return_trace (true); } diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index 1f64bc99a..ccaddab8e 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -53,6 +53,7 @@ hb_subset_input_create_or_fail () input->desubroutinize = false; input->retain_gids = false; input->name_legacy = false; + input->overlaps_flag = false; hb_tag_t default_drop_tables[] = { // Layout disabled by default @@ -224,3 +225,16 @@ hb_subset_input_get_name_legacy (hb_subset_input_t *subset_input) { return subset_input->name_legacy; } + +HB_EXTERN void +hb_subset_input_set_overlaps_flag (hb_subset_input_t *subset_input, + hb_bool_t overlaps_flag) +{ + subset_input->overlaps_flag = overlaps_flag; +} + +HB_EXTERN hb_bool_t +hb_subset_input_get_overlaps_flag (hb_subset_input_t *subset_input) +{ + return subset_input->overlaps_flag; +} diff --git a/src/hb-subset-input.hh b/src/hb-subset-input.hh index 0aeb96695..5dff9d2c4 100644 --- a/src/hb-subset-input.hh +++ b/src/hb-subset-input.hh @@ -48,6 +48,7 @@ struct hb_subset_input_t bool desubroutinize; bool retain_gids; bool name_legacy; + bool overlaps_flag; /* TODO * * features diff --git a/src/hb-subset-plan.cc b/src/hb-subset-plan.cc index b62032203..1cacd7a1c 100644 --- a/src/hb-subset-plan.cc +++ b/src/hb-subset-plan.cc @@ -298,7 +298,7 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, hb_set_t palette_indices; colr.closure_V0palette_indices (plan->_glyphset, &palette_indices); - + hb_set_t layer_indices; colr.closure_forV1 (plan->_glyphset, &layer_indices, &palette_indices); _remap_indexes (&layer_indices, plan->colrv1_layers); @@ -392,6 +392,7 @@ hb_subset_plan_create (hb_face_t *face, plan->desubroutinize = input->desubroutinize; plan->retain_gids = input->retain_gids; plan->name_legacy = input->name_legacy; + plan->overlaps_flag = input->overlaps_flag; plan->unicodes = hb_set_create (); plan->name_ids = hb_set_reference (input->name_ids); _nameid_closure (face, plan->name_ids); diff --git a/src/hb-subset-plan.hh b/src/hb-subset-plan.hh index 79c34a784..132beb07f 100644 --- a/src/hb-subset-plan.hh +++ b/src/hb-subset-plan.hh @@ -44,6 +44,7 @@ struct hb_subset_plan_t bool desubroutinize : 1; bool retain_gids : 1; bool name_legacy : 1; + bool overlaps_flag : 1; // For each cp that we'd like to retain maps to the corresponding gid. hb_set_t *unicodes; diff --git a/src/hb-subset.h b/src/hb-subset.h index ddf440973..f4890b1c6 100644 --- a/src/hb-subset.h +++ b/src/hb-subset.h @@ -87,6 +87,13 @@ hb_subset_input_set_name_legacy (hb_subset_input_t *subset_input, HB_EXTERN hb_bool_t hb_subset_input_get_name_legacy (hb_subset_input_t *subset_input); +HB_EXTERN void +hb_subset_input_set_overlaps_flag (hb_subset_input_t *subset_input, + hb_bool_t overlaps_flag); + +HB_EXTERN hb_bool_t +hb_subset_input_get_overlaps_flag (hb_subset_input_t *subset_input); + /* hb_subset () */ HB_EXTERN hb_face_t * hb_subset (hb_face_t *source, hb_subset_input_t *input); diff --git a/util/options-subset.cc b/util/options-subset.cc index ed23bcd64..d3b063b71 100644 --- a/util/options-subset.cc +++ b/util/options-subset.cc @@ -255,7 +255,8 @@ subset_options_t::add_options (option_parser_t *parser) {"num-iterations", 'n', 0, G_OPTION_ARG_INT, &this->num_iterations, "Run subsetter N times (default: 1)", "N"}, - + {"set-overlaps-flag", 0, 0, G_OPTION_ARG_NONE, &this->input->overlaps_flag, + "Set the overlaps flag on each glyph.", nullptr}, {nullptr} }; parser->add_group (entries,