Allow HB_OPTIONS=aat to prefer AAT tables over OT
Fixes https://github.com/harfbuzz/harfbuzz/issues/322
This commit is contained in:
parent
44f09afd5b
commit
38a7a8a89e
|
@ -47,8 +47,27 @@ _hb_options_init (void)
|
||||||
u.i = 0;
|
u.i = 0;
|
||||||
u.opts.initialized = 1;
|
u.opts.initialized = 1;
|
||||||
|
|
||||||
char *c = getenv ("HB_OPTIONS");
|
const char *c = getenv ("HB_OPTIONS");
|
||||||
u.opts.uniscribe_bug_compatible = c && strstr (c, "uniscribe-bug-compatible");
|
if (c)
|
||||||
|
{
|
||||||
|
while (*c)
|
||||||
|
{
|
||||||
|
const char *p = strchr (c, ':');
|
||||||
|
if (!p)
|
||||||
|
p = c + strlen (c);
|
||||||
|
|
||||||
|
#define OPTION(name, symbol) \
|
||||||
|
if (0 == strncmp (c, name, p - c)) u.opts.symbol = true;
|
||||||
|
|
||||||
|
OPTION ("uniscribe-bug-compatible", uniscribe_bug_compatible);
|
||||||
|
OPTION ("aat", aat);
|
||||||
|
|
||||||
|
#undef OPTION
|
||||||
|
|
||||||
|
c = *p ? p + 1 : p;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/* This is idempotent and threadsafe. */
|
/* This is idempotent and threadsafe. */
|
||||||
_hb_options.set_relaxed (u.i);
|
_hb_options.set_relaxed (u.i);
|
||||||
|
|
|
@ -43,9 +43,10 @@
|
||||||
|
|
||||||
struct hb_options_t
|
struct hb_options_t
|
||||||
{
|
{
|
||||||
unsigned int unused : 1; /* In-case sign bit is here. */
|
bool unused : 1; /* In-case sign bit is here. */
|
||||||
unsigned int initialized : 1;
|
bool initialized : 1;
|
||||||
unsigned int uniscribe_bug_compatible : 1;
|
bool uniscribe_bug_compatible : 1;
|
||||||
|
bool aat : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
union hb_options_union_t {
|
union hb_options_union_t {
|
||||||
|
|
|
@ -42,6 +42,17 @@
|
||||||
#include "hb-aat-layout.hh"
|
#include "hb-aat-layout.hh"
|
||||||
|
|
||||||
|
|
||||||
|
static bool
|
||||||
|
_hb_apply_morx (hb_face_t *face)
|
||||||
|
{
|
||||||
|
if (hb_options ().aat &&
|
||||||
|
hb_aat_layout_has_substitution (face))
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return !hb_ot_layout_has_substitution (face) &&
|
||||||
|
hb_aat_layout_has_substitution (face);
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
|
hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
|
||||||
const int *coords,
|
const int *coords,
|
||||||
|
@ -76,17 +87,15 @@ hb_ot_shape_planner_t::compile (hb_ot_shape_plan_t &plan,
|
||||||
* Decide who does substitutions. GSUB, morx, or fallback.
|
* Decide who does substitutions. GSUB, morx, or fallback.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!hb_ot_layout_has_substitution (face))
|
plan.apply_morx = _hb_apply_morx (face);
|
||||||
{ /* No GSUB. */
|
|
||||||
if (hb_aat_layout_has_substitution (face))
|
|
||||||
plan.apply_morx = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Decide who does positioning. GPOS, kerx, kern, or fallback.
|
* Decide who does positioning. GPOS, kerx, kern, or fallback.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if (!disable_gpos && hb_ot_layout_has_positioning (face))
|
if (hb_options ().aat && hb_aat_layout_has_positioning (face))
|
||||||
|
plan.apply_kerx = true;
|
||||||
|
else if (!disable_gpos && hb_ot_layout_has_positioning (face))
|
||||||
plan.apply_gpos = true;
|
plan.apply_gpos = true;
|
||||||
else if (hb_aat_layout_has_positioning (face))
|
else if (hb_aat_layout_has_positioning (face))
|
||||||
plan.apply_kerx = true;
|
plan.apply_kerx = true;
|
||||||
|
@ -263,8 +272,7 @@ _hb_ot_shaper_shape_plan_data_create (hb_shape_plan_t *shape_plan,
|
||||||
|
|
||||||
/* Ugly that we have to do this here...
|
/* Ugly that we have to do this here...
|
||||||
* If we are going to apply morx, choose default shaper. */
|
* If we are going to apply morx, choose default shaper. */
|
||||||
if (!hb_ot_layout_has_substitution (planner.face) &&
|
if (_hb_apply_morx (planner.face))
|
||||||
hb_aat_layout_has_substitution (planner.face))
|
|
||||||
planner.shaper = &_hb_ot_complex_shaper_default;
|
planner.shaper = &_hb_ot_complex_shaper_default;
|
||||||
else
|
else
|
||||||
planner.shaper = hb_ot_shape_complex_categorize (&planner);
|
planner.shaper = hb_ot_shape_complex_categorize (&planner);
|
||||||
|
|
Loading…
Reference in New Issue