diff --git a/src/hb-ot-layout-common.hh b/src/hb-ot-layout-common.hh index 304c55427..31dcce8ae 100644 --- a/src/hb-ot-layout-common.hh +++ b/src/hb-ot-layout-common.hh @@ -702,6 +702,23 @@ struct Lookup return_trace (true); } + /* Older compileres need this to NOT be locally defined in a function. */ + template + struct SubTableSubsetWrapper + { + inline SubTableSubsetWrapper (const TSubTable &subtable_, + unsigned int lookup_type_) : + subtable (subtable_), + lookup_type (lookup_type_) {} + + inline bool subset (hb_subset_context_t *c) const + { return subtable.dispatch (c, lookup_type); } + + private: + const TSubTable &subtable; + unsigned int lookup_type; + }; + template inline bool subset (hb_subset_context_t *c) const { @@ -717,20 +734,7 @@ struct Lookup unsigned int count = subTable.len; for (unsigned int i = 0; i < count; i++) { - struct Wrapper - { - inline Wrapper (const TSubTable &subtable_, - unsigned int lookup_type_) : - subtable (subtable_), - lookup_type (lookup_type_) {} - - inline bool subset (hb_subset_context_t *c) const - { return subtable.dispatch (c, lookup_type); } - - private: - const TSubTable &subtable; - unsigned int lookup_type; - } wrapper (this+subtables[i], get_type ()); + SubTableSubsetWrapper wrapper (this+subtables[i], get_type ()); out_subtables[i].serialize_subset (c, wrapper, out); } diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 8b09210f7..81f885a22 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -53,6 +53,9 @@ _plan_estimate_subset_table_size (hb_subset_plan_t *plan, unsigned int src_glyphs = plan->source->get_num_glyphs (); unsigned int dst_glyphs = plan->glyphset->get_population (); + if (unlikely (!src_glyphs)) + return 512 + table_len; + return 512 + (unsigned int) (table_len * sqrt ((double) dst_glyphs / src_glyphs)); }