This commit is contained in:
Behdad Esfahbod 2018-08-26 00:47:55 -07:00
parent e6cb938065
commit 963413fc54
6 changed files with 51 additions and 25 deletions

View File

@ -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;

View File

@ -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 \

View File

@ -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;
};

View File

@ -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;
};

View File

@ -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 */

View File

@ -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;