[layout] Add "2" version of BASE table API

...that do the script/language resolution.

Part of https://github.com/harfbuzz/harfbuzz/pull/4237

Ref https://github.com/harfbuzz/harfbuzz/issues/3439
pull/4237/head
Behdad Esfahbod 2 years ago
parent 3e110c69c4
commit 0894813a38
  1. 3
      docs/harfbuzz-sections.txt
  2. 109
      src/hb-ot-layout.cc
  3. 32
      src/hb-ot-layout.h

@ -627,9 +627,12 @@ hb_ot_layout_feature_get_name_ids
hb_ot_layout_feature_with_variations_get_lookups
hb_ot_layout_get_attach_points
hb_ot_layout_get_font_extents
hb_ot_layout_get_font_extents2
hb_ot_layout_get_horizontal_baseline_tag_for_script
hb_ot_layout_get_baseline
hb_ot_layout_get_baseline2
hb_ot_layout_get_baseline_with_fallback
hb_ot_layout_get_baseline_with_fallback2
hb_ot_layout_get_glyph_class
hb_ot_layout_get_glyphs_in_class
hb_ot_layout_get_ligature_carets

@ -2037,12 +2037,32 @@ hb_ot_layout_substitute_lookup (OT::hb_ot_apply_context_t *c,
#ifndef HB_NO_BASE
static void
choose_base_tags (hb_script_t script,
hb_language_t language,
hb_tag_t *script_tag,
hb_tag_t *language_tag)
{
hb_tag_t script_tags[HB_OT_MAX_TAGS_PER_SCRIPT];
unsigned script_count = ARRAY_LENGTH (script_tags);
hb_tag_t language_tags[HB_OT_MAX_TAGS_PER_LANGUAGE];
unsigned language_count = ARRAY_LENGTH (language_tags);
hb_ot_tags_from_script_and_language (script, language,
&script_count, script_tags,
&language_count, language_tags);
*script_tag = script_count ? script_tags[script_count - 1] : HB_OT_TAG_DEFAULT_SCRIPT;
*language_tag = language_count ? language_tags[language_count - 1] : HB_OT_TAG_DEFAULT_LANGUAGE;
}
hb_bool_t
hb_ot_layout_get_font_extents (hb_font_t *font,
hb_direction_t direction,
hb_tag_t script_tag,
hb_tag_t language_tag,
hb_font_extents_t *extents)
hb_direction_t direction,
hb_tag_t script_tag,
hb_tag_t language_tag,
hb_font_extents_t *extents)
{
hb_position_t min, max;
if (font->face->table.BASE->get_min_max (font, direction, script_tag, language_tag, HB_TAG_NONE,
@ -2057,6 +2077,22 @@ hb_ot_layout_get_font_extents (hb_font_t *font,
return false;
}
hb_bool_t
hb_ot_layout_get_font_extents2 (hb_font_t *font,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_font_extents_t *extents)
{
hb_tag_t script_tag, language_tag;
choose_base_tags (script, language, &script_tag, &language_tag);
return hb_ot_layout_get_font_extents (font,
direction,
script_tag,
language_tag,
extents);
}
/**
* hb_ot_layout_get_horizontal_baseline_tag_for_script:
* @script: a script tag.
@ -2154,6 +2190,39 @@ hb_ot_layout_get_baseline (hb_font_t *font,
return font->face->table.BASE->get_baseline (font, baseline_tag, direction, script_tag, language_tag, coord);
}
/**
* hb_ot_layout_get_baseline2:
* @font: a font
* @baseline_tag: a baseline tag
* @direction: text direction.
* @script: script.
* @language: language, currently unused.
* @coord: (out) (nullable): baseline value if found.
*
* Fetches a baseline value from the face.
*
* Return value: `true` if found baseline value in the font.
*
* XSince: REPLACEME
**/
hb_bool_t
hb_ot_layout_get_baseline2 (hb_font_t *font,
hb_ot_layout_baseline_tag_t baseline_tag,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_position_t *coord /* OUT. May be NULL. */)
{
hb_tag_t script_tag, language_tag;
choose_base_tags (script, language, &script_tag, &language_tag);
return hb_ot_layout_get_baseline (font,
baseline_tag,
direction,
script_tag,
language_tag,
coord);
}
/**
* hb_ot_layout_get_baseline_with_fallback:
* @font: a font
@ -2376,6 +2445,38 @@ hb_ot_layout_get_baseline_with_fallback (hb_font_t *font,
}
}
/**
* hb_ot_layout_get_baseline_with_fallback2:
* @font: a font
* @baseline_tag: a baseline tag
* @direction: text direction.
* @script: script.
* @language: language, currently unused.
* @coord: (out): baseline value if found.
*
* Fetches a baseline value from the face, and synthesizes
* it if the font does not have it.
*
* XSince: REPLACEME
**/
void
hb_ot_layout_get_baseline_with_fallback2 (hb_font_t *font,
hb_ot_layout_baseline_tag_t baseline_tag,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_position_t *coord /* OUT */)
{
hb_tag_t script_tag, language_tag;
choose_base_tags (script, language, &script_tag, &language_tag);
hb_ot_layout_get_baseline_with_fallback (font,
baseline_tag,
direction,
script_tag,
language_tag,
coord);
}
#endif

@ -449,10 +449,18 @@ hb_ot_layout_feature_get_characters (hb_face_t *face,
HB_EXTERN hb_bool_t
hb_ot_layout_get_font_extents (hb_font_t *font,
hb_direction_t direction,
hb_tag_t script_tag,
hb_tag_t language_tag,
hb_font_extents_t *extents);
hb_direction_t direction,
hb_tag_t script_tag,
hb_tag_t language_tag,
hb_font_extents_t *extents);
HB_EXTERN hb_bool_t
hb_ot_layout_get_font_extents2 (hb_font_t *font,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_font_extents_t *extents);
/**
* hb_ot_layout_baseline_tag_t:
* @HB_OT_LAYOUT_BASELINE_TAG_ROMAN: The baseline used by alphabetic scripts such as Latin, Cyrillic and Greek.
@ -505,6 +513,14 @@ hb_ot_layout_get_baseline (hb_font_t *font,
hb_tag_t language_tag,
hb_position_t *coord /* OUT. May be NULL. */);
HB_EXTERN hb_bool_t
hb_ot_layout_get_baseline2 (hb_font_t *font,
hb_ot_layout_baseline_tag_t baseline_tag,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_position_t *coord /* OUT. May be NULL. */);
HB_EXTERN void
hb_ot_layout_get_baseline_with_fallback (hb_font_t *font,
hb_ot_layout_baseline_tag_t baseline_tag,
@ -513,6 +529,14 @@ hb_ot_layout_get_baseline_with_fallback (hb_font_t *font,
hb_tag_t language_tag,
hb_position_t *coord /* OUT */);
HB_EXTERN void
hb_ot_layout_get_baseline_with_fallback2 (hb_font_t *font,
hb_ot_layout_baseline_tag_t baseline_tag,
hb_direction_t direction,
hb_script_t script,
hb_language_t language,
hb_position_t *coord /* OUT */);
HB_END_DECLS
#endif /* HB_OT_LAYOUT_H */

Loading…
Cancel
Save