hb-ot-layout-gdef-table.hh revision 7f97d2cd904ea999c099c73c52187c5d65aeec67
164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod/* 2ee58aaebd296ea8237516754fd4e825d524b11b7Behdad Esfahbod * Copyright (C) 2007,2008,2009 Red Hat, Inc. 364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 4c755cb3e3ac55156d0d2ec05adea7a650b97cc41Behdad Esfahbod * This is part of HarfBuzz, a text shaping library. 564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Permission is hereby granted, without written agreement and without 764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * license or royalty fees, to use, copy, modify, and distribute this 864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * software and its documentation for any purpose, provided that the 964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * above copyright notice and the following two paragraphs appear in 1064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * all copies of this software. 1164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 1264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR 1364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES 1464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN 1564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH 1664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * DAMAGE. 1764aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 1864aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, 1964aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 2064aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS 2164aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO 2264aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. 2364aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * 2464aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod * Red Hat Author(s): Behdad Esfahbod 2564aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod */ 2664aef3a54999496fd1de4f5aa5b019e4c03b3836Behdad Esfahbod 275f5b24f99f52bbc922e238b65c06061ba07c8548Behdad Esfahbod#ifndef HB_OT_LAYOUT_GDEF_PRIVATE_HH 285f5b24f99f52bbc922e238b65c06061ba07c8548Behdad Esfahbod#define HB_OT_LAYOUT_GDEF_PRIVATE_HH 295b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod 305f5b24f99f52bbc922e238b65c06061ba07c8548Behdad Esfahbod#include "hb-ot-layout-common-private.hh" 315b3f7702a64fe0513d08a67bdb72704e46fd7cd4Behdad Esfahbod 32cc6d52279d10a2edcf0d86c3a18a79ff4f6d3858Behdad Esfahbod#include "hb-font-private.h" 3323c86aa0009324433e78fcd0c47f2c0ff14b1949Behdad Esfahbod 34acdba3f90b232fc12fcb200dca2584481b339118Behdad EsfahbodHB_BEGIN_DECLS 35acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 3612360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 371f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod/* 381f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * Attachment List Table 391f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod */ 404c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 41e4efdd80a8fa4edbcdec9cd84f35f5f4521943c2Behdad Esfahbodtypedef ArrayOf<USHORT> AttachPoint; /* Array of contour point indices--in 421f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * increasing numerical order */ 43303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 4460d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct AttachList 4560d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 46e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod inline unsigned int get_attach_points (hb_codepoint_t glyph_id, 47e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int start_offset, 48e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *point_count /* IN/OUT */, 49e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *point_array /* OUT */) const 50855720ca47bf5a7a44eb5b84dce9f7da6e7156bdBehdad Esfahbod { 5179420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod unsigned int index = (this+coverage) (glyph_id); 5262964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod if (index == NOT_COVERED) 5362964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod { 54e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod if (point_count) 55e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod *point_count = 0; 56e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod return 0; 5762964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod } 58e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod 5979420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod const AttachPoint &points = this+attachPoint[index]; 6079420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod 61e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod if (point_count) { 624f5f1c34dda1e0629bfa6d7b0ffa2e1ce003b7c7Behdad Esfahbod const USHORT *array = points.sub_array (start_offset, point_count); 6348de3730cdf91b9f6473509e22260a902ccec992Behdad Esfahbod unsigned int count = *point_count; 64e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod for (unsigned int i = 0; i < count; i++) 65e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod point_array[i] = array[i]; 66e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod } 6762964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod 68e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod return points.len; 69855720ca47bf5a7a44eb5b84dce9f7da6e7156bdBehdad Esfahbod } 704c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 71d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 723e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 73d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return coverage.sanitize (c, this) 74d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && attachPoint.sanitize (c, this); 75e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 76e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 77855720ca47bf5a7a44eb5b84dce9f7da6e7156bdBehdad Esfahbod private: 783d54bd1293069fc3d3bdeeea8ad45036f3ee65f3Behdad Esfahbod OffsetTo<Coverage> 793d54bd1293069fc3d3bdeeea8ad45036f3ee65f3Behdad Esfahbod coverage; /* Offset to Coverage table -- from 804c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod * beginning of AttachList table */ 815f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod OffsetArrayOf<AttachPoint> 825f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod attachPoint; /* Array of AttachPoint tables 835f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod * in Coverage Index order */ 84b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 850eb9fc6e37935707dba2bf4b3705de2161a08cb7Behdad Esfahbod DEFINE_SIZE_ARRAY (4, attachPoint); 864c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod}; 874c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 884c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod/* 894c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod * Ligature Caret Table 904c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod */ 914c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 9260d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct CaretValueFormat1 9360d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 947586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod friend struct CaretValue; 957586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod 967586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod private: 97d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id HB_UNUSED) const 9860d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod { 99d0b657379bbe63602953412d6bc944b2a0f430ebBehdad Esfahbod /* TODO vertical */ 1000a4399ca228d244e646abdb3487da0f13b228889Behdad Esfahbod return c->scale_x (coordinate); 1014c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod } 102303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 103d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 1043e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 105d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return c->check_struct (this); 106e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 107e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 108303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod private: 109303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod USHORT caretValueFormat; /* Format identifier--format = 1 */ 110303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod SHORT coordinate; /* X or Y value, in design units */ 111b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 112b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod DEFINE_SIZE_STATIC (4); 1134c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod}; 1144c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 11560d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct CaretValueFormat2 11660d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 1177586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod friend struct CaretValue; 1187586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod 1197586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod private: 120d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id) const 12160d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod { 122b52fbb1bab608bda76efb936f08344afaec600a1Behdad Esfahbod /* TODO vertical */ 1236f729b45b04243c42ad7201b67cda9d5e5c363f1Behdad Esfahbod hb_position_t x, y; 124d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod if (hb_font_get_contour_point (c->font, c->face, caretValuePoint, glyph_id, &x, &y)) 1256f729b45b04243c42ad7201b67cda9d5e5c363f1Behdad Esfahbod return x; 1266f729b45b04243c42ad7201b67cda9d5e5c363f1Behdad Esfahbod else 1276f729b45b04243c42ad7201b67cda9d5e5c363f1Behdad Esfahbod return 0; 1284c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod } 129303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 130d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 1313e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 132d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return c->check_struct (this); 133e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 134e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 135303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod private: 136303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod USHORT caretValueFormat; /* Format identifier--format = 2 */ 137303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod USHORT caretValuePoint; /* Contour point index on glyph */ 138b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 139b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod DEFINE_SIZE_STATIC (4); 1404c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod}; 1414c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 14260d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct CaretValueFormat3 14360d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 1447586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod friend struct CaretValue; 1457586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod 146d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id HB_UNUSED) const 14760d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod { 148d0b657379bbe63602953412d6bc944b2a0f430ebBehdad Esfahbod /* TODO vertical */ 149b634beb39e0a4fef7167a8af646f6b2d8cafe69bBehdad Esfahbod return c->scale_x (coordinate) + ((this+deviceTable).get_x_delta (c)); 150303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod } 151303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod 152d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 1533e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 154d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return c->check_struct (this) 155d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && deviceTable.sanitize (c, this); 156e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 157e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 158303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod private: 1594c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod USHORT caretValueFormat; /* Format identifier--format = 3 */ 1604c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod SHORT coordinate; /* X or Y value, in design units */ 161263bbef7670b59aa88ef9ba910579dfa51226524Behdad Esfahbod OffsetTo<Device> 162263bbef7670b59aa88ef9ba910579dfa51226524Behdad Esfahbod deviceTable; /* Offset to Device table for X or Y 1634c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod * value--from beginning of CaretValue 1644c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod * table */ 165b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 166b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod DEFINE_SIZE_STATIC (6); 1674c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod}; 1684c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 16960d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct CaretValue 17060d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 171d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline int get_caret_value (hb_ot_layout_context_t *c, hb_codepoint_t glyph_id) const 17260d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod { 173f8dc67b3c24dfc805da756a73cb217b36e16b4b8Behdad Esfahbod switch (u.format) { 174d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 1: return u.format1.get_caret_value (c, glyph_id); 175d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 2: return u.format2.get_caret_value (c, glyph_id); 176d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 3: return u.format3.get_caret_value (c, glyph_id); 1774c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod default:return 0; 1784c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod } 1794c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod } 1804c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod 181d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 1823e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 183d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod if (!u.format.sanitize (c)) return false; 184e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod switch (u.format) { 185d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 1: return u.format1.sanitize (c); 186d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 2: return u.format2.sanitize (c); 187d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 3: return u.format3.sanitize (c); 188e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod default:return true; 189e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 190e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 191e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 192303fe62824d4e99df554b6bfaacba05d068522fbBehdad Esfahbod private: 1934c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod union { 194f8dc67b3c24dfc805da756a73cb217b36e16b4b8Behdad Esfahbod USHORT format; /* Format identifier */ 195dacebcadae36b35531d635d81df2afb937677b7aBehdad Esfahbod CaretValueFormat1 format1; 196dacebcadae36b35531d635d81df2afb937677b7aBehdad Esfahbod CaretValueFormat2 format2; 197dacebcadae36b35531d635d81df2afb937677b7aBehdad Esfahbod CaretValueFormat3 format3; 1984c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod } u; 199ed07422c33bbb52ff4d79e65986171e3f07697d8Behdad Esfahbod public: 200596e471aa5053d955fb5d5b5923088c8814469b1Behdad Esfahbod DEFINE_SIZE_UNION (2, format); 2014c2556cb4c38a56c3a5087deb54aa6262ab3aff9Behdad Esfahbod}; 2021f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod 20360d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct LigGlyph 20460d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 205d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, 206e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod hb_codepoint_t glyph_id, 207e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int start_offset, 208e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *caret_count /* IN/OUT */, 209e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod int *caret_array /* OUT */) const 21062964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod { 211e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod if (caret_count) { 2124f5f1c34dda1e0629bfa6d7b0ffa2e1ce003b7c7Behdad Esfahbod const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count); 21348de3730cdf91b9f6473509e22260a902ccec992Behdad Esfahbod unsigned int count = *caret_count; 214e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod for (unsigned int i = 0; i < count; i++) 215d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod caret_array[i] = (this+array[i]).get_caret_value (c, glyph_id); 216e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod } 21762964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod 218e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod return carets.len; 21962964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod } 2207586089c6fa8185cad8387869d3703c637e5cbb1Behdad Esfahbod 221d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 2223e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 223d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return carets.sanitize (c, this); 224e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 225e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 22660d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod private: 2275f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod OffsetArrayOf<CaretValue> 2283564ee5216004d45d30b0ded61184cf8dde5dd89Behdad Esfahbod carets; /* Offset array of CaretValue tables 229e4efdd80a8fa4edbcdec9cd84f35f5f4521943c2Behdad Esfahbod * --from beginning of LigGlyph table 230e4efdd80a8fa4edbcdec9cd84f35f5f4521943c2Behdad Esfahbod * --in increasing coordinate order */ 231b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 2320eb9fc6e37935707dba2bf4b3705de2161a08cb7Behdad Esfahbod DEFINE_SIZE_ARRAY (2, carets); 2331f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod}; 234b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 23560d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct LigCaretList 23660d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 237d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, 238e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod hb_codepoint_t glyph_id, 239e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int start_offset, 240e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *caret_count /* IN/OUT */, 241e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod int *caret_array /* OUT */) const 242855720ca47bf5a7a44eb5b84dce9f7da6e7156bdBehdad Esfahbod { 24379420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod unsigned int index = (this+coverage) (glyph_id); 24462964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod if (index == NOT_COVERED) 24562964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod { 246e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod if (caret_count) 247e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod *caret_count = 0; 248e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod return 0; 24962964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod } 25062964afcecd96038cfaa8bc2bc931f43ee83be7eBehdad Esfahbod const LigGlyph &lig_glyph = this+ligGlyph[index]; 251d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return lig_glyph.get_lig_carets (c, glyph_id, start_offset, caret_count, caret_array); 252855720ca47bf5a7a44eb5b84dce9f7da6e7156bdBehdad Esfahbod } 25312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 254d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 2553e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 256d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return coverage.sanitize (c, this) 257d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && ligGlyph.sanitize (c, this); 258e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 259e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 26012360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod private: 2613d54bd1293069fc3d3bdeeea8ad45036f3ee65f3Behdad Esfahbod OffsetTo<Coverage> 2623d54bd1293069fc3d3bdeeea8ad45036f3ee65f3Behdad Esfahbod coverage; /* Offset to Coverage table--from 26312360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod * beginning of LigCaretList table */ 2645f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod OffsetArrayOf<LigGlyph> 2655f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod ligGlyph; /* Array of LigGlyph tables 2665f810363acc3ad3cba631a68620e3d37e54c95c4Behdad Esfahbod * in Coverage Index order */ 267b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 2680eb9fc6e37935707dba2bf4b3705de2161a08cb7Behdad Esfahbod DEFINE_SIZE_ARRAY (4, ligGlyph); 26912360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod}; 27012360f7c159826ae72271b34486dee59d96aa8caBehdad Esfahbod 271e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 272e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbodstruct MarkGlyphSetsFormat1 273e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod{ 274e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const 275e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; } 276e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 277d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 2783e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 279d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return coverage.sanitize (c, this); 280e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 281e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 282e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod private: 283e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod USHORT format; /* Format identifier--format = 1 */ 284e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod LongOffsetArrayOf<Coverage> 285e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod coverage; /* Array of long offsets to mark set 286e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod * coverage tables */ 287b3651231bf80bb7009214547a75ed90e21815c68Behdad Esfahbod public: 2880eb9fc6e37935707dba2bf4b3705de2161a08cb7Behdad Esfahbod DEFINE_SIZE_ARRAY (4, coverage); 289e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod}; 290e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 291e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbodstruct MarkGlyphSets 292e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod{ 293e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const 294e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod { 295e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod switch (u.format) { 296dacebcadae36b35531d635d81df2afb937677b7aBehdad Esfahbod case 1: return u.format1.covers (set_index, glyph_id); 297e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod default:return false; 298e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod } 299e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod } 300e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 301d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 3023e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 303d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod if (!u.format.sanitize (c)) return false; 304e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod switch (u.format) { 305d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod case 1: return u.format1.sanitize (c); 306e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod default:return true; 307e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 308e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 309e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 310e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod private: 311e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod union { 312e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod USHORT format; /* Format identifier */ 313dacebcadae36b35531d635d81df2afb937677b7aBehdad Esfahbod MarkGlyphSetsFormat1 format1; 314e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod } u; 315ed07422c33bbb52ff4d79e65986171e3f07697d8Behdad Esfahbod public: 316596e471aa5053d955fb5d5b5923088c8814469b1Behdad Esfahbod DEFINE_SIZE_UNION (2, format); 317e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod}; 318e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 319e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 3201f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod/* 321aefaafe5bc4fc6d37a412c135b1079c287be7045Behdad Esfahbod * GDEF 3221f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod */ 323b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 32460d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbodstruct GDEF 32560d77cf05fddc5304b4b1fc19cdedba15cbee1e9Behdad Esfahbod{ 326a328d66e6a8122f7d4d71941449d4d0136203e08Behdad Esfahbod static const hb_tag_t Tag = HB_OT_TAG_GDEF; 327600e5eb80f553ea8eb862e6784133574c74ca513Behdad Esfahbod 3284fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod enum { 3294fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod UnclassifiedGlyph = 0, 3304fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod BaseGlyph = 1, 3314fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod LigatureGlyph = 2, 3324fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod MarkGlyph = 3, 3338f034d5849627ee95a5889fa34c9ba294fff13caBehdad Esfahbod ComponentGlyph = 4 3344fa77d3c4305a76b956de8c1a9b83a961d035a80Behdad Esfahbod }; 335aff831ed6787abe8e24a977e34d97ff2e0b7dc21Behdad Esfahbod 3367f97d2cd904ea999c099c73c52187c5d65aeec67Behdad Esfahbod inline bool has_glyph_classes (void) const { return glyphClassDef != 0; } 337e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const 33879420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod { return (this+glyphClassDef).get_class (glyph); } 339b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 3407f97d2cd904ea999c099c73c52187c5d65aeec67Behdad Esfahbod inline bool has_mark_attachment_types (void) const { return markAttachClassDef != 0; } 341e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const 34279420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod { return (this+markAttachClassDef).get_class (glyph); } 34379420ad9caf2d5fc94c3693e8292edfa27060b2dBehdad Esfahbod 3447f97d2cd904ea999c099c73c52187c5d65aeec67Behdad Esfahbod inline bool has_attach_points (void) const { return attachList != 0; } 345e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod inline unsigned int get_attach_points (hb_codepoint_t glyph_id, 346e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int start_offset, 347e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *point_count /* IN/OUT */, 348e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *point_array /* OUT */) const 349e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod { return (this+attachList).get_attach_points (glyph_id, start_offset, point_count, point_array); } 350b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 3517f97d2cd904ea999c099c73c52187c5d65aeec67Behdad Esfahbod inline bool has_lig_carets (void) const { return ligCaretList != 0; } 352d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline unsigned int get_lig_carets (hb_ot_layout_context_t *c, 353e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod hb_codepoint_t glyph_id, 354e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int start_offset, 355e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod unsigned int *caret_count /* IN/OUT */, 356e21899bc3593aa0d3adf64cee21c5de2ea219783Behdad Esfahbod int *caret_array /* OUT */) const 357d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod { return (this+ligCaretList).get_lig_carets (c, glyph_id, start_offset, caret_count, caret_array); } 358b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 3597f97d2cd904ea999c099c73c52187c5d65aeec67Behdad Esfahbod inline bool has_mark_sets (void) const { return version >= 0x00010002 && markGlyphSetsDef[0] != 0; } 360e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const 361e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod { return version >= 0x00010002 && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); } 362e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod 363d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod inline bool sanitize (hb_sanitize_context_t *c) { 3643e2401f6c53d2b047954d75c37aef5e5e7cdc51aBehdad Esfahbod TRACE_SANITIZE (); 365d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod return version.sanitize (c) && likely (version.major == 1) 366d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && glyphClassDef.sanitize (c, this) 367d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && attachList.sanitize (c, this) 368d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && ligCaretList.sanitize (c, this) 369d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && markAttachClassDef.sanitize (c, this) 370d7cfb3b2d1dd2e9fdae2b3e540bbe313660895e8Behdad Esfahbod && (version < 0x00010002 || markGlyphSetsDef[0].sanitize (c, this)); 371e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod } 372e49a84c9e37c08808880e74e94c8160731ababa1Behdad Esfahbod 373238c855fcd4f0ef97a94a8662d2a2f2bb5c21ecbBehdad Esfahbod private: 374e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod FixedVersion version; /* Version of the GDEF table--currently 375e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod * 0x00010002 */ 3769e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod OffsetTo<ClassDef> 3779e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod glyphClassDef; /* Offset to class definition table 378b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod * for glyph type--from beginning of 3791f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * GDEF header (may be Null) */ 3809e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod OffsetTo<AttachList> 3819e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod attachList; /* Offset to list of glyphs with 382b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod * attachment points--from beginning 3831f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * of GDEF header (may be Null) */ 3849e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod OffsetTo<LigCaretList> 3859e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod ligCaretList; /* Offset to list of positioning points 386b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod * for ligature carets--from beginning 3871f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * of GDEF header (may be Null) */ 3889e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod OffsetTo<ClassDef> 3899e4d9d7b2721859172bc9c59c1aea27b01eb9c07Behdad Esfahbod markAttachClassDef; /* Offset to class definition table for 390b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod * mark attachment type--from beginning 3911f437e6f47fb6c15761021bd2078f31778f2179cBehdad Esfahbod * of GDEF header (may be Null) */ 392e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod OffsetTo<MarkGlyphSets> 393d3480ba37fbb5d4be75b094060f5b2f1ce98fb53Behdad Esfahbod markGlyphSetsDef[VAR]; /* Offset to the table of mark set 394e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod * definitions--from beginning of GDEF 395e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod * header (may be NULL). Introduced 396e4b92b85a7750bd4271ad607b3c41f0184e89febBehdad Esfahbod * in version 00010002. */ 397569da92bc6956f42d9b2d65c784e184fb6380efeBehdad Esfahbod public: 3980eb9fc6e37935707dba2bf4b3705de2161a08cb7Behdad Esfahbod DEFINE_SIZE_ARRAY (12, markGlyphSetsDef); 399b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod}; 400b9d7688fb3d45894901484b74095c4f11cab6196Behdad Esfahbod 4016f20f72e9c58ba23db2e31afa5d331acfea3d77eBehdad Esfahbod 402acdba3f90b232fc12fcb200dca2584481b339118Behdad EsfahbodHB_END_DECLS 403acdba3f90b232fc12fcb200dca2584481b339118Behdad Esfahbod 4045f5b24f99f52bbc922e238b65c06061ba07c8548Behdad Esfahbod#endif /* HB_OT_LAYOUT_GDEF_PRIVATE_HH */ 405