[HarfBuzz] harfbuzz: Branch 'master' - 4 commits
Behdad Esfahbod
behdad at kemper.freedesktop.org
Tue Oct 23 21:16:15 UTC 2018
src/Makefile.sources | 2 ++
src/hb-aat-layout-morx-table.hh | 29 +++++++++++++++++++++++++----
src/hb-aat-layout.cc | 8 ++++++++
src/hb-aat-layout.hh | 3 +++
src/hb-ot-map.cc | 2 +-
src/hb-ot-map.hh | 2 +-
src/hb-ot-shape.cc | 22 ++++++++++++++--------
src/hb-ot-shape.hh | 14 ++++++++------
8 files changed, 62 insertions(+), 20 deletions(-)
New commits:
commit ffe347844803a6a9036d8357b744a982f5e5a6c9
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Oct 23 14:14:03 2018 -0700
[aat] Allow enabling/disabling features
Only works at entire-buffer range, not sub-ranges.
Test with:
$ hb-shape Zapfino.dfont Zapfino
[Z_a_p_f_i_n_o=0+2333]
$ hb-shape Zapfino.dfont Zapfino --features=-dlig
[Z=0+416|a=1 at -21,0+264|p_f=2+433|i=4+181|n=5+261|o=6+250]
$ hb-shape Zapfino.dfont Zapfino --features=+dlig
[Z_a_p_f_i_n_o=0+2333]
Fixes https://github.com/harfbuzz/harfbuzz/issues/1303
diff --git a/src/Makefile.sources b/src/Makefile.sources
index 72968aee..e13bd4f0 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -101,6 +101,8 @@ HB_OT_sources = \
hb-aat-layout-trak-table.hh \
hb-aat-layout.hh \
hb-aat-ltag-table.hh \
+ hb-aat-map.cc \
+ hb-aat-map.hh \
hb-ot-face.hh \
hb-ot-face.cc \
hb-ot-font.cc \
diff --git a/src/hb-aat-layout-morx-table.hh b/src/hb-aat-layout-morx-table.hh
index 5577efe8..ff791cb7 100644
--- a/src/hb-aat-layout-morx-table.hh
+++ b/src/hb-aat-layout-morx-table.hh
@@ -30,6 +30,7 @@
#include "hb-open-type.hh"
#include "hb-aat-layout-common.hh"
#include "hb-ot-layout-common.hh"
+#include "hb-aat-map.hh"
/*
* morx -- Extended Glyph Metamorphosis
@@ -839,9 +840,9 @@ struct ChainSubtable
struct Chain
{
- inline void apply (hb_aat_apply_context_t *c) const
+ inline hb_mask_t compile_flags (const hb_aat_map_builder_t *map) const
{
- uint32_t flags = defaultFlags;
+ hb_mask_t flags = defaultFlags;
{
/* Compute applicable flags. TODO Should move this to planning
* stage and take user-requested features into account. */
@@ -849,14 +850,22 @@ struct Chain
for (unsigned i = 0; i < count; i++)
{
const Feature &feature = featureZ[i];
- if (false) /* XXX Check if feature enabled... */
+ uint16_t type = feature.featureType;
+ uint16_t setting = feature.featureSetting;
+ const hb_aat_map_builder_t::feature_info_t *info = map->features.bsearch (type);
+ if (info && info->setting == setting)
{
flags &= feature.disableFlags;
flags |= feature.enableFlags;
}
}
}
+ return flags;
+ }
+ inline void apply (hb_aat_apply_context_t *c,
+ hb_mask_t flags) const
+ {
const ChainSubtable *subtable = &StructAtOffset<ChainSubtable> (&featureZ, featureZ[0].static_size * featureCount);
unsigned int count = subtableCount;
for (unsigned int i = 0; i < count; i++)
@@ -976,6 +985,18 @@ struct morx
inline bool has_data (void) const { return version != 0; }
+ inline void compile_flags (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map) const
+ {
+ const Chain *chain = &firstChain;
+ unsigned int count = chainCount;
+ for (unsigned int i = 0; i < count; i++)
+ {
+ map->chain_flags.push (chain->compile_flags (mapper));
+ chain = &StructAfter<Chain> (*chain);
+ }
+ }
+
inline void apply (hb_aat_apply_context_t *c) const
{
if (unlikely (!c->buffer->successful)) return;
@@ -984,7 +1005,7 @@ struct morx
unsigned int count = chainCount;
for (unsigned int i = 0; i < count; i++)
{
- chain->apply (c);
+ chain->apply (c, c->plan->aat_map.chain_flags[i]);
if (unlikely (!c->buffer->successful)) return;
chain = &StructAfter<Chain> (*chain);
}
diff --git a/src/hb-aat-layout.cc b/src/hb-aat-layout.cc
index e9da850b..1e1c7b4f 100644
--- a/src/hb-aat-layout.cc
+++ b/src/hb-aat-layout.cc
@@ -183,6 +183,14 @@ _get_trak (hb_face_t *face)
}
+void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map)
+{
+ _get_morx (mapper->face).compile_flags (mapper, map);
+}
+
+
hb_bool_t
hb_aat_layout_has_substitution (hb_face_t *face)
{
diff --git a/src/hb-aat-layout.hh b/src/hb-aat-layout.hh
index d0eb0190..aea54568 100644
--- a/src/hb-aat-layout.hh
+++ b/src/hb-aat-layout.hh
@@ -52,6 +52,9 @@ struct hb_aat_feature_mapping_t
HB_INTERNAL const hb_aat_feature_mapping_t *
hb_aat_layout_find_feature_mapping (hb_tag_t tag);
+HB_INTERNAL void
+hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper,
+ hb_aat_map_t *map);
HB_INTERNAL hb_bool_t
hb_aat_layout_has_substitution (hb_face_t *face);
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index 0de182f4..23da56c2 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -57,6 +57,7 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan
face (master_plan->face_unsafe),
props (master_plan->props),
map (face, &props),
+ aat_map (face, &props),
apply_morx (_hb_apply_morx (face)),
shaper (apply_morx ?
&_hb_ot_complex_shaper_default :
@@ -70,6 +71,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
plan.props = props;
plan.shaper = shaper;
map.compile (plan.map, coords, num_coords);
+ aat_map.compile (plan.aat_map, coords, num_coords);
plan.frac_mask = plan.map.get_1_mask (HB_TAG ('f','r','a','c'));
plan.numr_mask = plan.map.get_1_mask (HB_TAG ('n','u','m','r'));
@@ -160,6 +162,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
unsigned int num_user_features)
{
hb_ot_map_builder_t *map = &planner->map;
+ hb_aat_map_builder_t *aat_map = &planner->aat_map;
map->enable_feature (HB_TAG('r','v','r','n'));
map->add_gsub_pause (nullptr);
@@ -225,6 +228,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
(feature->start == HB_FEATURE_GLOBAL_START &&
feature->end == HB_FEATURE_GLOBAL_END) ? F_GLOBAL : F_NONE,
feature->value);
+ aat_map->add_feature (feature->tag, feature->value);
}
}
diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh
index 3fa594a8..e7d6204a 100644
--- a/src/hb-ot-shape.hh
+++ b/src/hb-ot-shape.hh
@@ -30,6 +30,7 @@
#include "hb.hh"
#include "hb-ot-map.hh"
+#include "hb-aat-map.hh"
#include "hb-shape-plan.hh"
@@ -39,6 +40,7 @@ struct hb_ot_shape_plan_t
hb_segment_properties_t props;
const struct hb_ot_complex_shaper_t *shaper;
hb_ot_map_t map;
+ hb_aat_map_t aat_map;
const void *data;
hb_mask_t frac_mask, numr_mask, dnom_mask;
hb_mask_t rtlm_mask;
@@ -77,9 +79,11 @@ struct hb_ot_shape_plan_t
{
memset (this, 0, sizeof (*this));
map.init ();
+ aat_map.init ();
}
void fini (void) {
map.fini ();
+ aat_map.fini ();
}
};
@@ -89,6 +93,7 @@ struct hb_ot_shape_planner_t
hb_face_t *face;
hb_segment_properties_t props;
hb_ot_map_builder_t map;
+ hb_aat_map_builder_t aat_map;
bool apply_morx : 1;
const struct hb_ot_complex_shaper_t *shaper;
commit 8be0e5fd4540b18e26b28b414bd99af3bb1548b1
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Oct 23 13:39:50 2018 -0700
[ot-map] Minor
diff --git a/src/hb-ot-map.cc b/src/hb-ot-map.cc
index 45d7dbdc..82e989ef 100644
--- a/src/hb-ot-map.cc
+++ b/src/hb-ot-map.cc
@@ -79,8 +79,8 @@ void hb_ot_map_builder_t::add_feature (hb_tag_t tag,
hb_ot_map_feature_flags_t flags,
unsigned int value)
{
- feature_info_t *info = feature_infos.push();
if (unlikely (!tag)) return;
+ feature_info_t *info = feature_infos.push();
info->tag = tag;
info->seq = feature_infos.len;
info->max_value = value;
commit e8fccbc36b2cc5e1c9f218c83cad7f606c03e7a1
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Oct 23 13:25:03 2018 -0700
Minor
diff --git a/src/hb-ot-map.hh b/src/hb-ot-map.hh
index 40b9921f..fde85b1d 100644
--- a/src/hb-ot-map.hh
+++ b/src/hb-ot-map.hh
@@ -162,7 +162,7 @@ struct hb_ot_map_t
hb_mask_t global_mask;
hb_vector_t<feature_map_t, 8> features;
- hb_vector_t<lookup_map_t, 32> lookups[2]; /* GSUB/GPOS */
+ hb_vector_t<lookup_map_t, 16> lookups[2]; /* GSUB/GPOS */
hb_vector_t<stage_map_t, 4> stages[2]; /* GSUB/GPOS */
};
commit 76324d95caa4b83cd4b515f516c2d3674455ea5e
Author: Behdad Esfahbod <behdad at behdad.org>
Date: Tue Oct 23 13:09:30 2018 -0700
Shift code around
diff --git a/src/hb-ot-shape.cc b/src/hb-ot-shape.cc
index e05a6770..0de182f4 100644
--- a/src/hb-ot-shape.cc
+++ b/src/hb-ot-shape.cc
@@ -53,6 +53,15 @@ _hb_apply_morx (hb_face_t *face)
hb_aat_layout_has_substitution (face);
}
+hb_ot_shape_planner_t::hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
+ face (master_plan->face_unsafe),
+ props (master_plan->props),
+ map (face, &props),
+ apply_morx (_hb_apply_morx (face)),
+ shaper (apply_morx ?
+ &_hb_ot_complex_shaper_default :
+ hb_ot_shape_complex_categorize (this)) {}
+
void
hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
const int *coords,
@@ -89,7 +98,7 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
* Decide who does substitutions. GSUB, morx, or fallback.
*/
- plan.apply_morx = _hb_apply_morx (face);
+ plan.apply_morx = apply_morx;
/*
* Decide who does positioning. GPOS, kerx, kern, or fallback.
@@ -278,13 +287,6 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
hb_ot_shape_planner_t planner (shape_plan);
- /* Ugly that we have to do this here...
- * If we are going to apply morx, choose default shaper. */
- if (_hb_apply_morx (planner.face))
- planner.shaper = &_hb_ot_complex_shaper_default;
- else
- planner.shaper = hb_ot_shape_complex_categorize (&planner);
-
hb_ot_shape_collect_features (&planner, &shape_plan->props,
user_features, num_user_features);
diff --git a/src/hb-ot-shape.hh b/src/hb-ot-shape.hh
index 93fce2d9..3fa594a8 100644
--- a/src/hb-ot-shape.hh
+++ b/src/hb-ot-shape.hh
@@ -88,14 +88,11 @@ struct hb_ot_shape_planner_t
/* In the order that they are filled in. */
hb_face_t *face;
hb_segment_properties_t props;
- const struct hb_ot_complex_shaper_t *shaper;
hb_ot_map_builder_t map;
+ bool apply_morx : 1;
+ const struct hb_ot_complex_shaper_t *shaper;
- hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
- face (master_plan->face_unsafe),
- props (master_plan->props),
- shaper (nullptr),
- map (face, &props) {}
+ HB_INTERNAL hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan);
HB_INTERNAL void compile (hb_ot_shape_plan_t &plan,
const int *coords,
More information about the HarfBuzz
mailing list