diff --git a/src/hb-ot-face-table-list.hh b/src/hb-ot-face-table-list.hh index c9da36c1b..b552dfdd9 100644 --- a/src/hb-ot-face-table-list.hh +++ b/src/hb-ot-face-table-list.hh @@ -93,6 +93,7 @@ HB_OT_ACCELERATOR (OT, cff2) #ifndef HB_NO_VAR HB_OT_CORE_TABLE (OT, fvar) HB_OT_CORE_TABLE (OT, avar) +HB_OT_CORE_TABLE (OT, cvar) HB_OT_ACCELERATOR (OT, gvar) HB_OT_CORE_TABLE (OT, MVAR) #endif diff --git a/src/hb-ot-var-cvar-table.hh b/src/hb-ot-var-cvar-table.hh index 7d4acc109..66fda8db1 100644 --- a/src/hb-ot-var-cvar-table.hh +++ b/src/hb-ot-var-cvar-table.hh @@ -48,18 +48,22 @@ struct cvar tupleVariationData.sanitize (c)); } - bool calculate_cvt_deltas (unsigned axis_count, - hb_array_t coords, - unsigned num_cvt_item, - hb_vector_t& cvt_deltas /* OUT */) const + const TupleVariationData* get_tuple_var_data (void) const + { return &tupleVariationData; } + + static bool calculate_cvt_deltas (unsigned axis_count, + hb_array_t coords, + unsigned num_cvt_item, + const TupleVariationData *tuple_var_data, + const void *base, + hb_vector_t& cvt_deltas /* OUT */) { if (!coords) return true; hb_vector_t shared_indices; TupleVariationData::tuple_iterator_t iterator; - unsigned var_data_length = tupleVariationData.get_size (axis_count); - hb_bytes_t var_data_bytes = hb_bytes_t (reinterpret_cast (&tupleVariationData), var_data_length); - if (!TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, - this, + unsigned var_data_length = tuple_var_data->get_size (axis_count); + hb_bytes_t var_data_bytes = hb_bytes_t (reinterpret_cast (tuple_var_data), var_data_length); + if (!TupleVariationData::get_tuple_iterator (var_data_bytes, axis_count, base, shared_indices, &iterator)) return true; /* isn't applied at all */ @@ -101,7 +105,9 @@ struct cvar return true; } - bool add_cvt_and_apply_deltas (hb_subset_plan_t *plan) const + static bool add_cvt_and_apply_deltas (hb_subset_plan_t *plan, + const TupleVariationData *tuple_var_data, + const void *base) { const hb_tag_t cvt = HB_TAG('c','v','t',' '); hb_blob_t *cvt_blob = hb_face_reference_table (plan->source, cvt); @@ -122,7 +128,8 @@ struct cvar } hb_memset (cvt_deltas.arrayZ, 0, cvt_deltas.get_size ()); - if (!calculate_cvt_deltas (plan->normalized_coords.length, plan->normalized_coords.as_array (), num_cvt_item, cvt_deltas)) + if (!calculate_cvt_deltas (plan->normalized_coords.length, plan->normalized_coords.as_array (), + num_cvt_item, tuple_var_data, base, cvt_deltas)) { hb_blob_destroy (cvt_prime_blob); return false; diff --git a/src/hb-subset-input.cc b/src/hb-subset-input.cc index ca59de79a..5f001ac25 100644 --- a/src/hb-subset-input.cc +++ b/src/hb-subset-input.cc @@ -71,7 +71,6 @@ hb_subset_input_t::hb_subset_input_t () hb_tag_t default_no_subset_tables[] = { HB_TAG ('a', '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'), diff --git a/src/hb-subset.cc b/src/hb-subset.cc index 82df3386f..e0b1ed644 100644 --- a/src/hb-subset.cc +++ b/src/hb-subset.cc @@ -50,6 +50,7 @@ #include "hb-ot-name-table.hh" #include "hb-ot-layout-gsub-table.hh" #include "hb-ot-layout-gpos-table.hh" +#include "hb-ot-var-cvar-table.hh" #include "hb-ot-var-fvar-table.hh" #include "hb-ot-var-gvar-table.hh" #include "hb-ot-var-hvar-table.hh" @@ -478,6 +479,16 @@ _subset_table (hb_subset_plan_t *plan, if (plan->all_axes_pinned) return _subset (plan, buf); else return _passthrough (plan, tag); + case HB_TAG ('c', 'v', 't', ' '): +#ifndef HB_NO_VAR + if (_is_table_present (plan->source, HB_OT_TAG_cvar) && + plan->normalized_coords && !plan->pinned_at_default) + { + auto &cvar = *plan->source->table.cvar; + return OT::cvar::add_cvt_and_apply_deltas (plan, cvar.get_tuple_var_data (), &cvar); + } +#endif + return _passthrough (plan, tag); default: if (plan->flags & HB_SUBSET_FLAGS_PASSTHROUGH_UNRECOGNIZED) return _passthrough (plan, tag); diff --git a/test/subset/data/Makefile.am b/test/subset/data/Makefile.am index 72cd0d48b..5eee05780 100644 --- a/test/subset/data/Makefile.am +++ b/test/subset/data/Makefile.am @@ -66,6 +66,7 @@ EXTRA_DIST += \ expected/mvar_full_instance \ expected/instance_comp_glyph_empty_child \ expected/post_apply_mvar_delta \ + expected/apply_cvar_delta \ fonts \ profiles \ $(NULL) diff --git a/test/subset/data/Makefile.sources b/test/subset/data/Makefile.sources index 0c5954520..6fbb6ff53 100644 --- a/test/subset/data/Makefile.sources +++ b/test/subset/data/Makefile.sources @@ -57,6 +57,7 @@ TESTS = \ tests/mvar_full_instance.tests \ tests/instance_comp_glyph_empty_child.tests \ tests/post_apply_mvar_delta.tests \ + tests/apply_cvar_delta.tests \ $(NULL) # TODO: re-enable once colrv1 subsetting is stabilized. diff --git a/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=300.ttf b/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=300.ttf new file mode 100644 index 000000000..ca91b5125 Binary files /dev/null and b/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=300.ttf differ diff --git a/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=700.ttf b/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=700.ttf new file mode 100644 index 000000000..25457862b Binary files /dev/null and b/test/subset/data/expected/apply_cvar_delta/Comfortaa-Regular-new.default.retain-all-codepoint.wght=700.ttf differ diff --git a/test/subset/data/tests/apply_cvar_delta.tests b/test/subset/data/tests/apply_cvar_delta.tests new file mode 100644 index 000000000..931cdf89b --- /dev/null +++ b/test/subset/data/tests/apply_cvar_delta.tests @@ -0,0 +1,12 @@ +FONTS: +Comfortaa-Regular-new.ttf + +PROFILES: +default.txt + +SUBSETS: +* + +INSTANCES: +wght=700 +wght=300 diff --git a/test/subset/meson.build b/test/subset/meson.build index 6b6ba2e2c..cf3e80be1 100644 --- a/test/subset/meson.build +++ b/test/subset/meson.build @@ -59,6 +59,7 @@ tests = [ 'mvar_full_instance', 'instance_comp_glyph_empty_child', 'post_apply_mvar_delta', + 'apply_cvar_delta', ] repack_tests = [