15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2007,2008,2009  Red Hat, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2012  Google, Inc.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  This is part of HarfBuzz, a text shaping library.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Permission is hereby granted, without written agreement and without
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * license or royalty fees, to use, copy, modify, and distribute this
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * software and its documentation for any purpose, provided that the
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * above copyright notice and the following two paragraphs appear in
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * all copies of this software.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * DAMAGE.
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Red Hat Author(s): Behdad Esfahbod
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Google Author(s): Behdad Esfahbod
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef HB_OT_LAYOUT_PRIVATE_HH
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_OT_LAYOUT_PRIVATE_HH
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-private.hh"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-ot-layout.h"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-font-private.hh"
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-buffer-private.hh"
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-set-private.hh"
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* buffer var allocations, used during the GSUB/GPOS processing */
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define glyph_props()		var1.u16[0] /* GDEF glyph properties */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define syllable()		var1.u8[2] /* GSUB/GPOS shaping boundaries */
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define lig_props()		var1.u8[3] /* GSUB/GPOS ligature tracking */
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)/* buffer var allocations, used during the entire shaping process */
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define unicode_props0()	var2.u8[0]
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#define unicode_props1()	var2.u8[1]
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void
52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode)
53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) |
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			   (unicode->is_default_ignorable (info->codepoint) ? 0x80 : 0) |
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			   (info->codepoint == 0x200C ? 0x40 : 0) |
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			   (info->codepoint == 0x200D ? 0x20 : 0);
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->unicode_props1() = unicode->modified_combining_class (info->codepoint);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline hb_unicode_general_category_t
62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_get_general_category (const hb_glyph_info_t *info)
63c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return (hb_unicode_general_category_t) (info->unicode_props0() & 0x1F);
65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline void
68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info, unsigned int modified_class)
69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  info->unicode_props1() = modified_class;
71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
72c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
73c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline unsigned int
74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return info->unicode_props1();
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
78c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline hb_bool_t
80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !!(info->unicode_props0() & 0x80);
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline hb_bool_t
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_is_zwnj (const hb_glyph_info_t *info)
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !!(info->unicode_props0() & 0x40);
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)inline hb_bool_t
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)_hb_glyph_info_is_zwj (const hb_glyph_info_t *info)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles){
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return !!(info->unicode_props0() & 0x20);
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define hb_ot_layout_from_face(face) ((hb_ot_layout_t *) face->shaper_data.ot)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GDEF
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef enum {
105c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HB_OT_LAYOUT_GLYPH_PROPS_UNCLASSIFIED	= 1 << HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED,
106c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH	= 1 << HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH,
107c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE	= 1 << HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE,
108c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HB_OT_LAYOUT_GLYPH_PROPS_MARK		= 1 << HB_OT_LAYOUT_GLYPH_CLASS_MARK,
109c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  HB_OT_LAYOUT_GLYPH_PROPS_COMPONENT	= 1 << HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT
1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} hb_ot_layout_glyph_class_mask_t;
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GSUB/GPOS
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* lig_id / lig_comp
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When a ligature is formed:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - The ligature glyph and any marks in between all the same newly allocated
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     lig_id,
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - The ligature glyph will get lig_num_comps set to the number of components
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - The marks get lig_comp > 0, reflecting which component of the ligature
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     they were applied to.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - This is used in GPOS to attach marks to the right component of a ligature
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     in MarkLigPos.
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * When a multiple-substitution is done:
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - All resulting glyphs will have lig_id = 0,
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - The resulting glyphs will have lig_comp = 0, 1, 2, ... respectively.
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   - This is used in GPOS to attach marks to the first component of a
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     multiple substitution in MarkBasePos.
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The numbers are also used in GPOS to do mark-to-mark positioning only
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * to marks that belong to the same component of a ligature in MarkMarPos.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define IS_LIG_BASE 0x10
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set_lig_props_for_ligature (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_num_comps)
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.lig_props() = (lig_id << 5) | IS_LIG_BASE | (lig_num_comps & 0x0F);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set_lig_props_for_mark (hb_glyph_info_t &info, unsigned int lig_id, unsigned int lig_comp)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  info.lig_props() = (lig_id << 5) | (lig_comp & 0x0F);
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline void
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)set_lig_props_for_component (hb_glyph_info_t &info, unsigned int comp)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  set_lig_props_for_mark (info, 0, comp);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline unsigned int
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_lig_id (const hb_glyph_info_t &info)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return info.lig_props() >> 5;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline bool
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)is_a_ligature (const hb_glyph_info_t &info)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !!(info.lig_props() & IS_LIG_BASE);
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline unsigned int
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_lig_comp (const hb_glyph_info_t &info)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (is_a_ligature (info))
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return info.lig_props() & 0x0F;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline unsigned int
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)get_lig_num_comps (const hb_glyph_info_t &info)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if ((info.glyph_props() & HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE) && is_a_ligature (info))
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return info.lig_props() & 0x0F;
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1;
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static inline uint8_t allocate_lig_id (hb_buffer_t *buffer) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  uint8_t lig_id = buffer->next_serial () & 0x07;
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (unlikely (!lig_id))
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lig_id = allocate_lig_id (buffer); /* in case of overflow */
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return lig_id;
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL hb_bool_t
1932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)hb_ot_layout_lookup_would_substitute_fast (hb_face_t            *face,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   unsigned int          lookup_index,
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   const hb_codepoint_t *glyphs,
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   unsigned int          glyphs_length,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					   hb_bool_t             zero_context);
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Should be called before all the substitute_lookup's are done. */
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL void
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_substitute_start (hb_font_t    *font,
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			       hb_buffer_t  *buffer);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL hb_bool_t
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_substitute_lookup (hb_font_t    *font,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				hb_buffer_t  *buffer,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				unsigned int  lookup_index,
209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)				hb_mask_t     mask,
210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)				hb_bool_t     auto_zwj);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Should be called after all the substitute_lookup's are done */
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL void
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_substitute_finish (hb_font_t    *font,
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				hb_buffer_t  *buffer);
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Should be called before all the position_lookup's are done.  Resets positions to zero. */
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL void
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_position_start (hb_font_t    *font,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			     hb_buffer_t  *buffer);
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL hb_bool_t
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_position_lookup (hb_font_t    *font,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      hb_buffer_t  *buffer,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			      unsigned int  lookup_index,
227c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			      hb_mask_t     mask,
228c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			      hb_bool_t     auto_zwj);
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Should be called after all the position_lookup's are done */
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL void
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)hb_ot_layout_position_finish (hb_font_t    *font,
233c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)			      hb_buffer_t  *buffer);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * hb_ot_layout_t
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace OT {
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct GDEF;
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct GSUB;
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  struct GPOS;
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct hb_ot_layout_t
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_blob_t *gdef_blob;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_blob_t *gsub_blob;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_blob_t *gpos_blob;
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct OT::GDEF *gdef;
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct OT::GSUB *gsub;
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const struct OT::GPOS *gpos;
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int gsub_lookup_count;
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned int gpos_lookup_count;
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_set_digest_t *gsub_digests;
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  hb_set_digest_t *gpos_digests;
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL hb_ot_layout_t *
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_ot_layout_create (hb_face_t *face);
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HB_INTERNAL void
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)_hb_ot_layout_destroy (hb_ot_layout_t *layout);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HB_OT_LAYOUT_PRIVATE_HH */
274