15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2007,2008,2009  Red Hat, Inc.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Copyright © 2010,2011,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_GDEF_TABLE_HH
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define HB_OT_LAYOUT_GDEF_TABLE_HH
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-ot-layout-common-private.hh"
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "hb-font-private.hh"
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace OT {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Attachment List Table
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef ArrayOf<USHORT> AttachPoint;	/* Array of contour point indices--in
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * increasing numerical order */
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct AttachList
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_attach_points (hb_codepoint_t glyph_id,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int start_offset,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int *point_count /* IN/OUT */,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int *point_array /* OUT */) const
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int index = (this+coverage).get_coverage (glyph_id);
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index == NOT_COVERED)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (point_count)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*point_count = 0;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const AttachPoint &points = this+attachPoint[index];
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (point_count) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const USHORT *array = points.sub_array (start_offset, point_count);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int count = *point_count;
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (unsigned int i = 0; i < count; i++)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	point_array[i] = array[i];
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return points.len;
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (coverage.sanitize (c, this) && attachPoint.sanitize (c, this));
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<Coverage>
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		coverage;		/* Offset to Coverage table -- from
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * beginning of AttachList table */
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetArrayOf<AttachPoint>
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attachPoint;		/* Array of AttachPoint tables
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * in Coverage Index order */
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_ARRAY (4, attachPoint);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Ligature Caret Table
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CaretValueFormat1
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct CaretValue;
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private:
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate);
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (c->check_struct (this));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT	caretValueFormat;	/* Format identifier--format = 1 */
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHORT		coordinate;		/* X or Y value, in design units */
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_STATIC (4);
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CaretValueFormat2
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct CaretValue;
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  private:
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    hb_position_t x, y;
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (font->get_glyph_contour_point_for_origin (glyph_id, caretValuePoint, direction, &x, &y))
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (c->check_struct (this));
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT	caretValueFormat;	/* Format identifier--format = 2 */
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT	caretValuePoint;	/* Contour point index on glyph */
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_STATIC (4);
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CaretValueFormat3
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct CaretValue;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return HB_DIRECTION_IS_HORIZONTAL (direction) ?
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font) :
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (c->check_struct (this) && deviceTable.sanitize (c, this));
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT	caretValueFormat;	/* Format identifier--format = 3 */
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHORT		coordinate;		/* X or Y value, in design units */
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<Device>
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		deviceTable;		/* Offset to Device table for X or Y
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * value--from beginning of CaretValue
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * table */
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_STATIC (6);
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct CaretValue
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (u.format) {
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1: return u.format1.get_caret_value (font, direction, glyph_id);
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2: return u.format2.get_caret_value (font, direction, glyph_id);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3: return u.format3.get_caret_value (font, direction, glyph_id);
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:return 0;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (u.format) {
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1: return TRACE_RETURN (u.format1.sanitize (c));
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 2: return TRACE_RETURN (u.format2.sanitize (c));
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 3: return TRACE_RETURN (u.format3.sanitize (c));
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:return TRACE_RETURN (true);
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT		format;		/* Format identifier */
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaretValueFormat1	format1;
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaretValueFormat2	format2;
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CaretValueFormat3	format3;
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } u;
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_UNION (2, format);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LigGlyph
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_lig_carets (hb_font_t *font,
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_direction_t direction,
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_codepoint_t glyph_id,
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int start_offset,
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int *caret_count /* IN/OUT */,
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_position_t *caret_array /* OUT */) const
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (caret_count) {
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count);
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      unsigned int count = *caret_count;
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      for (unsigned int i = 0; i < count; i++)
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id);
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return carets.len;
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (carets.sanitize (c, this));
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetArrayOf<CaretValue>
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		carets;			/* Offset array of CaretValue tables
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * --from beginning of LigGlyph table
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * --in increasing coordinate order */
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_ARRAY (2, carets);
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct LigCaretList
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_lig_carets (hb_font_t *font,
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_direction_t direction,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_codepoint_t glyph_id,
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int start_offset,
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int *caret_count /* IN/OUT */,
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_position_t *caret_array /* OUT */) const
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    unsigned int index = (this+coverage).get_coverage (glyph_id);
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (index == NOT_COVERED)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (caret_count)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	*caret_count = 0;
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      return 0;
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const LigGlyph &lig_glyph = this+ligGlyph[index];
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return lig_glyph.get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array);
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (coverage.sanitize (c, this) && ligGlyph.sanitize (c, this));
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<Coverage>
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		coverage;		/* Offset to Coverage table--from
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * beginning of LigCaretList table */
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetArrayOf<LigGlyph>
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ligGlyph;		/* Array of LigGlyph tables
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * in Coverage Index order */
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_ARRAY (4, ligGlyph);
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MarkGlyphSetsFormat1
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; }
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
2792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (coverage.sanitize (c, this));
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT	format;			/* Format identifier--format = 1 */
2855f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  ArrayOf<OffsetTo<Coverage, ULONG> >
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		coverage;		/* Array of long offsets to mark set
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * coverage tables */
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_ARRAY (4, coverage);
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct MarkGlyphSets
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (u.format) {
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1: return u.format1.covers (set_index, glyph_id);
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:return false;
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (!u.format.sanitize (c)) return TRACE_RETURN (false);
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (u.format) {
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case 1: return TRACE_RETURN (u.format1.sanitize (c));
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:return TRACE_RETURN (true);
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  union {
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  USHORT		format;		/* Format identifier */
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MarkGlyphSetsFormat1	format1;
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  } u;
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_UNION (2, format);
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * GDEF -- The Glyph Definition Table
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GDEF
3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){
327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  static const hb_tag_t tableTag	= HB_OT_TAG_GDEF;
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum GlyphClasses {
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    UnclassifiedGlyph	= 0,
3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    BaseGlyph		= 1,
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    LigatureGlyph	= 2,
3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    MarkGlyph		= 3,
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ComponentGlyph	= 4
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool has_glyph_classes (void) const { return glyphClassDef != 0; }
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_glyph_class (hb_codepoint_t glyph) const
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { return (this+glyphClassDef).get_class (glyph); }
3402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  inline void get_glyphs_in_class (unsigned int klass, hb_set_t *glyphs) const
3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  { (this+glyphClassDef).add_class (glyphs, klass); }
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool has_mark_attachment_types (void) const { return markAttachClassDef != 0; }
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const
3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { return (this+markAttachClassDef).get_class (glyph); }
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool has_attach_points (void) const { return attachList != 0; }
3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_attach_points (hb_codepoint_t glyph_id,
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int start_offset,
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int *point_count /* IN/OUT */,
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 unsigned int *point_array /* OUT */) const
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { return (this+attachList).get_attach_points (glyph_id, start_offset, point_count, point_array); }
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool has_lig_carets (void) const { return ligCaretList != 0; }
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_lig_carets (hb_font_t *font,
3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_direction_t direction,
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_codepoint_t glyph_id,
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int start_offset,
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      unsigned int *caret_count /* IN/OUT */,
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)				      hb_position_t *caret_array /* OUT */) const
3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { return (this+ligCaretList).get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array); }
3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  inline bool has_mark_sets (void) const { return version.to_int () >= 0x00010002u && markGlyphSetsDef[0] != 0; }
3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const
3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  { return version.to_int () >= 0x00010002u && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); }
3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline bool sanitize (hb_sanitize_context_t *c) {
3682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    TRACE_SANITIZE (this);
3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return TRACE_RETURN (version.sanitize (c) &&
3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 likely (version.major == 1) &&
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 glyphClassDef.sanitize (c, this) &&
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 attachList.sanitize (c, this) &&
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 ligCaretList.sanitize (c, this) &&
3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)			 markAttachClassDef.sanitize (c, this) &&
3755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)			 (version.to_int () < 0x00010002u || markGlyphSetsDef[0].sanitize (c, this)));
3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing
3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * glyph class and other bits, and high 8-bit gthe mark attachment type (if any).
3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Not to be confused with lookup_props which is very similar. */
3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  inline unsigned int get_glyph_props (hb_codepoint_t glyph) const
3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  {
3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    unsigned int klass = get_glyph_class (glyph);
3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
386f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH == (unsigned int) LookupFlag::IgnoreBaseGlyphs);
387f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE == (unsigned int) LookupFlag::IgnoreLigatures);
388f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ASSERT_STATIC ((unsigned int) HB_OT_LAYOUT_GLYPH_PROPS_MARK == (unsigned int) LookupFlag::IgnoreMarks);
389f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    switch (klass) {
391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    default:			return 0;
3922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case BaseGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH;
3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    case LigatureGlyph:		return HB_OT_LAYOUT_GLYPH_PROPS_LIGATURE;
3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    case MarkGlyph:
3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)	  klass = get_mark_attachment_type (glyph);
3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)	  return HB_OT_LAYOUT_GLYPH_PROPS_MARK | (klass << 8);
3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  protected:
4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  FixedVersion	version;		/* Version of the GDEF table--currently
4035f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)					 * 0x00010002u */
4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<ClassDef>
4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		glyphClassDef;		/* Offset to class definition table
4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * for glyph type--from beginning of
4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * GDEF header (may be Null) */
4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<AttachList>
4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		attachList;		/* Offset to list of glyphs with
4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * attachment points--from beginning
4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * of GDEF header (may be Null) */
4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<LigCaretList>
4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		ligCaretList;		/* Offset to list of positioning points
4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * for ligature carets--from beginning
4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * of GDEF header (may be Null) */
4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<ClassDef>
4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		markAttachClassDef;	/* Offset to class definition table for
4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * mark attachment type--from beginning
4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * of GDEF header (may be Null) */
4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  OffsetTo<MarkGlyphSets>
4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)		markGlyphSetsDef[VAR];	/* Offset to the table of mark set
4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * definitions--from beginning of GDEF
4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * header (may be NULL).  Introduced
4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)					 * in version 00010002. */
4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DEFINE_SIZE_ARRAY (12, markGlyphSetsDef);
4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} /* namespace OT */
4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
4335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif /* HB_OT_LAYOUT_GDEF_TABLE_HH */
434