diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/hb-ot-cmap-table.hh | 1 | ||||
-rw-r--r-- | src/hb-ot-face.hh | 22 | ||||
-rw-r--r-- | src/hb-ot-layout-gpos-table.hh | 2 | ||||
-rw-r--r-- | src/hb-ot-layout-gsub-table.hh | 2 | ||||
-rw-r--r-- | src/hb-ot-layout-gsubgpos.hh | 31 | ||||
-rw-r--r-- | src/hb-ot-layout.hh | 18 |
6 files changed, 51 insertions, 25 deletions
diff --git a/src/hb-ot-cmap-table.hh b/src/hb-ot-cmap-table.hh index cdf67f1e..c357714e 100644 --- a/src/hb-ot-cmap-table.hh +++ b/src/hb-ot-cmap-table.hh @@ -1018,7 +1018,6 @@ struct cmap { inline void init (hb_face_t *face) { - /* TODO Switch to using table from face->ot.table. */ this->blob = hb_sanitize_context_t().reference_table<cmap> (face); const cmap *table = this->blob->as<cmap> (); const CmapSubtableFormat14 *subtable_uvs = nullptr; diff --git a/src/hb-ot-face.hh b/src/hb-ot-face.hh index bbbc6e2c..1466f11b 100644 --- a/src/hb-ot-face.hh +++ b/src/hb-ot-face.hh @@ -32,7 +32,6 @@ #include "hb.hh" #include "hb-machinery.hh" -#include "hb-set-digest.hh" #include "hb-ot-cmap-table.hh" #include "hb-ot-glyf-table.hh" @@ -46,27 +45,6 @@ * hb_ot_face_data_t */ -struct hb_ot_layout_lookup_accelerator_t -{ - template <typename TLookup> - inline void init (const TLookup &lookup) - { - digest.init (); - lookup.add_coverage (&digest); - } - - inline void fini (void) - { - } - - inline bool may_have (hb_codepoint_t g) const { - return digest.may_have (g); - } - - private: - hb_set_digest_t digest; -}; - /* Most of these tables are NOT needed for shaping. But we need to hook them *somewhere*. * This is as good as any place. */ #define HB_OT_LAYOUT_TABLES \ diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh index 66767dfd..e1a40506 100644 --- a/src/hb-ot-layout-gpos-table.hh +++ b/src/hb-ot-layout-gpos-table.hh @@ -1522,6 +1522,8 @@ struct GPOS : GSUBGPOS const OffsetTo<PosLookupList> &list = CastR<OffsetTo<PosLookupList> > (lookupList); return_trace (list.sanitize (c, this)); } + + typedef GSUBGPOS::accelerator_t<GPOS> accelerator_t; }; diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh index d2c1fb9a..59e8a43f 100644 --- a/src/hb-ot-layout-gsub-table.hh +++ b/src/hb-ot-layout-gsub-table.hh @@ -1317,6 +1317,8 @@ struct GSUB : GSUBGPOS const OffsetTo<SubstLookupList> &list = CastR<OffsetTo<SubstLookupList> > (lookupList); return_trace (list.sanitize (c, this)); } + + typedef GSUBGPOS::accelerator_t<GSUB> accelerator_t; }; diff --git a/src/hb-ot-layout-gsubgpos.hh b/src/hb-ot-layout-gsubgpos.hh index d21c3dea..44b595ae 100644 --- a/src/hb-ot-layout-gsubgpos.hh +++ b/src/hb-ot-layout-gsubgpos.hh @@ -988,7 +988,6 @@ struct LookupRecord DEFINE_SIZE_STATIC (4); }; - template <typename context_t> static inline void recurse_lookups (context_t *c, unsigned int lookupCount, @@ -2382,6 +2381,36 @@ struct GSUBGPOS (version.to_int () < 0x00010001u || featureVars.sanitize (c, this))); } + template <typename T> + struct accelerator_t + { + inline void init (hb_face_t *face) + { + this->blob = hb_sanitize_context_t().reference_table<T> (face); + const T &table = *this->blob->as<T> (); + + this->lookup_count = table.get_lookup_count (); + + this->accels = (hb_ot_layout_lookup_accelerator_t *) calloc (this->lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t)); + if (unlikely (!this->accels)) + this->lookup_count = 0; + + for (unsigned int i = 0; i < this->lookup_count; i++) + this->accels[i].init (table.get_lookup (i)); + } + + inline void fini (void) + { + hb_blob_destroy (this->blob); + free (accels); + } + + private: + hb_blob_t *blob; + unsigned int lookup_count; + hb_ot_layout_lookup_accelerator_t *accels; + }; + protected: FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set * to 0x00010000u */ diff --git a/src/hb-ot-layout.hh b/src/hb-ot-layout.hh index fcc0998f..02c8c7b2 100644 --- a/src/hb-ot-layout.hh +++ b/src/hb-ot-layout.hh @@ -34,6 +34,7 @@ #include "hb-font.hh" #include "hb-buffer.hh" #include "hb-open-type.hh" +#include "hb-set-digest.hh" /* Private API corresponding to hb-ot-layout.h: */ @@ -86,7 +87,22 @@ hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer); -struct hb_ot_layout_lookup_accelerator_t; +struct hb_ot_layout_lookup_accelerator_t +{ + template <typename TLookup> + inline void init (const TLookup &lookup) + { + digest.init (); + lookup.add_coverage (&digest); + } + inline void fini (void) {} + + inline bool may_have (hb_codepoint_t g) const + { return digest.may_have (g); } + + private: + hb_set_digest_t digest; +}; namespace OT { struct hb_ot_apply_context_t; |