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