| Index: third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
|
| diff --git a/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh b/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
|
| index f860e7bd1dec93a6df8971bbb75ad0f31a43bf5e..70fda8ead8e4c82c75788238ee1cc1bbdcc9b763 100644
|
| --- a/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
|
| +++ b/third_party/harfbuzz-ng/src/hb-ot-layout-private.hh
|
| @@ -1,5 +1,6 @@
|
| /*
|
| * Copyright © 2007,2008,2009 Red Hat, Inc.
|
| + * Copyright © 2012 Google, Inc.
|
| *
|
| * This is part of HarfBuzz, a text shaping library.
|
| *
|
| @@ -22,6 +23,7 @@
|
| * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
|
| *
|
| * Red Hat Author(s): Behdad Esfahbod
|
| + * Google Author(s): Behdad Esfahbod
|
| */
|
|
|
| #ifndef HB_OT_LAYOUT_PRIVATE_HH
|
| @@ -33,15 +35,20 @@
|
|
|
| #include "hb-font-private.hh"
|
| #include "hb-buffer-private.hh"
|
| -#include "hb-ot-shape-complex-private.hh"
|
| +#include "hb-set-private.hh"
|
|
|
|
|
| +/* buffer var allocations, used during the GSUB/GPOS processing */
|
| +#define glyph_props() var1.u16[0] /* GDEF glyph properties */
|
| +#define syllable() var1.u8[2] /* GSUB/GPOS shaping boundaries */
|
| +#define lig_props() var1.u8[3] /* GSUB/GPOS ligature tracking */
|
| +
|
| +#define hb_ot_layout_from_face(face) ((hb_ot_layout_t *) face->shaper_data.ot)
|
|
|
| /*
|
| * GDEF
|
| */
|
|
|
| -/* XXX cleanup */
|
| typedef enum {
|
| HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED = 0x0001,
|
| HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH = 0x0002,
|
| @@ -51,21 +58,126 @@ typedef enum {
|
| } hb_ot_layout_glyph_class_t;
|
|
|
|
|
| -HB_INTERNAL unsigned int
|
| -_hb_ot_layout_get_glyph_property (hb_face_t *face,
|
| - hb_glyph_info_t *info);
|
| +
|
| +/*
|
| + * GSUB/GPOS
|
| + */
|
| +
|
| +/* lig_id / lig_comp
|
| + *
|
| + * When a ligature is formed:
|
| + *
|
| + * - The ligature glyph and any marks in between all the same newly allocated
|
| + * lig_id,
|
| + * - The ligature glyph will get lig_num_comps set to the number of components
|
| + * - The marks get lig_comp > 0, reflecting which component of the ligature
|
| + * they were applied to.
|
| + * - This is used in GPOS to attach marks to the right component of a ligature
|
| + * in MarkLigPos.
|
| + *
|
| + * When a multiple-substitution is done:
|
| + *
|
| + * - All resulting glyphs will have lig_id = 0,
|
| + * - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
|
| + * - This is used in GPOS to attach marks to the first component of a
|
| + * multiple substitution in MarkBasePos.
|
| + *
|
| + * The numbers are also used in GPOS to do mark-to-mark positioning only
|
| + * to marks that belong to the same component of a ligature in MarkMarPos.
|
| + */
|
| +#define IS_LIG_BASE 0x10
|
| +static inline void
|
| +set_lig_props_for_ligature (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_num_comps)
|
| +{
|
| + info.lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
|
| +}
|
| +static inline void
|
| +set_lig_props_for_mark (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
|
| +{
|
| + info.lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
|
| +}
|
| +static inline void
|
| +set_lig_props_for_component (hb_glyph_info_t &info, unsigned int comp)
|
| +{
|
| + set_lig_props_for_mark (info, 0, comp);
|
| +}
|
| +
|
| +static inline unsigned int
|
| +get_lig_id (const hb_glyph_info_t &info)
|
| +{
|
| + return info.lig_props() >> 5;
|
| +}
|
| +static inline bool
|
| +is_a_ligature (const hb_glyph_info_t &info)
|
| +{
|
| + return !!(info.lig_props() & IS_LIG_BASE);
|
| +}
|
| +static inline unsigned int
|
| +get_lig_comp (const hb_glyph_info_t &info)
|
| +{
|
| + if (is_a_ligature (info))
|
| + return 0;
|
| + else
|
| + return info.lig_props() & 0x0F;
|
| +}
|
| +static inline unsigned int
|
| +get_lig_num_comps (const hb_glyph_info_t &info)
|
| +{
|
| + if ((info.glyph_props() & HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE) && is_a_ligature (info))
|
| + return info.lig_props() & 0x0F;
|
| + else
|
| + return 1;
|
| +}
|
| +
|
| +static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) {
|
| + uint8_t lig_id = buffer->next_serial () & 0x07;
|
| + if (unlikely (!lig_id))
|
| + lig_id = allocate_lig_id (buffer); /* in case of overflow */
|
| + return lig_id;
|
| +}
|
| +
|
|
|
| HB_INTERNAL hb_bool_t
|
| -_hb_ot_layout_check_glyph_property (hb_face_t *face,
|
| - hb_glyph_info_t *ginfo,
|
| - unsigned int lookup_props,
|
| - unsigned int *property_out);
|
| +hb_ot_layout_would_substitute_lookup_fast (hb_face_t *face,
|
| + unsigned int lookup_index,
|
| + const hb_codepoint_t *glyphs,
|
| + unsigned int glyphs_length,
|
| + hb_bool_t zero_context);
|
| +
|
| +
|
| +/* Should be called before all the substitute_lookup's are done. */
|
| +HB_INTERNAL void
|
| +hb_ot_layout_substitute_start (hb_font_t *font,
|
| + hb_buffer_t *buffer);
|
| +
|
| +HB_INTERNAL hb_bool_t
|
| +hb_ot_layout_substitute_lookup (hb_font_t *font,
|
| + hb_buffer_t *buffer,
|
| + unsigned int lookup_index,
|
| + hb_mask_t mask);
|
| +
|
| +/* Should be called after all the substitute_lookup's are done */
|
| +HB_INTERNAL void
|
| +hb_ot_layout_substitute_finish (hb_font_t *font,
|
| + hb_buffer_t *buffer);
|
| +
|
| +
|
| +/* Should be called before all the position_lookup's are done. Resets positions to zero. */
|
| +HB_INTERNAL void
|
| +hb_ot_layout_position_start (hb_font_t *font,
|
| + hb_buffer_t *buffer);
|
|
|
| HB_INTERNAL hb_bool_t
|
| -_hb_ot_layout_skip_mark (hb_face_t *face,
|
| - hb_glyph_info_t *ginfo,
|
| - unsigned int lookup_props,
|
| - unsigned int *property_out);
|
| +hb_ot_layout_position_lookup (hb_font_t *font,
|
| + hb_buffer_t *buffer,
|
| + unsigned int lookup_index,
|
| + hb_mask_t mask);
|
| +
|
| +/* Should be called after all the position_lookup's are done */
|
| +HB_INTERNAL void
|
| +hb_ot_layout_position_finish (hb_font_t *font,
|
| + hb_buffer_t *buffer,
|
| + hb_bool_t zero_width_attached_marks);
|
|
|
|
|
|
|
| @@ -73,15 +185,27 @@ _hb_ot_layout_skip_mark (hb_face_t *face,
|
| * hb_ot_layout_t
|
| */
|
|
|
| +namespace OT {
|
| + struct GDEF;
|
| + struct GSUB;
|
| + struct GPOS;
|
| +}
|
| +
|
| struct hb_ot_layout_t
|
| {
|
| hb_blob_t *gdef_blob;
|
| hb_blob_t *gsub_blob;
|
| hb_blob_t *gpos_blob;
|
|
|
| - const struct GDEF *gdef;
|
| - const struct GSUB *gsub;
|
| - const struct GPOS *gpos;
|
| + 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;
|
| +
|
| + hb_set_digest_t *gsub_digests;
|
| + hb_set_digest_t *gpos_digests;
|
| };
|
|
|
|
|
|
|