[HarfBuzz] harfbuzz: Branch 'master' - 12 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Sat Aug 4 00:33:48 UTC 2018
src/hb-aat-layout.cc | 4
src/hb-face-private.hh | 7
src/hb-machinery-private.hh | 19 +-
src/hb-ot-font.cc | 51 +++---
src/hb-ot-layout-gpos-table.hh | 4
src/hb-ot-layout-gsub-table.hh | 6
src/hb-ot-layout-gsubgpos-private.hh | 2
src/hb-ot-layout-private.hh | 92 +++++++----
src/hb-ot-layout.cc | 289 +++++++++++++++++------------------
src/hb-ot-math.cc | 2
src/hb-ot-var.cc | 4
11 files changed, 258 insertions(+), 222 deletions(-)
New commits:
commit 30ff8ac865a266c8dca11eeac155c2cd3d1aa159
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 17:32:00 2018 -0700
Rename
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh
index ce90fabd..0d2dbc3c 100644
--- a/src/hb-machinery-private.hh
+++ b/src/hb-machinery-private.hh
@@ -594,7 +594,7 @@ template <unsigned int WheresFace,
typename Subclass,
typename Returned,
typename Stored = Returned>
-struct hb_base_lazy_loader_t
+struct hb_lazy_loader_t
{
static_assert (WheresFace > 0, "");
@@ -657,7 +657,7 @@ struct hb_base_lazy_loader_t
/* Specializations. */
template <unsigned int WheresFace, typename T>
-struct hb_lazy_loader_t : hb_base_lazy_loader_t<WheresFace, hb_lazy_loader_t<WheresFace, T>, T>
+struct hb_object_lazy_loader_t : hb_lazy_loader_t<WheresFace, hb_object_lazy_loader_t<WheresFace, T>, T>
{
static inline T *create (hb_face_t *face)
{
@@ -681,7 +681,7 @@ struct hb_lazy_loader_t : hb_base_lazy_loader_t<WheresFace, hb_lazy_loader_t<Whe
};
template <unsigned int WheresFace, typename T>
-struct hb_table_lazy_loader_t : hb_base_lazy_loader_t<WheresFace, hb_table_lazy_loader_t<WheresFace, T>, T, hb_blob_t>
+struct hb_table_lazy_loader_t : hb_lazy_loader_t<WheresFace, hb_table_lazy_loader_t<WheresFace, T>, T, hb_blob_t>
{
static inline hb_blob_t *create (hb_face_t *face)
{
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index 48934b1b..025f9437 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -70,10 +70,10 @@ struct hb_ot_font_t
OT::vmtx::accelerator_t v_metrics;
hb_face_t *face; /* MUST be JUST before the lazy loaders. */
- hb_lazy_loader_t<1, OT::glyf::accelerator_t> glyf;
- hb_lazy_loader_t<2, OT::CBDT::accelerator_t> cbdt;
- hb_lazy_loader_t<3, OT::post::accelerator_t> post;
- hb_lazy_loader_t<4, OT::kern::accelerator_t> kern;
+ hb_object_lazy_loader_t<1, OT::glyf::accelerator_t> glyf;
+ hb_object_lazy_loader_t<2, OT::CBDT::accelerator_t> cbdt;
+ hb_object_lazy_loader_t<3, OT::post::accelerator_t> post;
+ hb_object_lazy_loader_t<4, OT::kern::accelerator_t> kern;
};
commit 85ba4a190f30da5147d3b2ddac4d58dda31181f1
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 17:06:42 2018 -0700
[ot] Comment
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 4b90b098..b03b8252 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -142,6 +142,8 @@ struct hb_ot_layout_lookup_accelerator_t
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 \
/* OpenType shaping. */ \
HB_OT_LAYOUT_TABLE(OT, GDEF) \
commit 07afc1a213bde91fdfc44dd613f2e82ac1617c9f
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 17:03:32 2018 -0700
[ot] Add misc tables to tables_t
Most unused.
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index a579b037..4b90b098 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -142,26 +142,34 @@ struct hb_ot_layout_lookup_accelerator_t
hb_set_digest_t digest;
};
-namespace OT {
- struct BASE;
- struct COLR;
- struct CPAL;
-}
-
-namespace AAT {
- struct ankr;
- struct kerx;
- struct trak;
-}
-
#define HB_OT_LAYOUT_TABLES \
+ /* OpenType shaping. */ \
HB_OT_LAYOUT_TABLE(OT, GDEF) \
HB_OT_LAYOUT_TABLE(OT, GSUB) \
HB_OT_LAYOUT_TABLE(OT, GPOS) \
- HB_OT_LAYOUT_TABLE(OT, MATH) \
+ HB_OT_LAYOUT_TABLE(OT, JSTF) \
+ HB_OT_LAYOUT_TABLE(OT, BASE) \
+ /* AAT shaping. */ \
+ HB_OT_LAYOUT_TABLE(AAT, morx) \
+ HB_OT_LAYOUT_TABLE(AAT, kerx) \
+ HB_OT_LAYOUT_TABLE(AAT, ankr) \
+ HB_OT_LAYOUT_TABLE(AAT, trak) \
+ /* OpenType variations. */ \
HB_OT_LAYOUT_TABLE(OT, fvar) \
HB_OT_LAYOUT_TABLE(OT, avar) \
- HB_OT_LAYOUT_TABLE(AAT, morx) \
+ HB_OT_LAYOUT_TABLE(OT, MVAR) \
+ /* OpenType color. */ \
+ HB_OT_LAYOUT_TABLE(OT, COLR) \
+ HB_OT_LAYOUT_TABLE(OT, CPAL) \
+ HB_OT_LAYOUT_TABLE(OT, CBDT) \
+ HB_OT_LAYOUT_TABLE(OT, CBLC) \
+ HB_OT_LAYOUT_TABLE(OT, sbix) \
+ HB_OT_LAYOUT_TABLE(OT, svg) \
+ /* OpenType math. */ \
+ HB_OT_LAYOUT_TABLE(OT, MATH) \
+ /* OpenType fundamentals. */ \
+ HB_OT_LAYOUT_TABLE(OT, post) \
+ /* */
/* Declare tables. */
#define HB_OT_LAYOUT_TABLE(Namespace, Type) namespace Namespace { struct Type; }
commit 74b4df2cdef68b74536d9c29426b242199a63a6f
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 16:57:40 2018 -0700
[ot] Move GDEF into tables_t
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh
index cd608cfb..ce90fabd 100644
--- a/src/hb-machinery-private.hh
+++ b/src/hb-machinery-private.hh
@@ -633,6 +633,12 @@ struct hb_base_lazy_loader_t
return p;
}
+ inline void set_stored (Stored *instance_)
+ {
+ assert (instance == nullptr);
+ instance = instance_;
+ }
+
inline const Returned * get (void) const
{
return thiz ()->convert (get_stored ());
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index b967bf6f..1d5a02a0 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -1335,7 +1335,7 @@ GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
{
_hb_buffer_assert_gsubgpos_vars (buffer);
- const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef;
+ const GDEF &gdef = *hb_ot_layout_from_face (font->face)->table.GDEF;
unsigned int count = buffer->len;
for (unsigned int i = 0; i < count; i++)
{
diff --git a/src/hb-ot-layout-gsubgpos-private.hh b/src/hb-ot-layout-gsubgpos-private.hh
index 747811e6..f3566ab1 100644
--- a/src/hb-ot-layout-gsubgpos-private.hh
+++ b/src/hb-ot-layout-gsubgpos-private.hh
@@ -480,7 +480,7 @@ struct hb_ot_apply_context_t :
iter_input (), iter_context (),
font (font_), face (font->face), buffer (buffer_),
recurse_func (nullptr),
- gdef (*hb_ot_layout_from_face (face)->gdef),
+ gdef (*hb_ot_layout_from_face (face)->table.GDEF),
var_store (gdef.get_var_store ()),
direction (buffer_->props.direction),
lookup_mask (1),
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 3c957f1e..a579b037 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -146,9 +146,6 @@ namespace OT {
struct BASE;
struct COLR;
struct CPAL;
- struct GDEF;
- struct GSUB;
- struct GPOS;
}
namespace AAT {
@@ -158,6 +155,7 @@ namespace AAT {
}
#define HB_OT_LAYOUT_TABLES \
+ HB_OT_LAYOUT_TABLE(OT, GDEF) \
HB_OT_LAYOUT_TABLE(OT, GSUB) \
HB_OT_LAYOUT_TABLE(OT, GPOS) \
HB_OT_LAYOUT_TABLE(OT, MATH) \
@@ -172,9 +170,6 @@ HB_OT_LAYOUT_TABLES
struct hb_ot_layout_t
{
- hb_blob_t *gdef_blob;
- const struct OT::GDEF *gdef;
-
unsigned int gsub_lookup_count;
unsigned int gpos_lookup_count;
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 557800a6..bfde063d 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -170,18 +170,15 @@ _hb_ot_layout_create (hb_face_t *face)
if (unlikely (!layout))
return nullptr;
- layout->gdef_blob = hb_sanitize_context_t ().reference_table<OT::GDEF> (face);
- layout->gdef = layout->gdef_blob->as<OT::GDEF> ();
-
layout->table.init0 (face);
const OT::GSUB &gsub = *layout->table.GSUB;
const OT::GPOS &gpos = *layout->table.GPOS;
- if (_hb_ot_blacklist_gdef (layout->gdef_blob->length,
- layout->table.GSUB.get_blob()->length,
- layout->table.GPOS.get_blob()->length))
- layout->gdef = &Null(OT::GDEF);
+ if (unlikely (_hb_ot_blacklist_gdef (layout->table.GDEF.get_blob ()->length,
+ layout->table.GSUB.get_blob ()->length,
+ layout->table.GPOS.get_blob ()->length)))
+ layout->table.GDEF.set_stored (hb_blob_get_empty ());
unsigned int gsub_lookup_count = layout->gsub_lookup_count = gsub.get_lookup_count ();
unsigned int gpos_lookup_count = layout->gpos_lookup_count = gpos.get_lookup_count ();
@@ -217,8 +214,6 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
free (layout->gsub_accels);
free (layout->gpos_accels);
- hb_blob_destroy (layout->gdef_blob);
-
layout->table.fini ();
free (layout);
@@ -236,7 +231,7 @@ static inline const OT::GDEF&
_get_gdef (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::GDEF);
- return *hb_ot_layout_from_face (face)->gdef;
+ return *hb_ot_layout_from_face (face)->table.GDEF;
}
static inline const OT::GSUB&
_get_gsub (hb_face_t *face)
commit 0271c7ab3b76dbf8a4e3e92eaf67d9d61b7a63dc
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 16:45:57 2018 -0700
[ot] Move GSUB/GPOS into tables_t
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh
index ec7a0da1..cd608cfb 100644
--- a/src/hb-machinery-private.hh
+++ b/src/hb-machinery-private.hh
@@ -613,10 +613,8 @@ struct hb_base_lazy_loader_t
thiz ()->destroy (instance);
}
- inline const Returned * operator-> (void) const
- {
- return thiz ()->get ();
- }
+ inline const Returned * operator -> (void) const { return thiz ()->get (); }
+ inline const Returned & operator * (void) const { return *thiz ()->get (); }
inline Stored * get_stored (void) const
{
diff --git a/src/hb-ot-layout-gpos-table.hh b/src/hb-ot-layout-gpos-table.hh
index b52c0144..fe34a328 100644
--- a/src/hb-ot-layout-gpos-table.hh
+++ b/src/hb-ot-layout-gpos-table.hh
@@ -1628,14 +1628,14 @@ GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer)
template <typename context_t>
/*static*/ inline typename context_t::return_t PosLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
{
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
+ const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->table.GPOS);
const PosLookup &l = gpos.get_lookup (lookup_index);
return l.dispatch (c);
}
/*static*/ inline bool PosLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
{
- const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->gpos);
+ const GPOS &gpos = *(hb_ot_layout_from_face (c->face)->table.GPOS);
const PosLookup &l = gpos.get_lookup (lookup_index);
unsigned int saved_lookup_props = c->lookup_props;
unsigned int saved_lookup_index = c->lookup_index;
diff --git a/src/hb-ot-layout-gsub-table.hh b/src/hb-ot-layout-gsub-table.hh
index eef8dc54..b967bf6f 100644
--- a/src/hb-ot-layout-gsub-table.hh
+++ b/src/hb-ot-layout-gsub-table.hh
@@ -1359,14 +1359,14 @@ GSUB::substitute_start (hb_font_t *font, hb_buffer_t *buffer)
template <typename context_t>
/*static*/ inline typename context_t::return_t SubstLookup::dispatch_recurse_func (context_t *c, unsigned int lookup_index)
{
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
+ const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->table.GSUB);
const SubstLookup &l = gsub.get_lookup (lookup_index);
return l.dispatch (c);
}
/*static*/ inline bool SubstLookup::apply_recurse_func (hb_ot_apply_context_t *c, unsigned int lookup_index)
{
- const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->gsub);
+ const GSUB &gsub = *(hb_ot_layout_from_face (c->face)->table.GSUB);
const SubstLookup &l = gsub.get_lookup (lookup_index);
unsigned int saved_lookup_props = c->lookup_props;
unsigned int saved_lookup_index = c->lookup_index;
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index c09464bb..3c957f1e 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -158,6 +158,8 @@ namespace AAT {
}
#define HB_OT_LAYOUT_TABLES \
+ HB_OT_LAYOUT_TABLE(OT, GSUB) \
+ HB_OT_LAYOUT_TABLE(OT, GPOS) \
HB_OT_LAYOUT_TABLE(OT, MATH) \
HB_OT_LAYOUT_TABLE(OT, fvar) \
HB_OT_LAYOUT_TABLE(OT, avar) \
@@ -171,12 +173,7 @@ HB_OT_LAYOUT_TABLES
struct hb_ot_layout_t
{
hb_blob_t *gdef_blob;
- hb_blob_t *gsub_blob;
- hb_blob_t *gpos_blob;
-
const struct OT::GDEF *gdef;
- const struct OT::GSUB *gsub;
- const struct OT::GPOS *gpos;
unsigned int gsub_lookup_count;
unsigned int gpos_lookup_count;
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index d0adaeb3..557800a6 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -173,36 +173,33 @@ _hb_ot_layout_create (hb_face_t *face)
layout->gdef_blob = hb_sanitize_context_t ().reference_table<OT::GDEF> (face);
layout->gdef = layout->gdef_blob->as<OT::GDEF> ();
- layout->gsub_blob = hb_sanitize_context_t ().reference_table<OT::GSUB> (face);
- layout->gsub = layout->gsub_blob->as<OT::GSUB> ();
-
- layout->gpos_blob = hb_sanitize_context_t ().reference_table<OT::GPOS> (face);
- layout->gpos = layout->gpos_blob->as<OT::GPOS> ();
-
layout->table.init0 (face);
+ const OT::GSUB &gsub = *layout->table.GSUB;
+ const OT::GPOS &gpos = *layout->table.GPOS;
+
if (_hb_ot_blacklist_gdef (layout->gdef_blob->length,
- layout->gsub_blob->length,
- layout->gpos_blob->length))
+ layout->table.GSUB.get_blob()->length,
+ layout->table.GPOS.get_blob()->length))
layout->gdef = &Null(OT::GDEF);
- layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
- layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
+ unsigned int gsub_lookup_count = layout->gsub_lookup_count = gsub.get_lookup_count ();
+ unsigned int gpos_lookup_count = layout->gpos_lookup_count = gpos.get_lookup_count ();
- layout->gsub_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gsub->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
- layout->gpos_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (layout->gpos->get_lookup_count (), sizeof (hb_ot_layout_lookup_accelerator_t));
+ layout->gsub_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (gsub_lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
+ layout->gpos_accels = (hb_ot_layout_lookup_accelerator_t *) calloc (gpos_lookup_count, sizeof (hb_ot_layout_lookup_accelerator_t));
- if (unlikely ((layout->gsub_lookup_count && !layout->gsub_accels) ||
- (layout->gpos_lookup_count && !layout->gpos_accels)))
+ if (unlikely ((gsub_lookup_count && !layout->gsub_accels) ||
+ (gpos_lookup_count && !layout->gpos_accels)))
{
_hb_ot_layout_destroy (layout);
return nullptr;
}
- for (unsigned int i = 0; i < layout->gsub_lookup_count; i++)
- layout->gsub_accels[i].init (layout->gsub->get_lookup (i));
- for (unsigned int i = 0; i < layout->gpos_lookup_count; i++)
- layout->gpos_accels[i].init (layout->gpos->get_lookup (i));
+ for (unsigned int i = 0; i < gsub_lookup_count; i++)
+ layout->gsub_accels[i].init (gsub.get_lookup (i));
+ for (unsigned int i = 0; i < gpos_lookup_count; i++)
+ layout->gpos_accels[i].init (gpos.get_lookup (i));
return layout;
}
@@ -221,8 +218,6 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
free (layout->gpos_accels);
hb_blob_destroy (layout->gdef_blob);
- hb_blob_destroy (layout->gsub_blob);
- hb_blob_destroy (layout->gpos_blob);
layout->table.fini ();
@@ -247,13 +242,13 @@ static inline const OT::GSUB&
_get_gsub (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::GSUB);
- return *hb_ot_layout_from_face (face)->gsub;
+ return *hb_ot_layout_from_face (face)->table.GSUB;
}
static inline const OT::GPOS&
_get_gpos (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::GPOS);
- return *hb_ot_layout_from_face (face)->gpos;
+ return *hb_ot_layout_from_face (face)->table.GPOS;
}
/*
@@ -861,13 +856,13 @@ hb_ot_layout_lookup_collect_glyphs (hb_face_t *face,
{
case HB_OT_TAG_GSUB:
{
- const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
+ const OT::SubstLookup& l = hb_ot_layout_from_face (face)->table.GSUB->get_lookup (lookup_index);
l.collect_glyphs (&c);
return;
}
case HB_OT_TAG_GPOS:
{
- const OT::PosLookup& l = hb_ot_layout_from_face (face)->gpos->get_lookup (lookup_index);
+ const OT::PosLookup& l = hb_ot_layout_from_face (face)->table.GPOS->get_lookup (lookup_index);
l.collect_glyphs (&c);
return;
}
@@ -943,7 +938,7 @@ hb_ot_layout_lookup_would_substitute_fast (hb_face_t *face,
if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false;
OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context);
- const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index);
+ const OT::SubstLookup& l = hb_ot_layout_from_face (face)->table.GSUB->get_lookup (lookup_index);
return l.would_apply (&c, &hb_ot_layout_from_face (face)->gsub_accels[lookup_index]);
}
@@ -1101,7 +1096,7 @@ struct GSUBProxy
typedef OT::SubstLookup Lookup;
GSUBProxy (hb_face_t *face) :
- table (*hb_ot_layout_from_face (face)->gsub),
+ table (*hb_ot_layout_from_face (face)->table.GSUB),
accels (hb_ot_layout_from_face (face)->gsub_accels) {}
const OT::GSUB &table;
@@ -1115,7 +1110,7 @@ struct GPOSProxy
typedef OT::PosLookup Lookup;
GPOSProxy (hb_face_t *face) :
- table (*hb_ot_layout_from_face (face)->gpos),
+ table (*hb_ot_layout_from_face (face)->table.GPOS),
accels (hb_ot_layout_from_face (face)->gpos_accels) {}
const OT::GPOS &table;
commit f73d2775cf649d148ace7c2593da9666d60fc1be
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 16:34:25 2018 -0700
[ot] More shuffling
Misc. table loading now properly automated.
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 8222a3fc..c09464bb 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -121,25 +121,6 @@ hb_ot_layout_position_finish_offsets (hb_font_t *font,
* hb_ot_layout_t
*/
-namespace OT {
- struct BASE;
- struct COLR;
- struct CPAL;
- struct GDEF;
- struct GSUB;
- struct GPOS;
- struct MATH;
- struct fvar;
- struct avar;
-}
-
-namespace AAT {
- struct ankr;
- struct kerx;
- struct morx;
- struct trak;
-}
-
struct hb_ot_layout_lookup_accelerator_t
{
template <typename TLookup>
@@ -161,6 +142,32 @@ struct hb_ot_layout_lookup_accelerator_t
hb_set_digest_t digest;
};
+namespace OT {
+ struct BASE;
+ struct COLR;
+ struct CPAL;
+ struct GDEF;
+ struct GSUB;
+ struct GPOS;
+}
+
+namespace AAT {
+ struct ankr;
+ struct kerx;
+ struct trak;
+}
+
+#define HB_OT_LAYOUT_TABLES \
+ HB_OT_LAYOUT_TABLE(OT, MATH) \
+ HB_OT_LAYOUT_TABLE(OT, fvar) \
+ HB_OT_LAYOUT_TABLE(OT, avar) \
+ HB_OT_LAYOUT_TABLE(AAT, morx) \
+
+/* Declare tables. */
+#define HB_OT_LAYOUT_TABLE(Namespace, Type) namespace Namespace { struct Type; }
+HB_OT_LAYOUT_TABLES
+#undef HB_OT_LAYOUT_TABLE
+
struct hb_ot_layout_t
{
hb_blob_t *gdef_blob;
@@ -180,11 +187,25 @@ struct hb_ot_layout_t
/* Various non-shaping tables. */
struct tables_t
{
+ HB_INTERNAL void init0 (hb_face_t *face);
+ HB_INTERNAL void fini (void);
+
+#define HB_OT_LAYOUT_TABLE_ORDER(Namespace, Type) \
+ HB_PASTE (TABLE_ORDER_, HB_PASTE (Namespace, HB_PASTE (_, Type)))
+ enum order_t
+ {
+ TABLE_ORDER_ZERO,
+#define HB_OT_LAYOUT_TABLE(Namespace, Type) \
+ HB_OT_LAYOUT_TABLE_ORDER (Namespace, Type),
+ HB_OT_LAYOUT_TABLES
+#undef HB_OT_LAYOUT_TABLE
+ };
+
hb_face_t *face; /* MUST be JUST before the lazy loaders. */
- hb_table_lazy_loader_t<1, struct OT::MATH> math;
- hb_table_lazy_loader_t<2, struct OT::fvar> fvar;
- hb_table_lazy_loader_t<3, struct OT::avar> avar;
- hb_table_lazy_loader_t<4, struct AAT::morx> morx;
+#define HB_OT_LAYOUT_TABLE(Namespace, Type) \
+ hb_table_lazy_loader_t<HB_OT_LAYOUT_TABLE_ORDER (Namespace, Type), struct Namespace::Type> Type;
+ HB_OT_LAYOUT_TABLES
+#undef HB_OT_LAYOUT_TABLE
} table;
};
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 6af64952..d0adaeb3 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -149,6 +149,20 @@ _hb_ot_blacklist_gdef (unsigned int gdef_len,
return false;
}
+void hb_ot_layout_t::tables_t::init0 (hb_face_t *face)
+{
+ this->face = face;
+#define HB_OT_LAYOUT_TABLE(Namespace, Type) Type.init0 ();
+ HB_OT_LAYOUT_TABLES
+#undef HB_OT_LAYOUT_TABLE
+}
+void hb_ot_layout_t::tables_t::fini (void)
+{
+#define HB_OT_LAYOUT_TABLE(Namespace, Type) Type.fini ();
+ HB_OT_LAYOUT_TABLES
+#undef HB_OT_LAYOUT_TABLE
+}
+
hb_ot_layout_t *
_hb_ot_layout_create (hb_face_t *face)
{
@@ -165,11 +179,7 @@ _hb_ot_layout_create (hb_face_t *face)
layout->gpos_blob = hb_sanitize_context_t ().reference_table<OT::GPOS> (face);
layout->gpos = layout->gpos_blob->as<OT::GPOS> ();
- layout->table.face = face;
- layout->table.math.init0 ();
- layout->table.fvar.init0 ();
- layout->table.avar.init0 ();
- layout->table.morx.init0 ();
+ layout->table.init0 (face);
if (_hb_ot_blacklist_gdef (layout->gdef_blob->length,
layout->gsub_blob->length,
@@ -214,10 +224,7 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
hb_blob_destroy (layout->gsub_blob);
hb_blob_destroy (layout->gpos_blob);
- layout->table.math.fini ();
- layout->table.fvar.fini ();
- layout->table.avar.fini ();
- layout->table.morx.fini ();
+ layout->table.fini ();
free (layout);
}
diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc
index 3e4ab756..e7cb4652 100644
--- a/src/hb-ot-math.cc
+++ b/src/hb-ot-math.cc
@@ -34,7 +34,7 @@ _get_math (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::MATH);
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->table.math.get ());
+ return *(layout->table.MATH.get ());
}
/*
commit 52fbd23d868a989d51b7df5be40be582890d13e5
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Fri Aug 3 16:22:16 2018 -0700
[ot] Minor
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index 3417033f..36d4037a 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -52,9 +52,9 @@ _get_morx (hb_face_t *face, hb_blob_t **blob = nullptr)
return Null(AAT::morx);
}
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- const AAT::morx& morx = *(layout->morx.get ());
+ const AAT::morx& morx = *(layout->table.morx.get ());
if (blob)
- *blob = layout->morx.get_blob ();
+ *blob = layout->table.morx.get_blob ();
return morx;
}
diff --git a/src/hb-face-private.hh b/src/hb-face-private.hh
index fe3b8b24..73a68461 100644
--- a/src/hb-face-private.hh
+++ b/src/hb-face-private.hh
@@ -55,16 +55,13 @@ struct hb_face_t {
struct hb_shaper_data_t shaper_data; /* Various shaper data. */
- /* Various non-shaping data. */
- /* ... */
-
/* Cache */
- struct plan_node_t {
+ struct plan_node_t
+ {
hb_shape_plan_t *shape_plan;
plan_node_t *next;
} *shape_plans;
-
inline hb_blob_t *reference_table (hb_tag_t tag) const
{
hb_blob_t *blob;
diff --git a/src/hb-machinery-private.hh b/src/hb-machinery-private.hh
index 40e42071..ec7a0da1 100644
--- a/src/hb-machinery-private.hh
+++ b/src/hb-machinery-private.hh
@@ -602,6 +602,7 @@ struct hb_base_lazy_loader_t
inline const Subclass* thiz (void) const { return static_cast<const Subclass *> (this); }
inline Subclass* thiz (void) { return static_cast<Subclass *> (this); }
+ inline void init0 (void) {} /* Init, when memory is already set to 0. No-op for us. */
inline void init (void)
{
instance = nullptr;
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index 64c6e22f..8222a3fc 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -177,12 +177,15 @@ struct hb_ot_layout_t
hb_ot_layout_lookup_accelerator_t *gsub_accels;
hb_ot_layout_lookup_accelerator_t *gpos_accels;
- /* TODO Move the following out of this struct. */
- hb_face_t *face; /* MUST be JUST before the lazy loaders. */
- hb_table_lazy_loader_t<1, struct OT::MATH> math;
- hb_table_lazy_loader_t<2, struct OT::fvar> fvar;
- hb_table_lazy_loader_t<3, struct OT::avar> avar;
- hb_table_lazy_loader_t<4, struct AAT::morx> morx;
+ /* Various non-shaping tables. */
+ struct tables_t
+ {
+ hb_face_t *face; /* MUST be JUST before the lazy loaders. */
+ hb_table_lazy_loader_t<1, struct OT::MATH> math;
+ hb_table_lazy_loader_t<2, struct OT::fvar> fvar;
+ hb_table_lazy_loader_t<3, struct OT::avar> avar;
+ hb_table_lazy_loader_t<4, struct AAT::morx> morx;
+ } table;
};
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index c60b2750..6af64952 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -31,6 +31,7 @@
#include "hb-open-type-private.hh"
#include "hb-ot-layout-private.hh"
#include "hb-ot-map-private.hh"
+#include "hb-map-private.hh"
#include "hb-ot-layout-gdef-table.hh"
#include "hb-ot-layout-gsub-table.hh"
@@ -44,7 +45,6 @@
#include "hb-ot-color-sbix-table.hh"
#include "hb-ot-color-svg-table.hh"
#include "hb-ot-name-table.hh"
-#include "hb-map-private.hh"
static bool
@@ -165,11 +165,11 @@ _hb_ot_layout_create (hb_face_t *face)
layout->gpos_blob = hb_sanitize_context_t ().reference_table<OT::GPOS> (face);
layout->gpos = layout->gpos_blob->as<OT::GPOS> ();
- layout->face = face;
- layout->math.init ();
- layout->fvar.init ();
- layout->avar.init ();
- layout->morx.init ();
+ layout->table.face = face;
+ layout->table.math.init0 ();
+ layout->table.fvar.init0 ();
+ layout->table.avar.init0 ();
+ layout->table.morx.init0 ();
if (_hb_ot_blacklist_gdef (layout->gdef_blob->length,
layout->gsub_blob->length,
@@ -214,10 +214,10 @@ _hb_ot_layout_destroy (hb_ot_layout_t *layout)
hb_blob_destroy (layout->gsub_blob);
hb_blob_destroy (layout->gpos_blob);
- layout->math.fini ();
- layout->fvar.fini ();
- layout->avar.fini ();
- layout->morx.fini ();
+ layout->table.math.fini ();
+ layout->table.fvar.fini ();
+ layout->table.avar.fini ();
+ layout->table.morx.fini ();
free (layout);
}
diff --git a/src/hb-ot-math.cc b/src/hb-ot-math.cc
index 1667a7da..3e4ab756 100644
--- a/src/hb-ot-math.cc
+++ b/src/hb-ot-math.cc
@@ -34,7 +34,7 @@ _get_math (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::MATH);
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->math.get ());
+ return *(layout->table.math.get ());
}
/*
diff --git a/src/hb-ot-var.cc b/src/hb-ot-var.cc
index f0612a61..366860d5 100644
--- a/src/hb-ot-var.cc
+++ b/src/hb-ot-var.cc
@@ -41,14 +41,14 @@ _get_fvar (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::fvar);
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->fvar.get ());
+ return *(layout->table.fvar.get ());
}
static inline const OT::avar&
_get_avar (hb_face_t *face)
{
if (unlikely (!hb_ot_shaper_face_data_ensure (face))) return Null(OT::avar);
hb_ot_layout_t * layout = hb_ot_layout_from_face (face);
- return *(layout->avar.get ());
+ return *(layout->table.avar.get ());
}
/**
commit 6a0a298aabe777e2c1ed443f100fe6142c83e3b3
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Aug 2 23:13:19 2018 -0700
[ot] Move code around
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index db83481c..c60b2750 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -47,6 +47,108 @@
#include "hb-map-private.hh"
+static bool
+_hb_ot_blacklist_gdef (unsigned int gdef_len,
+ unsigned int gsub_len,
+ unsigned int gpos_len)
+{
+ /* The ugly business of blacklisting individual fonts' tables happen here!
+ * See this thread for why we finally had to bend in and do this:
+ * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ *
+ * In certain versions of Times New Roman Italic and Bold Italic,
+ * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
+ * in GDEF. Many versions of Tahoma have bad GDEF tables that
+ * incorrectly classify some spacing marks such as certain IPA
+ * symbols as glyph class 3. So do older versions of Microsoft
+ * Himalaya, and the version of Cantarell shipped by Ubuntu 16.04.
+ *
+ * Nuke the GDEF tables of to avoid unwanted width-zeroing.
+ *
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
+ */
+#define ENCODE(x,y,z) ((int64_t) (x) << 32 | (int64_t) (y) << 16 | (z))
+ switch ENCODE(gdef_len, gsub_len, gpos_len)
+ {
+ /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
+ case ENCODE (442, 2874, 42038):
+ /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
+ case ENCODE (430, 2874, 40662):
+ /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
+ case ENCODE (442, 2874, 39116):
+ /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
+ case ENCODE (430, 2874, 39374):
+ /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
+ case ENCODE (490, 3046, 41638):
+ /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
+ case ENCODE (478, 3046, 41902):
+ /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
+ case ENCODE (898, 12554, 46470):
+ /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
+ case ENCODE (910, 12566, 47732):
+ /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
+ case ENCODE (928, 23298, 59332):
+ /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
+ case ENCODE (940, 23310, 60732):
+ /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case ENCODE (964, 23836, 60072):
+ /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case ENCODE (976, 23832, 61456):
+ /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
+ case ENCODE (994, 24474, 60336):
+ /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
+ case ENCODE (1006, 24470, 61740):
+ /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case ENCODE (1006, 24576, 61346):
+ /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
+ case ENCODE (1018, 24572, 62828):
+ /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */
+ case ENCODE (1006, 24576, 61352):
+ /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */
+ case ENCODE (1018, 24572, 62834):
+ /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
+ case ENCODE (832, 7324, 47162):
+ /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
+ case ENCODE (844, 7302, 45474):
+ /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */
+ case ENCODE (180, 13054, 7254):
+ /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
+ case ENCODE (192, 12638, 7254):
+ /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
+ case ENCODE (192, 12690, 7254):
+ /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
+ /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
+ case ENCODE (188, 248, 3852):
+ /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
+ /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
+ case ENCODE (188, 264, 3426):
+ /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
+ case ENCODE (1058, 47032, 11818):
+ /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
+ case ENCODE (1046, 47030, 12600):
+ /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
+ case ENCODE (1058, 71796, 16770):
+ /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
+ case ENCODE (1046, 71790, 17862):
+ /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
+ case ENCODE (1046, 71788, 17112):
+ /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
+ case ENCODE (1058, 71794, 17514):
+ /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
+ case ENCODE (1330, 109904, 57938):
+ /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
+ case ENCODE (1330, 109904, 58972):
+ /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf
+ * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
+ case ENCODE (1004, 59092, 14836):
+ return true;
+#undef ENCODE
+ }
+ return false;
+}
+
hb_ot_layout_t *
_hb_ot_layout_create (hb_face_t *face)
{
@@ -69,111 +171,10 @@ _hb_ot_layout_create (hb_face_t *face)
layout->avar.init ();
layout->morx.init ();
- {
- /* The ugly business of blacklisting individual fonts' tables happen here!
- * See this thread for why we finally had to bend in and do this:
- * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
- *
- * In certain versions of Times New Roman Italic and Bold Italic,
- * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
- * in GDEF. Many versions of Tahoma have bad GDEF tables that
- * incorrectly classify some spacing marks such as certain IPA
- * symbols as glyph class 3. So do older versions of Microsoft
- * Himalaya, and the version of Cantarell shipped by Ubuntu 16.04.
- *
- * Nuke the GDEF tables of to avoid unwanted width-zeroing.
- *
- * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
- */
- unsigned int gdef_len = layout->gdef_blob->length;
- unsigned int gsub_len = layout->gsub_blob->length;
- unsigned int gpos_len = layout->gpos_blob->length;
-#define ENCODE(x,y,z) ((int64_t) (x) << 32 | (int64_t) (y) << 16 | (z))
- switch ENCODE(gdef_len, gsub_len, gpos_len)
- {
- /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
- case ENCODE (442, 2874, 42038):
- /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
- case ENCODE (430, 2874, 40662):
- /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
- case ENCODE (442, 2874, 39116):
- /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
- case ENCODE (430, 2874, 39374):
- /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
- case ENCODE (490, 3046, 41638):
- /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
- case ENCODE (478, 3046, 41902):
- /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
- case ENCODE (898, 12554, 46470):
- /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
- case ENCODE (910, 12566, 47732):
- /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
- case ENCODE (928, 23298, 59332):
- /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
- case ENCODE (940, 23310, 60732):
- /* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- case ENCODE (964, 23836, 60072):
- /* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- case ENCODE (976, 23832, 61456):
- /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
- case ENCODE (994, 24474, 60336):
- /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
- case ENCODE (1006, 24470, 61740):
- /* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- case ENCODE (1006, 24576, 61346):
- /* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- case ENCODE (1018, 24572, 62828):
- /* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */
- case ENCODE (1006, 24576, 61352):
- /* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */
- case ENCODE (1018, 24572, 62834):
- /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
- case ENCODE (832, 7324, 47162):
- /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
- case ENCODE (844, 7302, 45474):
- /* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */
- case ENCODE (180, 13054, 7254):
- /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
- case ENCODE (192, 12638, 7254):
- /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
- case ENCODE (192, 12690, 7254):
- /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
- /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
- case ENCODE (188, 248, 3852):
- /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
- /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
- case ENCODE (188, 264, 3426):
- /* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
- case ENCODE (1058, 47032, 11818):
- /* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
- case ENCODE (1046, 47030, 12600):
- /* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
- case ENCODE (1058, 71796, 16770):
- /* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
- case ENCODE (1046, 71790, 17862):
- /* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
- case ENCODE (1046, 71788, 17112):
- /* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
- case ENCODE (1058, 71794, 17514):
- /* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
- case ENCODE (1330, 109904, 57938):
- /* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
- case ENCODE (1330, 109904, 58972):
- /* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf
- * "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
- case ENCODE (1004, 59092, 14836):
- {
- layout->gdef = &Null(OT::GDEF);
- break;
- }
-#undef ENCODE
-
- default:
- break;
- }
- }
+ if (_hb_ot_blacklist_gdef (layout->gdef_blob->length,
+ layout->gsub_blob->length,
+ layout->gpos_blob->length))
+ layout->gdef = &Null(OT::GDEF);
layout->gsub_lookup_count = layout->gsub->get_lookup_count ();
layout->gpos_lookup_count = layout->gpos->get_lookup_count ();
commit 5e718a751efdda89511c9f30238b500125193499
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Aug 2 23:04:42 2018 -0700
[ot] Use switch for checking for blacklisted GDEF tables
Faster / more compact code.
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index a9436619..db83481c 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -70,97 +70,108 @@ _hb_ot_layout_create (hb_face_t *face)
layout->morx.init ();
{
- /*
- * The ugly business of blacklisting individual fonts' tables happen here!
+ /* The ugly business of blacklisting individual fonts' tables happen here!
* See this thread for why we finally had to bend in and do this:
* https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
+ *
+ * In certain versions of Times New Roman Italic and Bold Italic,
+ * ASCII double quotation mark U+0022 has wrong glyph class 3 (mark)
+ * in GDEF. Many versions of Tahoma have bad GDEF tables that
+ * incorrectly classify some spacing marks such as certain IPA
+ * symbols as glyph class 3. So do older versions of Microsoft
+ * Himalaya, and the version of Cantarell shipped by Ubuntu 16.04.
+ *
+ * Nuke the GDEF tables of to avoid unwanted width-zeroing.
+ *
+ * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
*/
unsigned int gdef_len = layout->gdef_blob->length;
unsigned int gsub_len = layout->gsub_blob->length;
unsigned int gpos_len = layout->gpos_blob->length;
- if (0
+#define ENCODE(x,y,z) ((int64_t) (x) << 32 | (int64_t) (y) << 16 | (z))
+ switch ENCODE(gdef_len, gsub_len, gpos_len)
+ {
/* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */
- || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len)
+ case ENCODE (442, 2874, 42038):
/* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */
- || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len)
+ case ENCODE (430, 2874, 40662):
/* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */
- || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len)
+ case ENCODE (442, 2874, 39116):
/* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */
- || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len)
+ case ENCODE (430, 2874, 39374):
/* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */
- || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
+ case ENCODE (490, 3046, 41638):
/* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
- || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
+ case ENCODE (478, 3046, 41902):
/* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
- || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
+ case ENCODE (898, 12554, 46470):
/* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
- || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len)
+ case ENCODE (910, 12566, 47732):
/* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */
- || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len)
+ case ENCODE (928, 23298, 59332):
/* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */
- || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len)
+ case ENCODE (940, 23310, 60732):
/* tahoma.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (964 == gdef_len && 60072 == gpos_len && 23836 == gsub_len)
+ case ENCODE (964, 23836, 60072):
/* tahomabd.ttf v6.04 from Windows 8.1 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (976 == gdef_len && 61456 == gpos_len && 23832 == gsub_len)
+ case ENCODE (976, 23832, 61456):
/* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */
- || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len)
+ case ENCODE (994, 24474, 60336):
/* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */
- || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len)
+ case ENCODE (1006, 24470, 61740):
/* tahoma.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (1006 == gdef_len && 61346 == gpos_len && 24576 == gsub_len)
+ case ENCODE (1006, 24576, 61346):
/* tahomabd.ttf v6.91 from Windows 10 x64, see https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 */
- || (1018 == gdef_len && 62828 == gpos_len && 24572 == gsub_len)
+ case ENCODE (1018, 24572, 62828):
/* sha1sum:b9c84d820c49850d3d27ec498be93955b82772b5 tahoma.ttf from Windows 10 AU */
- || (1006 == gdef_len && 61352 == gpos_len && 24576 == gsub_len)
+ case ENCODE (1006, 24576, 61352):
/* sha1sum:2bdfaab28174bdadd2f3d4200a30a7ae31db79d2 tahomabd.ttf from Windows 10 AU */
- || (1018 == gdef_len && 62834 == gpos_len && 24572 == gsub_len)
+ case ENCODE (1018, 24572, 62834):
/* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */
- || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len)
+ case ENCODE (832, 7324, 47162):
/* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */
- || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len)
+ case ENCODE (844, 7302, 45474):
/* sha1sum:eb8afadd28e9cf963e886b23a30b44ab4fd83acc himalaya.ttf from Windows 7 */
- || (180 == gdef_len && 7254 == gpos_len && 13054 == gsub_len)
+ case ENCODE (180, 13054, 7254):
/* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */
- || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len)
+ case ENCODE (192, 12638, 7254):
/* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */
- || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len)
+ case ENCODE (192, 12690, 7254):
/* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */
/* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */
- || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len)
+ case ENCODE (188, 248, 3852):
/* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */
/* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */
- || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len)
+ case ENCODE (188, 264, 3426):
/* d125afa82a77a6475ac0e74e7c207914af84b37a padauk-2.80/Padauk.ttf RHEL 7.2 */
- || (1058 == gdef_len && 11818 == gpos_len && 47032 == gsub_len)
+ case ENCODE (1058, 47032, 11818):
/* 0f7b80437227b90a577cc078c0216160ae61b031 padauk-2.80/Padauk-Bold.ttf RHEL 7.2*/
- || (1046 == gdef_len && 12600 == gpos_len && 47030 == gsub_len)
+ case ENCODE (1046, 47030, 12600):
/* d3dde9aa0a6b7f8f6a89ef1002e9aaa11b882290 padauk-2.80/Padauk.ttf Ubuntu 16.04 */
- || (1058 == gdef_len && 16770 == gpos_len && 71796 == gsub_len)
+ case ENCODE (1058, 71796, 16770):
/* 5f3c98ccccae8a953be2d122c1b3a77fd805093f padauk-2.80/Padauk-Bold.ttf Ubuntu 16.04 */
- || (1046 == gdef_len && 17862 == gpos_len && 71790 == gsub_len)
+ case ENCODE (1046, 71790, 17862):
/* 6c93b63b64e8b2c93f5e824e78caca555dc887c7 padauk-2.80/Padauk-book.ttf */
- || (1046 == gdef_len && 17112 == gpos_len && 71788 == gsub_len)
+ case ENCODE (1046, 71788, 17112):
/* d89b1664058359b8ec82e35d3531931125991fb9 padauk-2.80/Padauk-bookbold.ttf */
- || (1058 == gdef_len && 17514 == gpos_len && 71794 == gsub_len)
+ case ENCODE (1058, 71794, 17514):
/* 824cfd193aaf6234b2b4dc0cf3c6ef576c0d00ef padauk-3.0/Padauk-book.ttf */
- || (1330 == gdef_len && 57938 == gpos_len && 109904 == gsub_len)
+ case ENCODE (1330, 109904, 57938):
/* 91fcc10cf15e012d27571e075b3b4dfe31754a8a padauk-3.0/Padauk-bookbold.ttf */
- || (1330 == gdef_len && 58972 == gpos_len && 109904 == gsub_len)
+ case ENCODE (1330, 109904, 58972):
/* sha1sum: c26e41d567ed821bed997e937bc0c41435689e85 Padauk.ttf
* "Padauk Regular" "Version 2.5", see https://crbug.com/681813 */
- || (1004 == gdef_len && 14836 == gpos_len && 59092 == gsub_len)
- )
- {
- /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks
- * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya,
- * and the version of Cantarell shipped by Ubuntu 16.04.
- * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing.
- * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693
- * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875
- */
- layout->gdef = &Null(OT::GDEF);
+ case ENCODE (1004, 59092, 14836):
+ {
+ layout->gdef = &Null(OT::GDEF);
+ break;
+ }
+#undef ENCODE
+
+ default:
+ break;
}
}
commit b5cdf5280d5b00df5356cc5c3236844ca0576bd0
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Aug 2 22:56:42 2018 -0700
[ot] In GDEF blacklisting logic, remove the glyph index check for Times
Just blacklist based on table sizes like we do for other fonts.
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index 8a9eae45..a9436619 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -91,18 +91,6 @@ _hb_ot_layout_create (hb_face_t *face)
|| (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len)
/* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */
|| (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len)
- )
- {
- /* In certain versions of Times New Roman Italic and Bold Italic,
- * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong
- * glyph class 3 (mark) in GDEF. Nuke the GDEF to avoid zero-width
- * double-quote. See:
- * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html
- */
- if (3 == layout->gdef->get_glyph_class (5))
- layout->gdef = &Null(OT::GDEF);
- }
- else if (0
/* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */
|| (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len)
/* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */
commit c988b119994ef78d400bc7d3139785312da0be75
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Aug 2 20:04:37 2018 -0700
Move code around
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index 8b41d4e7..48934b1b 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -41,6 +41,30 @@
struct hb_ot_font_t
{
+ inline void init (hb_face_t *face)
+ {
+ cmap.init (face);
+ h_metrics.init (face);
+ v_metrics.init (face, h_metrics.ascender - h_metrics.descender); /* TODO Can we do this lazily? */
+
+ this->face = face;
+ glyf.init ();
+ cbdt.init ();
+ post.init ();
+ kern.init ();
+ }
+ inline void fini (void)
+ {
+ cmap.fini ();
+ h_metrics.fini ();
+ v_metrics.fini ();
+
+ glyf.fini ();
+ cbdt.fini ();
+ post.fini ();
+ kern.fini ();
+ }
+
OT::cmap::accelerator_t cmap;
OT::hmtx::accelerator_t h_metrics;
OT::vmtx::accelerator_t v_metrics;
@@ -61,14 +85,7 @@ _hb_ot_font_create (hb_face_t *face)
if (unlikely (!ot_font))
return nullptr;
- ot_font->cmap.init (face);
- ot_font->h_metrics.init (face);
- ot_font->v_metrics.init (face, ot_font->h_metrics.ascender - ot_font->h_metrics.descender); /* TODO Can we do this lazily? */
- ot_font->face = face;
- ot_font->glyf.init ();
- ot_font->cbdt.init ();
- ot_font->post.init ();
- ot_font->kern.init ();
+ ot_font->init (face);
return ot_font;
}
@@ -78,13 +95,7 @@ _hb_ot_font_destroy (void *data)
{
hb_ot_font_t *ot_font = (hb_ot_font_t *) data;
- ot_font->cmap.fini ();
- ot_font->h_metrics.fini ();
- ot_font->v_metrics.fini ();
- ot_font->glyf.fini ();
- ot_font->cbdt.fini ();
- ot_font->post.fini ();
- ot_font->kern.fini ();
+ ot_font->fini ();
free (ot_font);
}
commit 574b37e933f98e35c2bdae04458a95522bbfbb82
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Thu Aug 2 02:22:38 2018 -0700
Minor
diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc
index d80d8c4c..8b41d4e7 100644
--- a/src/hb-ot-font.cc
+++ b/src/hb-ot-font.cc
@@ -45,7 +45,7 @@ struct hb_ot_font_t
OT::hmtx::accelerator_t h_metrics;
OT::vmtx::accelerator_t v_metrics;
- hb_face_t *face; /* MUST be before the lazy loaders. */
+ hb_face_t *face; /* MUST be JUST before the lazy loaders. */
hb_lazy_loader_t<1, OT::glyf::accelerator_t> glyf;
hb_lazy_loader_t<2, OT::CBDT::accelerator_t> cbdt;
hb_lazy_loader_t<3, OT::post::accelerator_t> post;
diff --git a/src/hb-ot-layout-private.hh b/src/hb-ot-layout-private.hh
index c8855723..64c6e22f 100644
--- a/src/hb-ot-layout-private.hh
+++ b/src/hb-ot-layout-private.hh
@@ -178,7 +178,7 @@ struct hb_ot_layout_t
hb_ot_layout_lookup_accelerator_t *gpos_accels;
/* TODO Move the following out of this struct. */
- hb_face_t *face; /* MUST be before the lazy loaders. */
+ hb_face_t *face; /* MUST be JUST before the lazy loaders. */
hb_table_lazy_loader_t<1, struct OT::MATH> math;
hb_table_lazy_loader_t<2, struct OT::fvar> fvar;
hb_table_lazy_loader_t<3, struct OT::avar> avar;
More information about the HarfBuzz
mailing list