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