[OT] Port complex_shaper to planner/plan
This commit is contained in:
parent
5393e3a62b
commit
16c6a27b4b
|
@ -165,10 +165,10 @@ static const struct arabic_state_table_entry {
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
collect_features_arabic (const hb_ot_complex_shaper_t *shaper,
|
collect_features_arabic (hb_ot_shape_planner_t *plan)
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props)
|
|
||||||
{
|
{
|
||||||
|
hb_ot_map_builder_t *map = &plan->map;
|
||||||
|
|
||||||
/* For Language forms (in ArabicOT speak), we do the iso/fina/medi/init together,
|
/* For Language forms (in ArabicOT speak), we do the iso/fina/medi/init together,
|
||||||
* then rlig and calt each in their own stage. This makes IranNastaliq's ALLAH
|
* then rlig and calt each in their own stage. This makes IranNastaliq's ALLAH
|
||||||
* ligature work correctly. It's unfortunate though...
|
* ligature work correctly. It's unfortunate though...
|
||||||
|
@ -184,7 +184,7 @@ collect_features_arabic (const hb_ot_complex_shaper_t *shaper,
|
||||||
|
|
||||||
map->add_gsub_pause (NULL, NULL);
|
map->add_gsub_pause (NULL, NULL);
|
||||||
|
|
||||||
unsigned int num_features = props->script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
|
unsigned int num_features = plan->props.script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
|
||||||
for (unsigned int i = 0; i < num_features; i++)
|
for (unsigned int i = 0; i < num_features; i++)
|
||||||
map->add_bool_feature (arabic_syriac_features[i], false);
|
map->add_bool_feature (arabic_syriac_features[i], false);
|
||||||
|
|
||||||
|
@ -236,8 +236,7 @@ arabic_fallback_shape (hb_font_t *font, hb_buffer_t *buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_masks_arabic (const hb_ot_complex_shaper_t *shaper,
|
setup_masks_arabic (const hb_ot_shape_plan_t *plan,
|
||||||
const hb_ot_map_t *map,
|
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
hb_font_t *font)
|
hb_font_t *font)
|
||||||
{
|
{
|
||||||
|
@ -270,7 +269,7 @@ setup_masks_arabic (const hb_ot_complex_shaper_t *shaper,
|
||||||
hb_mask_t total_masks = 0;
|
hb_mask_t total_masks = 0;
|
||||||
unsigned int num_masks = buffer->props.script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
|
unsigned int num_masks = buffer->props.script == HB_SCRIPT_SYRIAC ? SYRIAC_NUM_FEATURES : COMMON_NUM_FEATURES;
|
||||||
for (unsigned int i = 0; i < num_masks; i++) {
|
for (unsigned int i = 0; i < num_masks; i++) {
|
||||||
mask_array[i] = map->get_1_mask (arabic_syriac_features[i]);
|
mask_array[i] = plan->map.get_1_mask (arabic_syriac_features[i]);
|
||||||
total_masks |= mask_array[i];
|
total_masks |= mask_array[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -203,10 +203,10 @@ final_reordering (const hb_ot_map_t *map,
|
||||||
void *user_data HB_UNUSED);
|
void *user_data HB_UNUSED);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
collect_features_indic (const hb_ot_complex_shaper_t *shaper,
|
collect_features_indic (hb_ot_shape_planner_t *plan)
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props)
|
|
||||||
{
|
{
|
||||||
|
hb_ot_map_builder_t *map = &plan->map;
|
||||||
|
|
||||||
map->add_bool_feature (HB_TAG('l','o','c','l'));
|
map->add_bool_feature (HB_TAG('l','o','c','l'));
|
||||||
/* The Indic specs do not require ccmp, but we apply it here since if
|
/* The Indic specs do not require ccmp, but we apply it here since if
|
||||||
* there is a use of it, it's typically at the beginning. */
|
* there is a use of it, it's typically at the beginning. */
|
||||||
|
@ -226,19 +226,16 @@ collect_features_indic (const hb_ot_complex_shaper_t *shaper,
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
override_features_indic (const hb_ot_complex_shaper_t *shaper,
|
override_features_indic (hb_ot_shape_planner_t *plan)
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props)
|
|
||||||
{
|
{
|
||||||
/* Uniscribe does not apply 'kern'. */
|
/* Uniscribe does not apply 'kern'. */
|
||||||
if (indic_options ().uniscribe_bug_compatible)
|
if (indic_options ().uniscribe_bug_compatible)
|
||||||
map->add_feature (HB_TAG('k','e','r','n'), 0, true);
|
plan->map.add_feature (HB_TAG('k','e','r','n'), 0, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_masks_indic (const hb_ot_complex_shaper_t *shaper,
|
setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
const hb_ot_map_t *map,
|
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
hb_font_t *font HB_UNUSED)
|
hb_font_t *font HB_UNUSED)
|
||||||
{
|
{
|
||||||
|
|
|
@ -50,13 +50,11 @@ static const hb_tag_t tibetan_features[] =
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
collect_features_default (const hb_ot_complex_shaper_t *shaper,
|
collect_features_default (hb_ot_shape_planner_t *plan)
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props)
|
|
||||||
{
|
{
|
||||||
const hb_tag_t *script_features = NULL;
|
const hb_tag_t *script_features = NULL;
|
||||||
|
|
||||||
switch ((hb_tag_t) props->script)
|
switch ((hb_tag_t) plan->props.script)
|
||||||
{
|
{
|
||||||
/* Unicode-1.1 additions */
|
/* Unicode-1.1 additions */
|
||||||
case HB_SCRIPT_HANGUL:
|
case HB_SCRIPT_HANGUL:
|
||||||
|
@ -70,14 +68,13 @@ collect_features_default (const hb_ot_complex_shaper_t *shaper,
|
||||||
}
|
}
|
||||||
|
|
||||||
for (; script_features && *script_features; script_features++)
|
for (; script_features && *script_features; script_features++)
|
||||||
map->add_bool_feature (*script_features);
|
plan->map.add_bool_feature (*script_features);
|
||||||
}
|
}
|
||||||
|
|
||||||
static hb_ot_shape_normalization_mode_t
|
static hb_ot_shape_normalization_mode_t
|
||||||
normalization_preference_default (const hb_ot_complex_shaper_t *shaper,
|
normalization_preference_default (const hb_ot_shape_plan_t *plan)
|
||||||
const hb_segment_properties_t *props)
|
|
||||||
{
|
{
|
||||||
switch ((hb_tag_t) props->script)
|
switch ((hb_tag_t) plan->props.script)
|
||||||
{
|
{
|
||||||
/* Unicode-1.1 additions */
|
/* Unicode-1.1 additions */
|
||||||
case HB_SCRIPT_HANGUL:
|
case HB_SCRIPT_HANGUL:
|
||||||
|
@ -100,10 +97,9 @@ const hb_ot_complex_shaper_t _hb_ot_complex_shaper_default =
|
||||||
/* Thai / Lao shaper */
|
/* Thai / Lao shaper */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
setup_masks_thai (const hb_ot_complex_shaper_t *shaper,
|
setup_masks_thai (const hb_ot_shape_plan_t *plan HB_UNUSED,
|
||||||
const hb_ot_map_t *map,
|
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
hb_font_t *font)
|
hb_font_t *font HB_UNUSED)
|
||||||
{
|
{
|
||||||
/* The following is NOT specified in the MS OT Thai spec, however, it seems
|
/* The following is NOT specified in the MS OT Thai spec, however, it seems
|
||||||
* to be what Uniscribe and other engines implement. According to Eric Muller:
|
* to be what Uniscribe and other engines implement. According to Eric Muller:
|
||||||
|
|
|
@ -29,15 +29,11 @@
|
||||||
|
|
||||||
#include "hb-private.hh"
|
#include "hb-private.hh"
|
||||||
|
|
||||||
#include "hb-ot-map-private.hh"
|
#include "hb-ot-shape-private.hh"
|
||||||
#include "hb-ot-shape-normalize-private.hh"
|
#include "hb-ot-shape-normalize-private.hh"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* buffer var allocations, used during the entire shaping process */
|
|
||||||
#define unicode_props0() var1.u8[0]
|
|
||||||
#define unicode_props1() var1.u8[1]
|
|
||||||
|
|
||||||
/* buffer var allocations, used by complex shapers */
|
/* buffer var allocations, used by complex shapers */
|
||||||
#define complex_var_persistent_u8_0() var2.u8[2]
|
#define complex_var_persistent_u8_0() var2.u8[2]
|
||||||
#define complex_var_persistent_u8_1() var2.u8[3]
|
#define complex_var_persistent_u8_1() var2.u8[3]
|
||||||
|
@ -60,37 +56,31 @@ struct hb_ot_complex_shaper_t
|
||||||
|
|
||||||
/* collect_features()
|
/* collect_features()
|
||||||
* Called during shape_plan().
|
* Called during shape_plan().
|
||||||
* Shapers should use map to add their features and callbacks.
|
* Shapers should use plan->map to add their features and callbacks.
|
||||||
* May be NULL.
|
* May be NULL.
|
||||||
*/
|
*/
|
||||||
void (*collect_features) (const hb_ot_complex_shaper_t *shaper,
|
void (*collect_features) (hb_ot_shape_planner_t *plan);
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props);
|
|
||||||
|
|
||||||
/* override_features()
|
/* override_features()
|
||||||
* Called during shape_plan().
|
* Called during shape_plan().
|
||||||
* Shapers should use map to override features and add callbacks after
|
* Shapers should use plan->map to override features and add callbacks after
|
||||||
* common features are added.
|
* common features are added.
|
||||||
* May be NULL.
|
* May be NULL.
|
||||||
*/
|
*/
|
||||||
void (*override_features) (const hb_ot_complex_shaper_t *shaper,
|
void (*override_features) (hb_ot_shape_planner_t *plan);
|
||||||
hb_ot_map_builder_t *map,
|
|
||||||
const hb_segment_properties_t *props);
|
|
||||||
|
|
||||||
/* normalization_preference()
|
/* normalization_preference()
|
||||||
* Called during shape_execute().
|
* Called during shape().
|
||||||
*/
|
*/
|
||||||
hb_ot_shape_normalization_mode_t
|
hb_ot_shape_normalization_mode_t
|
||||||
(*normalization_preference) (const hb_ot_complex_shaper_t *shaper,
|
(*normalization_preference) (const hb_ot_shape_plan_t *plan);
|
||||||
const hb_segment_properties_t *props);
|
|
||||||
|
|
||||||
|
|
||||||
/* setup_masks()
|
/* setup_masks()
|
||||||
* Called during shape_execute().
|
* Called during shape().
|
||||||
* Shapers should use map to get feature masks and set on buffer.
|
* Shapers should use map to get feature masks and set on buffer.
|
||||||
*/
|
*/
|
||||||
void (*setup_masks) (const hb_ot_complex_shaper_t *shaper,
|
void (*setup_masks) (const hb_ot_shape_plan_t *plan,
|
||||||
const hb_ot_map_t *map,
|
|
||||||
hb_buffer_t *buffer,
|
hb_buffer_t *buffer,
|
||||||
hb_font_t *font);
|
hb_font_t *font);
|
||||||
|
|
||||||
|
|
|
@ -30,12 +30,19 @@
|
||||||
#include "hb-private.hh"
|
#include "hb-private.hh"
|
||||||
|
|
||||||
#include "hb-ot-map-private.hh"
|
#include "hb-ot-map-private.hh"
|
||||||
#include "hb-ot-shape-complex-private.hh"
|
|
||||||
|
|
||||||
|
|
||||||
|
/* buffer var allocations, used during the entire shaping process */
|
||||||
|
#define unicode_props0() var1.u8[0]
|
||||||
|
#define unicode_props1() var1.u8[1]
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
struct hb_ot_shape_plan_t
|
struct hb_ot_shape_plan_t
|
||||||
{
|
{
|
||||||
const hb_ot_complex_shaper_t *shaper;
|
hb_segment_properties_t props;
|
||||||
|
const struct hb_ot_complex_shaper_t *shaper;
|
||||||
hb_ot_map_t map;
|
hb_ot_map_t map;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -44,7 +51,7 @@ struct hb_ot_shape_planner_t
|
||||||
/* In the order that they are filled in. */
|
/* In the order that they are filled in. */
|
||||||
hb_face_t *face;
|
hb_face_t *face;
|
||||||
hb_segment_properties_t props;
|
hb_segment_properties_t props;
|
||||||
const hb_ot_complex_shaper_t *shaper;
|
const struct hb_ot_complex_shaper_t *shaper;
|
||||||
hb_ot_map_builder_t map;
|
hb_ot_map_builder_t map;
|
||||||
|
|
||||||
hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
|
hb_ot_shape_planner_t (const hb_shape_plan_t *master_plan) :
|
||||||
|
@ -56,6 +63,7 @@ struct hb_ot_shape_planner_t
|
||||||
|
|
||||||
inline void compile (hb_ot_shape_plan_t &plan)
|
inline void compile (hb_ot_shape_plan_t &plan)
|
||||||
{
|
{
|
||||||
|
plan.props = props;
|
||||||
plan.shaper = shaper;
|
plan.shaper = shaper;
|
||||||
map.compile (face, &props, plan.map);
|
map.compile (face, &props, plan.map);
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
|
|
||||||
#include "hb-ot-shape-private.hh"
|
#include "hb-ot-shape-private.hh"
|
||||||
#include "hb-ot-shape-normalize-private.hh"
|
#include "hb-ot-shape-normalize-private.hh"
|
||||||
|
#include "hb-ot-shape-complex-private.hh"
|
||||||
|
|
||||||
#include "hb-ot-layout-private.hh"
|
#include "hb-ot-layout-private.hh"
|
||||||
#include "hb-set-private.hh"
|
#include "hb-set-private.hh"
|
||||||
|
@ -99,7 +100,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
|
||||||
} HB_STMT_END
|
} HB_STMT_END
|
||||||
|
|
||||||
if (planner->shaper->collect_features)
|
if (planner->shaper->collect_features)
|
||||||
planner->shaper->collect_features (planner->shaper, &planner->map, props);
|
planner->shaper->collect_features (planner);
|
||||||
|
|
||||||
ADD_FEATURES (common_features);
|
ADD_FEATURES (common_features);
|
||||||
|
|
||||||
|
@ -109,7 +110,7 @@ hb_ot_shape_collect_features (hb_ot_shape_planner_t *planner,
|
||||||
ADD_FEATURES (vertical_features);
|
ADD_FEATURES (vertical_features);
|
||||||
|
|
||||||
if (planner->shaper->override_features)
|
if (planner->shaper->override_features)
|
||||||
planner->shaper->override_features (planner->shaper, &planner->map, props);
|
planner->shaper->override_features (planner);
|
||||||
|
|
||||||
#undef ADD_FEATURES
|
#undef ADD_FEATURES
|
||||||
|
|
||||||
|
@ -214,7 +215,7 @@ hb_ot_shape_setup_masks (hb_ot_shape_context_t *c)
|
||||||
c->buffer->reset_masks (global_mask);
|
c->buffer->reset_masks (global_mask);
|
||||||
|
|
||||||
if (c->plan->shaper->setup_masks)
|
if (c->plan->shaper->setup_masks)
|
||||||
c->plan->shaper->setup_masks (c->plan->shaper, &c->plan->map, c->buffer, c->font);
|
c->plan->shaper->setup_masks (c->plan, c->buffer, c->font);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < c->num_user_features; i++)
|
for (unsigned int i = 0; i < c->num_user_features; i++)
|
||||||
{
|
{
|
||||||
|
@ -503,7 +504,7 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c)
|
||||||
|
|
||||||
_hb_ot_shape_normalize (c->font, c->buffer,
|
_hb_ot_shape_normalize (c->font, c->buffer,
|
||||||
c->plan->shaper->normalization_preference ?
|
c->plan->shaper->normalization_preference ?
|
||||||
c->plan->shaper->normalization_preference (c->plan->shaper, &c->buffer->props) :
|
c->plan->shaper->normalization_preference (c->plan) :
|
||||||
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT);
|
HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT);
|
||||||
|
|
||||||
hb_ot_shape_setup_masks (c);
|
hb_ot_shape_setup_masks (c);
|
||||||
|
|
Loading…
Reference in New Issue