[subset] Add subset support for Extension lookups (GPOS 9, GSUB 7).

extension-dispatch
Garret Rieger 4 years ago
parent bbbea3dbd8
commit 08a4997fde
  1. 30
      src/hb-ot-layout-gsubgpos.hh
  2. 1
      test/subset/data/Makefile.sources
  3. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41,42.otf
  4. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.41.otf
  5. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout-retain-gids.42.otf
  6. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41,42.otf
  7. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.41.otf
  8. BIN
      test/subset/data/expected/layout.gpos9/gpos9_font2.keep-layout.42.otf
  9. BIN
      test/subset/data/fonts/gpos9_font2.otf
  10. 11
      test/subset/data/tests/layout.gpos9.tests
  11. 1
      test/subset/meson.build

@ -3178,6 +3178,24 @@ struct ExtensionFormat1
extensionLookupType != T::SubTable::Extension);
}
bool subset (hb_subset_context_t *c) const
{
TRACE_SUBSET (this);
auto *out = c->serializer->start_embed (this);
if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false);
out->format = format;
out->extensionLookupType = extensionLookupType;
const auto& src_offset =
reinterpret_cast<const LOffsetTo<typename T::SubTable> &> (extensionOffset);
auto& dest_offset =
reinterpret_cast<LOffsetTo<typename T::SubTable> &> (out->extensionOffset);
return_trace (dest_offset.serialize_subset (c, src_offset, this, get_type ()));
}
protected:
HBUINT16 format; /* Format identifier. Set to 1. */
HBUINT16 extensionLookupType; /* Lookup type of subtable referenced
@ -3208,6 +3226,18 @@ struct Extension
}
}
// Specialization of dispatch for subset. dispatch() normally just
// dispatches to the sub table this points too, but for subset
// we need to run subset on this subtable too.
template <typename ...Ts>
typename hb_subset_context_t::return_t dispatch (hb_subset_context_t *c, Ts&&... ds) const
{
switch (u.format) {
case 1: return u.format1.subset (c);
default: return c->default_return_value ();
}
}
template <typename context_t, typename ...Ts>
typename context_t::return_t dispatch (context_t *c, Ts&&... ds) const
{

@ -20,6 +20,7 @@ TESTS = \
tests/layout.gpos6.tests \
tests/layout.gpos8.tests \
tests/layout.gpos8.amiri.tests \
tests/layout.gpos9.tests \
tests/layout.gsub3.tests \
tests/layout.gsub6.tests \
tests/layout.tests \

@ -0,0 +1,11 @@
FONTS:
gpos9_font2.otf
PROFILES:
keep-layout.txt
keep-layout-retain-gids.txt
SUBSETS:
A
B
AB

@ -13,6 +13,7 @@ tests = [
'layout.gpos6',
'layout.gpos8',
'layout.gpos8.amiri',
'layout.gpos9',
'layout.gsub3',
'layout.gsub6',
'layout.gdef',

Loading…
Cancel
Save