Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 1 | /* |
Behdad Esfahbod | ee58aae | 2009-05-17 05:14:33 -0400 | [diff] [blame] | 2 | * Copyright (C) 2007,2008,2009 Red Hat, Inc. |
Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 3 | * |
| 4 | * This is part of HarfBuzz, an OpenType Layout engine library. |
| 5 | * |
| 6 | * Permission is hereby granted, without written agreement and without |
| 7 | * license or royalty fees, to use, copy, modify, and distribute this |
| 8 | * software and its documentation for any purpose, provided that the |
| 9 | * above copyright notice and the following two paragraphs appear in |
| 10 | * all copies of this software. |
| 11 | * |
| 12 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
| 13 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
| 14 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
| 15 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
| 16 | * DAMAGE. |
| 17 | * |
| 18 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
| 19 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| 20 | * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
| 21 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
| 22 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
| 23 | * |
| 24 | * Red Hat Author(s): Behdad Esfahbod |
| 25 | */ |
| 26 | |
Behdad Esfahbod | 8dd1c8b | 2008-01-23 05:00:30 -0500 | [diff] [blame] | 27 | #ifndef HB_OT_LAYOUT_GDEF_PRIVATE_H |
| 28 | #define HB_OT_LAYOUT_GDEF_PRIVATE_H |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 29 | |
Behdad Esfahbod | 6f20f72 | 2009-05-17 20:28:01 -0400 | [diff] [blame^] | 30 | #include "hb-ot-layout-common-private.h" |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 31 | |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 32 | |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 33 | #define DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP(Type, array, name) \ |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 34 | inline const Type& name (hb_codepoint_t glyph) { \ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 35 | return this+array[(this+coverage)(glyph)]; \ |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 36 | } |
| 37 | |
| 38 | |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 39 | struct GlyphClassDef : ClassDef { |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 40 | static const unsigned int BaseGlyph = 0x0001u; |
| 41 | static const unsigned int LigatureGlyph = 0x0002u; |
| 42 | static const unsigned int MarkGlyph = 0x0003u; |
| 43 | static const unsigned int ComponentGlyph = 0x0004u; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 44 | }; |
| 45 | |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 46 | /* |
| 47 | * Attachment List Table |
| 48 | */ |
| 49 | |
| 50 | struct AttachPoint { |
Behdad Esfahbod | c9a7cbe | 2009-05-17 01:22:51 -0400 | [diff] [blame] | 51 | ArrayOf<USHORT> |
| 52 | pointIndex; /* Array of contour point indices--in |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 53 | * increasing numerical order */ |
| 54 | }; |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 55 | ASSERT_SIZE (AttachPoint, 2); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 56 | |
| 57 | struct AttachList { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 58 | |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 59 | /* const AttachPoint& get_attach_points (hb_codepoint_t glyph); */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 60 | DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP (AttachPoint, attachPoint, get_attach_points); |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 61 | |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 62 | private: |
Behdad Esfahbod | 3d54bd1 | 2009-05-17 00:15:51 -0400 | [diff] [blame] | 63 | OffsetTo<Coverage> |
| 64 | coverage; /* Offset to Coverage table -- from |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 65 | * beginning of AttachList table */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 66 | OffsetArrayOf<AttachPoint> |
| 67 | attachPoint; /* Array of AttachPoint tables |
| 68 | * in Coverage Index order */ |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 69 | }; |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 70 | ASSERT_SIZE (AttachList, 4); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 71 | |
| 72 | /* |
| 73 | * Ligature Caret Table |
| 74 | */ |
| 75 | |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 76 | struct CaretValueFormat1 { |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 77 | |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 78 | friend struct CaretValue; |
| 79 | |
| 80 | private: |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 81 | inline int get_caret_value (int ppem) const { |
| 82 | return /* TODO garbage */ coordinate / ppem; |
| 83 | } |
| 84 | |
| 85 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 86 | USHORT caretValueFormat; /* Format identifier--format = 1 */ |
| 87 | SHORT coordinate; /* X or Y value, in design units */ |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 88 | }; |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 89 | ASSERT_SIZE (CaretValueFormat1, 4); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 90 | |
| 91 | struct CaretValueFormat2 { |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 92 | |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 93 | friend struct CaretValue; |
| 94 | |
| 95 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 96 | inline int get_caret_value (int ppem) const { |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 97 | return /* TODO garbage */ 0 / ppem; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 98 | } |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 99 | |
| 100 | private: |
| 101 | USHORT caretValueFormat; /* Format identifier--format = 2 */ |
| 102 | USHORT caretValuePoint; /* Contour point index on glyph */ |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 103 | }; |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 104 | ASSERT_SIZE (CaretValueFormat2, 4); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 105 | |
| 106 | struct CaretValueFormat3 { |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 107 | |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 108 | friend struct CaretValue; |
| 109 | |
| 110 | private: |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 111 | inline const Device& get_device (void) const { |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 112 | if (HB_UNLIKELY (!deviceTable)) return Null(Device); |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 113 | return *(const Device*)((const char*)this + deviceTable); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 114 | } |
| 115 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 116 | inline int get_caret_value (int ppem) const { |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 117 | return /* TODO garbage */ (coordinate + get_device().get_delta (ppem)) / ppem; |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 118 | } |
| 119 | |
| 120 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 121 | USHORT caretValueFormat; /* Format identifier--format = 3 */ |
| 122 | SHORT coordinate; /* X or Y value, in design units */ |
| 123 | Offset deviceTable; /* Offset to Device table for X or Y |
| 124 | * value--from beginning of CaretValue |
| 125 | * table */ |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 126 | }; |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 127 | ASSERT_SIZE (CaretValueFormat3, 6); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 128 | |
| 129 | struct CaretValue { |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 130 | /* XXX we need access to a load-contour-point vfunc here */ |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 131 | int get_caret_value (int ppem) const { |
Behdad Esfahbod | f8dc67b | 2009-05-17 19:47:54 -0400 | [diff] [blame] | 132 | switch (u.format) { |
| 133 | case 1: return u.format1->get_caret_value(ppem); |
| 134 | case 2: return u.format2->get_caret_value(ppem); |
| 135 | case 3: return u.format3->get_caret_value(ppem); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 136 | default:return 0; |
| 137 | } |
| 138 | } |
| 139 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 140 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 141 | union { |
Behdad Esfahbod | f8dc67b | 2009-05-17 19:47:54 -0400 | [diff] [blame] | 142 | USHORT format; /* Format identifier */ |
| 143 | CaretValueFormat1 format1[]; |
| 144 | CaretValueFormat2 format2[]; |
| 145 | CaretValueFormat3 format3[]; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 146 | } u; |
| 147 | }; |
Behdad Esfahbod | f8dc67b | 2009-05-17 19:47:54 -0400 | [diff] [blame] | 148 | ASSERT_SIZE (CaretValue, 2); |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 149 | |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 150 | struct LigGlyph { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 151 | |
| 152 | friend struct LigCaretList; |
| 153 | |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 154 | OffsetArrayOf<CaretValue> |
| 155 | caret; /* Array of CaretValue tables |
| 156 | * in increasing coordinate order */ |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 157 | }; |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 158 | ASSERT_SIZE (LigGlyph, 2); |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 159 | |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 160 | struct LigCaretList { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 161 | |
| 162 | friend struct GDEF; |
| 163 | |
| 164 | private: |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 165 | /* const LigGlyph& get_lig_glyph (hb_codepoint_t glyph); */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 166 | DEFINE_INDIRECT_GLYPH_ARRAY_LOOKUP (LigGlyph, ligGlyph, get_lig_glyph); |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 167 | |
| 168 | private: |
Behdad Esfahbod | 3d54bd1 | 2009-05-17 00:15:51 -0400 | [diff] [blame] | 169 | OffsetTo<Coverage> |
| 170 | coverage; /* Offset to Coverage table--from |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 171 | * beginning of LigCaretList table */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 172 | OffsetArrayOf<LigGlyph> |
| 173 | ligGlyph; /* Array of LigGlyph tables |
| 174 | * in Coverage Index order */ |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 175 | }; |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 176 | ASSERT_SIZE (LigCaretList, 4); |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 177 | |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 178 | /* |
Behdad Esfahbod | aefaafe | 2008-01-23 17:25:29 -0500 | [diff] [blame] | 179 | * GDEF |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 180 | */ |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 181 | |
Behdad Esfahbod | aefaafe | 2008-01-23 17:25:29 -0500 | [diff] [blame] | 182 | struct GDEF { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 183 | static const hb_tag_t Tag = HB_TAG ('G','D','E','F'); |
Behdad Esfahbod | 600e5eb | 2008-01-23 02:01:37 -0500 | [diff] [blame] | 184 | |
Behdad Esfahbod | aff831e | 2008-01-24 06:03:45 -0500 | [diff] [blame] | 185 | static const hb_ot_layout_class_t UnclassifiedGlyph = 0; |
| 186 | static const hb_ot_layout_class_t BaseGlyph = 1; |
| 187 | static const hb_ot_layout_class_t LigatureGlyph = 2; |
| 188 | static const hb_ot_layout_class_t MarkGlyph = 3; |
| 189 | static const hb_ot_layout_class_t ComponentGlyph = 4; |
| 190 | |
Behdad Esfahbod | aefaafe | 2008-01-23 17:25:29 -0500 | [diff] [blame] | 191 | STATIC_DEFINE_GET_FOR_DATA (GDEF); |
| 192 | /* XXX check version here? */ |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 193 | |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 194 | inline bool has_glyph_classes () const { return glyphClassDef != 0; } |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 195 | inline hb_ot_layout_class_t get_glyph_class (hb_codepoint_t glyph) const { |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 196 | return glyphClassDef(this).get_class (glyph); |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 197 | } |
| 198 | |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 199 | inline bool has_mark_attachment_types () const { return markAttachClassDef != 0; } |
Behdad Esfahbod | 2d15e72 | 2009-04-15 19:50:16 -0400 | [diff] [blame] | 200 | inline hb_ot_layout_class_t get_mark_attachment_type (hb_codepoint_t glyph) const { |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 201 | return markAttachClassDef(this).get_class (glyph); |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | /* TODO get_attach and get_lig_caret */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 205 | inline bool has_attach_list () const { return attachList != 0; } |
| 206 | inline bool has_lig_caret_list () const { return ligCaretList != 0; } |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 207 | |
Behdad Esfahbod | 238c855 | 2009-05-17 00:22:37 -0400 | [diff] [blame] | 208 | private: |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 209 | Fixed version; /* Version of the GDEF table--initially |
| 210 | * 0x00010000 */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 211 | OffsetTo<ClassDef> |
| 212 | glyphClassDef; /* Offset to class definition table |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 213 | * for glyph type--from beginning of |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 214 | * GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 215 | OffsetTo<AttachList> |
| 216 | attachList; /* Offset to list of glyphs with |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 217 | * attachment points--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 218 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 219 | OffsetTo<LigCaretList> |
| 220 | ligCaretList; /* Offset to list of positioning points |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 221 | * for ligature carets--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 222 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 223 | OffsetTo<ClassDef> |
| 224 | markAttachClassDef; /* Offset to class definition table for |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 225 | * mark attachment type--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 226 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 227 | }; |
Behdad Esfahbod | 8b83580 | 2009-05-16 22:48:14 -0400 | [diff] [blame] | 228 | ASSERT_SIZE (GDEF, 12); |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 229 | |
Behdad Esfahbod | 6f20f72 | 2009-05-17 20:28:01 -0400 | [diff] [blame^] | 230 | |
Behdad Esfahbod | 8dd1c8b | 2008-01-23 05:00:30 -0500 | [diff] [blame] | 231 | #endif /* HB_OT_LAYOUT_GDEF_PRIVATE_H */ |