diff options
Diffstat (limited to 'src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh')
-rw-r--r-- | src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh | 101 |
1 files changed, 87 insertions, 14 deletions
diff --git a/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh index a3e28b0562..6ae311e613 100644 --- a/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh +++ b/src/3rdparty/harfbuzz-ng/src/hb-subset-input.hh @@ -33,38 +33,106 @@ #include "hb-subset.h" #include "hb-map.hh" #include "hb-set.hh" - +#include "hb-cplusplus.hh" #include "hb-font.hh" +#include "hb-subset-instancer-solver.hh" + +struct hb_ot_name_record_ids_t +{ + hb_ot_name_record_ids_t () = default; + hb_ot_name_record_ids_t (unsigned platform_id_, + unsigned encoding_id_, + unsigned language_id_, + unsigned name_id_) + :platform_id (platform_id_), + encoding_id (encoding_id_), + language_id (language_id_), + name_id (name_id_) {} + + bool operator != (const hb_ot_name_record_ids_t o) const + { return !(*this == o); } + + inline bool operator == (const hb_ot_name_record_ids_t& o) const + { + return platform_id == o.platform_id && + encoding_id == o.encoding_id && + language_id == o.language_id && + name_id == o.name_id; + } + + inline uint32_t hash () const + { + uint32_t current = 0; + current = current * 31 + hb_hash (platform_id); + current = current * 31 + hb_hash (encoding_id); + current = current * 31 + hb_hash (language_id); + current = current * 31 + hb_hash (name_id); + return current; + } + + unsigned platform_id; + unsigned encoding_id; + unsigned language_id; + unsigned name_id; +}; + +typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t; + HB_MARK_AS_FLAG_T (hb_subset_flags_t); struct hb_subset_input_t { + HB_INTERNAL hb_subset_input_t (); + + ~hb_subset_input_t () + { + sets.~sets_t (); + +#ifdef HB_EXPERIMENTAL_API + for (auto _ : name_table_overrides.values ()) + _.fini (); +#endif + } + hb_object_header_t header; + struct sets_t { + hb::shared_ptr<hb_set_t> glyphs; + hb::shared_ptr<hb_set_t> unicodes; + hb::shared_ptr<hb_set_t> no_subset_tables; + hb::shared_ptr<hb_set_t> drop_tables; + hb::shared_ptr<hb_set_t> name_ids; + hb::shared_ptr<hb_set_t> name_languages; + hb::shared_ptr<hb_set_t> layout_features; + hb::shared_ptr<hb_set_t> layout_scripts; + }; + union { - struct { - hb_set_t *glyphs; - hb_set_t *unicodes; - hb_set_t *no_subset_tables; - hb_set_t *drop_tables; - hb_set_t *name_ids; - hb_set_t *name_languages; - hb_set_t *layout_features; - } sets; - hb_set_t* set_ptrs[sizeof (sets) / sizeof (hb_set_t*)]; + sets_t sets; + hb::shared_ptr<hb_set_t> set_ptrs[sizeof (sets_t) / sizeof (hb_set_t*)]; }; unsigned flags; + bool attach_accelerator_data = false; + + // If set loca format will always be the long version. + bool force_long_loca = false; + + hb_hashmap_t<hb_tag_t, Triple> axes_location; + hb_map_t glyph_map; +#ifdef HB_EXPERIMENTAL_API + hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> name_table_overrides; +#endif inline unsigned num_sets () const { return sizeof (set_ptrs) / sizeof (hb_set_t*); } - inline hb_array_t<hb_set_t*> sets_iter () + inline hb_array_t<hb::shared_ptr<hb_set_t>> sets_iter () { - return hb_array_t<hb_set_t*> (set_ptrs, num_sets ()); + return hb_array (set_ptrs); } bool in_error () const @@ -74,7 +142,12 @@ struct hb_subset_input_t if (unlikely (set_ptrs[i]->in_error ())) return true; } - return false; + + return axes_location.in_error () +#ifdef HB_EXPERIMENTAL_API + || name_table_overrides.in_error () +#endif + ; } }; |