Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 1 | /* |
Behdad Esfahbod | 2409d5f | 2011-04-21 17:14:28 -0400 | [diff] [blame] | 2 | * Copyright © 2007,2008,2009 Red Hat, Inc. |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 3 | * Copyright © 2010,2011 Google, Inc. |
Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 4 | * |
Behdad Esfahbod | c755cb3 | 2010-04-22 00:11:43 -0400 | [diff] [blame] | 5 | * This is part of HarfBuzz, a text shaping library. |
Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 6 | * |
| 7 | * Permission is hereby granted, without written agreement and without |
| 8 | * license or royalty fees, to use, copy, modify, and distribute this |
| 9 | * software and its documentation for any purpose, provided that the |
| 10 | * above copyright notice and the following two paragraphs appear in |
| 11 | * all copies of this software. |
| 12 | * |
| 13 | * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR |
| 14 | * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES |
| 15 | * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN |
| 16 | * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH |
| 17 | * DAMAGE. |
| 18 | * |
| 19 | * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, |
| 20 | * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| 21 | * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS |
| 22 | * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO |
| 23 | * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. |
| 24 | * |
| 25 | * Red Hat Author(s): Behdad Esfahbod |
Behdad Esfahbod | 98370e8 | 2010-10-27 17:39:01 -0400 | [diff] [blame] | 26 | * Google Author(s): Behdad Esfahbod |
Behdad Esfahbod | 64aef3a | 2008-01-23 16:14:38 -0500 | [diff] [blame] | 27 | */ |
| 28 | |
Behdad Esfahbod | 7a750ac | 2011-08-17 14:19:59 +0200 | [diff] [blame^] | 29 | #ifndef HB_OT_LAYOUT_GDEF_TABLE_HH |
| 30 | #define HB_OT_LAYOUT_GDEF_TABLE_HH |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 31 | |
Behdad Esfahbod | 5f5b24f | 2009-08-02 20:03:12 -0400 | [diff] [blame] | 32 | #include "hb-ot-layout-common-private.hh" |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 33 | |
Behdad Esfahbod | c57d454 | 2011-04-20 18:50:27 -0400 | [diff] [blame] | 34 | #include "hb-font-private.hh" |
Behdad Esfahbod | 23c86aa | 2009-08-03 21:40:20 -0400 | [diff] [blame] | 35 | |
Behdad Esfahbod | acdba3f | 2010-07-23 15:11:18 -0400 | [diff] [blame] | 36 | |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 37 | |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 38 | /* |
| 39 | * Attachment List Table |
| 40 | */ |
| 41 | |
Behdad Esfahbod | e4efdd8 | 2009-05-22 18:54:24 -0400 | [diff] [blame] | 42 | typedef ArrayOf<USHORT> AttachPoint; /* Array of contour point indices--in |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 43 | * increasing numerical order */ |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 44 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 45 | struct AttachList |
| 46 | { |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 47 | inline unsigned int get_attach_points (hb_codepoint_t glyph_id, |
| 48 | unsigned int start_offset, |
| 49 | unsigned int *point_count /* IN/OUT */, |
| 50 | unsigned int *point_array /* OUT */) const |
Behdad Esfahbod | 855720c | 2009-05-26 12:00:28 -0400 | [diff] [blame] | 51 | { |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 52 | unsigned int index = (this+coverage) (glyph_id); |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 53 | if (index == NOT_COVERED) |
| 54 | { |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 55 | if (point_count) |
| 56 | *point_count = 0; |
| 57 | return 0; |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 58 | } |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 59 | |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 60 | const AttachPoint &points = this+attachPoint[index]; |
| 61 | |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 62 | if (point_count) { |
Behdad Esfahbod | 4f5f1c3 | 2010-04-22 00:27:39 -0400 | [diff] [blame] | 63 | const USHORT *array = points.sub_array (start_offset, point_count); |
Behdad Esfahbod | 48de373 | 2009-11-04 16:59:50 -0500 | [diff] [blame] | 64 | unsigned int count = *point_count; |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 65 | for (unsigned int i = 0; i < count; i++) |
| 66 | point_array[i] = array[i]; |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 67 | } |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 68 | |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 69 | return points.len; |
Behdad Esfahbod | 855720c | 2009-05-26 12:00:28 -0400 | [diff] [blame] | 70 | } |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 71 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 72 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 73 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 74 | return coverage.sanitize (c, this) |
| 75 | && attachPoint.sanitize (c, this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 76 | } |
| 77 | |
Behdad Esfahbod | 855720c | 2009-05-26 12:00:28 -0400 | [diff] [blame] | 78 | private: |
Behdad Esfahbod | 3d54bd1 | 2009-05-17 00:15:51 -0400 | [diff] [blame] | 79 | OffsetTo<Coverage> |
| 80 | coverage; /* Offset to Coverage table -- from |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 81 | * beginning of AttachList table */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 82 | OffsetArrayOf<AttachPoint> |
| 83 | attachPoint; /* Array of AttachPoint tables |
| 84 | * in Coverage Index order */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 85 | public: |
Behdad Esfahbod | 0eb9fc6 | 2010-05-10 19:01:17 -0400 | [diff] [blame] | 86 | DEFINE_SIZE_ARRAY (4, attachPoint); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 87 | }; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 88 | |
| 89 | /* |
| 90 | * Ligature Caret Table |
| 91 | */ |
| 92 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 93 | struct CaretValueFormat1 |
| 94 | { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 95 | friend struct CaretValue; |
| 96 | |
| 97 | private: |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 98 | inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 99 | { |
Behdad Esfahbod | b6f902a | 2011-05-11 00:04:15 -0400 | [diff] [blame] | 100 | return HB_DIRECTION_IS_HORIZONTAL (direction) ? font->em_scale_x (coordinate) : font->em_scale_y (coordinate); |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 101 | } |
| 102 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 103 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 104 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 105 | return c->check_struct (this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 106 | } |
| 107 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 108 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 109 | USHORT caretValueFormat; /* Format identifier--format = 1 */ |
| 110 | SHORT coordinate; /* X or Y value, in design units */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 111 | public: |
| 112 | DEFINE_SIZE_STATIC (4); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 113 | }; |
| 114 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 115 | struct CaretValueFormat2 |
| 116 | { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 117 | friend struct CaretValue; |
| 118 | |
| 119 | private: |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 120 | inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 121 | { |
Behdad Esfahbod | 6f729b4 | 2010-04-29 03:59:06 -0400 | [diff] [blame] | 122 | hb_position_t x, y; |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 123 | if (hb_font_get_glyph_contour_point_for_origin (font, glyph_id, caretValuePoint, direction, &x, &y)) |
Behdad Esfahbod | 3357d14 | 2010-10-27 12:30:46 -0400 | [diff] [blame] | 124 | return HB_DIRECTION_IS_HORIZONTAL (direction) ? x : y; |
Behdad Esfahbod | 6f729b4 | 2010-04-29 03:59:06 -0400 | [diff] [blame] | 125 | else |
| 126 | return 0; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 127 | } |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 128 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 129 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 130 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 131 | return c->check_struct (this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 132 | } |
| 133 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 134 | private: |
| 135 | USHORT caretValueFormat; /* Format identifier--format = 2 */ |
| 136 | USHORT caretValuePoint; /* Contour point index on glyph */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 137 | public: |
| 138 | DEFINE_SIZE_STATIC (4); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 139 | }; |
| 140 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 141 | struct CaretValueFormat3 |
| 142 | { |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 143 | friend struct CaretValue; |
| 144 | |
Behdad Esfahbod | b9452bf | 2011-06-14 14:47:07 -0400 | [diff] [blame] | 145 | inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id HB_UNUSED) const |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 146 | { |
Behdad Esfahbod | 3357d14 | 2010-10-27 12:30:46 -0400 | [diff] [blame] | 147 | return HB_DIRECTION_IS_HORIZONTAL (direction) ? |
Behdad Esfahbod | b6f902a | 2011-05-11 00:04:15 -0400 | [diff] [blame] | 148 | font->em_scale_x (coordinate) + (this+deviceTable).get_x_delta (font) : |
| 149 | font->em_scale_y (coordinate) + (this+deviceTable).get_y_delta (font); |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 150 | } |
| 151 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 152 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 153 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 154 | return c->check_struct (this) |
| 155 | && deviceTable.sanitize (c, this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 156 | } |
| 157 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 158 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 159 | USHORT caretValueFormat; /* Format identifier--format = 3 */ |
| 160 | SHORT coordinate; /* X or Y value, in design units */ |
Behdad Esfahbod | 263bbef | 2009-05-20 00:00:09 -0400 | [diff] [blame] | 161 | OffsetTo<Device> |
| 162 | deviceTable; /* Offset to Device table for X or Y |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 163 | * value--from beginning of CaretValue |
| 164 | * table */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 165 | public: |
| 166 | DEFINE_SIZE_STATIC (6); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 167 | }; |
| 168 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 169 | struct CaretValue |
| 170 | { |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 171 | inline hb_position_t get_caret_value (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph_id) const |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 172 | { |
Behdad Esfahbod | f8dc67b | 2009-05-17 19:47:54 -0400 | [diff] [blame] | 173 | switch (u.format) { |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 174 | case 1: return u.format1.get_caret_value (font, direction, glyph_id); |
| 175 | case 2: return u.format2.get_caret_value (font, direction, glyph_id); |
| 176 | case 3: return u.format3.get_caret_value (font, direction, glyph_id); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 177 | default:return 0; |
| 178 | } |
| 179 | } |
| 180 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 181 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 182 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 183 | if (!u.format.sanitize (c)) return false; |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 184 | switch (u.format) { |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 185 | case 1: return u.format1.sanitize (c); |
| 186 | case 2: return u.format2.sanitize (c); |
| 187 | case 3: return u.format3.sanitize (c); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 188 | default:return true; |
| 189 | } |
| 190 | } |
| 191 | |
Behdad Esfahbod | 303fe62 | 2008-01-23 00:20:48 -0500 | [diff] [blame] | 192 | private: |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 193 | union { |
Behdad Esfahbod | f8dc67b | 2009-05-17 19:47:54 -0400 | [diff] [blame] | 194 | USHORT format; /* Format identifier */ |
Behdad Esfahbod | dacebca | 2010-05-10 19:45:41 -0400 | [diff] [blame] | 195 | CaretValueFormat1 format1; |
| 196 | CaretValueFormat2 format2; |
| 197 | CaretValueFormat3 format3; |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 198 | } u; |
Behdad Esfahbod | ed07422 | 2010-05-10 18:08:46 -0400 | [diff] [blame] | 199 | public: |
Behdad Esfahbod | 596e471 | 2010-05-10 18:47:48 -0400 | [diff] [blame] | 200 | DEFINE_SIZE_UNION (2, format); |
Behdad Esfahbod | 4c2556c | 2007-07-06 11:29:21 -0400 | [diff] [blame] | 201 | }; |
Behdad Esfahbod | 5b3f770 | 2006-12-28 06:42:37 -0500 | [diff] [blame] | 202 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 203 | struct LigGlyph |
| 204 | { |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 205 | inline unsigned int get_lig_carets (hb_font_t *font, |
Behdad Esfahbod | 3357d14 | 2010-10-27 12:30:46 -0400 | [diff] [blame] | 206 | hb_direction_t direction, |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 207 | hb_codepoint_t glyph_id, |
| 208 | unsigned int start_offset, |
| 209 | unsigned int *caret_count /* IN/OUT */, |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 210 | hb_position_t *caret_array /* OUT */) const |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 211 | { |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 212 | if (caret_count) { |
Behdad Esfahbod | 4f5f1c3 | 2010-04-22 00:27:39 -0400 | [diff] [blame] | 213 | const OffsetTo<CaretValue> *array = carets.sub_array (start_offset, caret_count); |
Behdad Esfahbod | 48de373 | 2009-11-04 16:59:50 -0500 | [diff] [blame] | 214 | unsigned int count = *caret_count; |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 215 | for (unsigned int i = 0; i < count; i++) |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 216 | caret_array[i] = (this+array[i]).get_caret_value (font, direction, glyph_id); |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 217 | } |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 218 | |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 219 | return carets.len; |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 220 | } |
Behdad Esfahbod | 7586089 | 2008-01-23 18:02:28 -0500 | [diff] [blame] | 221 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 222 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 223 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 224 | return carets.sanitize (c, this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 225 | } |
| 226 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 227 | private: |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 228 | OffsetArrayOf<CaretValue> |
Behdad Esfahbod | 3564ee5 | 2009-08-14 18:32:56 -0400 | [diff] [blame] | 229 | carets; /* Offset array of CaretValue tables |
Behdad Esfahbod | e4efdd8 | 2009-05-22 18:54:24 -0400 | [diff] [blame] | 230 | * --from beginning of LigGlyph table |
| 231 | * --in increasing coordinate order */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 232 | public: |
Behdad Esfahbod | 0eb9fc6 | 2010-05-10 19:01:17 -0400 | [diff] [blame] | 233 | DEFINE_SIZE_ARRAY (2, carets); |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 234 | }; |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 235 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 236 | struct LigCaretList |
| 237 | { |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 238 | inline unsigned int get_lig_carets (hb_font_t *font, |
Behdad Esfahbod | 3357d14 | 2010-10-27 12:30:46 -0400 | [diff] [blame] | 239 | hb_direction_t direction, |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 240 | hb_codepoint_t glyph_id, |
| 241 | unsigned int start_offset, |
| 242 | unsigned int *caret_count /* IN/OUT */, |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 243 | hb_position_t *caret_array /* OUT */) const |
Behdad Esfahbod | 855720c | 2009-05-26 12:00:28 -0400 | [diff] [blame] | 244 | { |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 245 | unsigned int index = (this+coverage) (glyph_id); |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 246 | if (index == NOT_COVERED) |
| 247 | { |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 248 | if (caret_count) |
| 249 | *caret_count = 0; |
| 250 | return 0; |
Behdad Esfahbod | 62964af | 2009-05-26 12:40:10 -0400 | [diff] [blame] | 251 | } |
| 252 | const LigGlyph &lig_glyph = this+ligGlyph[index]; |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 253 | return lig_glyph.get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array); |
Behdad Esfahbod | 855720c | 2009-05-26 12:00:28 -0400 | [diff] [blame] | 254 | } |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 255 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 256 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 257 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 258 | return coverage.sanitize (c, this) |
| 259 | && ligGlyph.sanitize (c, this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 260 | } |
| 261 | |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 262 | private: |
Behdad Esfahbod | 3d54bd1 | 2009-05-17 00:15:51 -0400 | [diff] [blame] | 263 | OffsetTo<Coverage> |
| 264 | coverage; /* Offset to Coverage table--from |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 265 | * beginning of LigCaretList table */ |
Behdad Esfahbod | 5f81036 | 2009-05-17 00:54:25 -0400 | [diff] [blame] | 266 | OffsetArrayOf<LigGlyph> |
| 267 | ligGlyph; /* Array of LigGlyph tables |
| 268 | * in Coverage Index order */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 269 | public: |
Behdad Esfahbod | 0eb9fc6 | 2010-05-10 19:01:17 -0400 | [diff] [blame] | 270 | DEFINE_SIZE_ARRAY (4, ligGlyph); |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 271 | }; |
Behdad Esfahbod | 12360f7 | 2008-01-23 15:50:38 -0500 | [diff] [blame] | 272 | |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 273 | |
| 274 | struct MarkGlyphSetsFormat1 |
| 275 | { |
| 276 | inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const |
| 277 | { return (this+coverage[set_index]).get_coverage (glyph_id) != NOT_COVERED; } |
| 278 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 279 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 280 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 281 | return coverage.sanitize (c, this); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 282 | } |
| 283 | |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 284 | private: |
| 285 | USHORT format; /* Format identifier--format = 1 */ |
| 286 | LongOffsetArrayOf<Coverage> |
| 287 | coverage; /* Array of long offsets to mark set |
| 288 | * coverage tables */ |
Behdad Esfahbod | b365123 | 2010-05-10 16:57:29 -0400 | [diff] [blame] | 289 | public: |
Behdad Esfahbod | 0eb9fc6 | 2010-05-10 19:01:17 -0400 | [diff] [blame] | 290 | DEFINE_SIZE_ARRAY (4, coverage); |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 291 | }; |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 292 | |
| 293 | struct MarkGlyphSets |
| 294 | { |
| 295 | inline bool covers (unsigned int set_index, hb_codepoint_t glyph_id) const |
| 296 | { |
| 297 | switch (u.format) { |
Behdad Esfahbod | dacebca | 2010-05-10 19:45:41 -0400 | [diff] [blame] | 298 | case 1: return u.format1.covers (set_index, glyph_id); |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 299 | default:return false; |
| 300 | } |
| 301 | } |
| 302 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 303 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 304 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 305 | if (!u.format.sanitize (c)) return false; |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 306 | switch (u.format) { |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 307 | case 1: return u.format1.sanitize (c); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 308 | default:return true; |
| 309 | } |
| 310 | } |
| 311 | |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 312 | private: |
| 313 | union { |
| 314 | USHORT format; /* Format identifier */ |
Behdad Esfahbod | dacebca | 2010-05-10 19:45:41 -0400 | [diff] [blame] | 315 | MarkGlyphSetsFormat1 format1; |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 316 | } u; |
Behdad Esfahbod | ed07422 | 2010-05-10 18:08:46 -0400 | [diff] [blame] | 317 | public: |
Behdad Esfahbod | 596e471 | 2010-05-10 18:47:48 -0400 | [diff] [blame] | 318 | DEFINE_SIZE_UNION (2, format); |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 319 | }; |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 320 | |
| 321 | |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 322 | /* |
Behdad Esfahbod | aefaafe | 2008-01-23 17:25:29 -0500 | [diff] [blame] | 323 | * GDEF |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 324 | */ |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 325 | |
Behdad Esfahbod | 60d77cf | 2009-05-19 23:58:54 -0400 | [diff] [blame] | 326 | struct GDEF |
| 327 | { |
Behdad Esfahbod | a328d66 | 2009-08-04 20:27:05 -0400 | [diff] [blame] | 328 | static const hb_tag_t Tag = HB_OT_TAG_GDEF; |
Behdad Esfahbod | 600e5eb | 2008-01-23 02:01:37 -0500 | [diff] [blame] | 329 | |
Behdad Esfahbod | 4fa77d3 | 2009-05-18 18:44:54 -0400 | [diff] [blame] | 330 | enum { |
| 331 | UnclassifiedGlyph = 0, |
| 332 | BaseGlyph = 1, |
| 333 | LigatureGlyph = 2, |
| 334 | MarkGlyph = 3, |
Behdad Esfahbod | 8f034d5 | 2009-08-18 16:41:59 -0400 | [diff] [blame] | 335 | ComponentGlyph = 4 |
Behdad Esfahbod | 4fa77d3 | 2009-05-18 18:44:54 -0400 | [diff] [blame] | 336 | }; |
Behdad Esfahbod | aff831e | 2008-01-24 06:03:45 -0500 | [diff] [blame] | 337 | |
Behdad Esfahbod | 7f97d2c | 2010-10-01 18:58:50 -0400 | [diff] [blame] | 338 | inline bool has_glyph_classes (void) const { return glyphClassDef != 0; } |
Behdad Esfahbod | 98370e8 | 2010-10-27 17:39:01 -0400 | [diff] [blame] | 339 | inline unsigned int get_glyph_class (hb_codepoint_t glyph) const |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 340 | { return (this+glyphClassDef).get_class (glyph); } |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 341 | |
Behdad Esfahbod | 7f97d2c | 2010-10-01 18:58:50 -0400 | [diff] [blame] | 342 | inline bool has_mark_attachment_types (void) const { return markAttachClassDef != 0; } |
Behdad Esfahbod | 98370e8 | 2010-10-27 17:39:01 -0400 | [diff] [blame] | 343 | inline unsigned int get_mark_attachment_type (hb_codepoint_t glyph) const |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 344 | { return (this+markAttachClassDef).get_class (glyph); } |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 345 | |
Behdad Esfahbod | 7f97d2c | 2010-10-01 18:58:50 -0400 | [diff] [blame] | 346 | inline bool has_attach_points (void) const { return attachList != 0; } |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 347 | inline unsigned int get_attach_points (hb_codepoint_t glyph_id, |
| 348 | unsigned int start_offset, |
| 349 | unsigned int *point_count /* IN/OUT */, |
| 350 | unsigned int *point_array /* OUT */) const |
| 351 | { return (this+attachList).get_attach_points (glyph_id, start_offset, point_count, point_array); } |
Behdad Esfahbod | 79420ad | 2009-05-26 12:24:16 -0400 | [diff] [blame] | 352 | |
Behdad Esfahbod | 7f97d2c | 2010-10-01 18:58:50 -0400 | [diff] [blame] | 353 | inline bool has_lig_carets (void) const { return ligCaretList != 0; } |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 354 | inline unsigned int get_lig_carets (hb_font_t *font, |
Behdad Esfahbod | 3357d14 | 2010-10-27 12:30:46 -0400 | [diff] [blame] | 355 | hb_direction_t direction, |
Behdad Esfahbod | e21899b | 2009-11-04 16:36:14 -0500 | [diff] [blame] | 356 | hb_codepoint_t glyph_id, |
| 357 | unsigned int start_offset, |
| 358 | unsigned int *caret_count /* IN/OUT */, |
Behdad Esfahbod | 60fbb36 | 2011-05-19 18:46:15 -0400 | [diff] [blame] | 359 | hb_position_t *caret_array /* OUT */) const |
Behdad Esfahbod | abcfe9b | 2011-05-11 00:02:02 -0400 | [diff] [blame] | 360 | { return (this+ligCaretList).get_lig_carets (font, direction, glyph_id, start_offset, caret_count, caret_array); } |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 361 | |
Behdad Esfahbod | 4f28fbd | 2011-05-31 12:33:11 -0400 | [diff] [blame] | 362 | inline bool has_mark_sets (void) const { return version.to_int () >= 0x00010002 && markGlyphSetsDef[0] != 0; } |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 363 | inline bool mark_set_covers (unsigned int set_index, hb_codepoint_t glyph_id) const |
Behdad Esfahbod | 4f28fbd | 2011-05-31 12:33:11 -0400 | [diff] [blame] | 364 | { return version.to_int () >= 0x00010002 && (this+markGlyphSetsDef[0]).covers (set_index, glyph_id); } |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 365 | |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 366 | inline bool sanitize (hb_sanitize_context_t *c) { |
Behdad Esfahbod | 3e2401f | 2009-08-28 17:17:11 -0400 | [diff] [blame] | 367 | TRACE_SANITIZE (); |
Behdad Esfahbod | d7cfb3b | 2010-05-13 14:18:49 -0400 | [diff] [blame] | 368 | return version.sanitize (c) && likely (version.major == 1) |
| 369 | && glyphClassDef.sanitize (c, this) |
| 370 | && attachList.sanitize (c, this) |
| 371 | && ligCaretList.sanitize (c, this) |
| 372 | && markAttachClassDef.sanitize (c, this) |
Behdad Esfahbod | 4f28fbd | 2011-05-31 12:33:11 -0400 | [diff] [blame] | 373 | && (version.to_int () < 0x00010002 || markGlyphSetsDef[0].sanitize (c, this)); |
Behdad Esfahbod | e49a84c | 2009-08-04 14:33:23 -0400 | [diff] [blame] | 374 | } |
| 375 | |
Behdad Esfahbod | bf94b3a | 2010-10-27 22:37:59 -0400 | [diff] [blame] | 376 | |
| 377 | /* glyph_props is a 16-bit integer where the lower 8-bit have bits representing |
| 378 | * glyph class and other bits, and high 8-bit gthe mark attachment type (if any). |
| 379 | * Not to be confused with lookup_props which is very similar. */ |
| 380 | inline unsigned int get_glyph_props (hb_codepoint_t glyph) const |
| 381 | { |
| 382 | unsigned int klass = get_glyph_class (glyph); |
| 383 | |
| 384 | switch (klass) { |
| 385 | default: |
| 386 | case UnclassifiedGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_UNCLASSIFIED; |
| 387 | case BaseGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_BASE_GLYPH; |
| 388 | case LigatureGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_LIGATURE; |
| 389 | case ComponentGlyph: return HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT; |
| 390 | case MarkGlyph: |
| 391 | klass = get_mark_attachment_type (glyph); |
| 392 | return HB_OT_LAYOUT_GLYPH_CLASS_MARK | (klass << 8); |
| 393 | } |
| 394 | } |
| 395 | |
| 396 | |
Behdad Esfahbod | 238c855 | 2009-05-17 00:22:37 -0400 | [diff] [blame] | 397 | private: |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 398 | FixedVersion version; /* Version of the GDEF table--currently |
| 399 | * 0x00010002 */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 400 | OffsetTo<ClassDef> |
| 401 | glyphClassDef; /* Offset to class definition table |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 402 | * for glyph type--from beginning of |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 403 | * GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 404 | OffsetTo<AttachList> |
| 405 | attachList; /* Offset to list of glyphs with |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 406 | * attachment points--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 407 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 408 | OffsetTo<LigCaretList> |
| 409 | ligCaretList; /* Offset to list of positioning points |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 410 | * for ligature carets--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 411 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | 9e4d9d7 | 2009-05-17 00:09:20 -0400 | [diff] [blame] | 412 | OffsetTo<ClassDef> |
| 413 | markAttachClassDef; /* Offset to class definition table for |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 414 | * mark attachment type--from beginning |
Behdad Esfahbod | 1f437e6 | 2008-01-23 04:36:40 -0500 | [diff] [blame] | 415 | * of GDEF header (may be Null) */ |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 416 | OffsetTo<MarkGlyphSets> |
Behdad Esfahbod | d3480ba | 2009-11-03 10:47:29 -0500 | [diff] [blame] | 417 | markGlyphSetsDef[VAR]; /* Offset to the table of mark set |
Behdad Esfahbod | e4b92b8 | 2009-05-26 15:38:53 -0400 | [diff] [blame] | 418 | * definitions--from beginning of GDEF |
| 419 | * header (may be NULL). Introduced |
| 420 | * in version 00010002. */ |
Behdad Esfahbod | 569da92 | 2010-05-10 16:38:32 -0400 | [diff] [blame] | 421 | public: |
Behdad Esfahbod | 0eb9fc6 | 2010-05-10 19:01:17 -0400 | [diff] [blame] | 422 | DEFINE_SIZE_ARRAY (12, markGlyphSetsDef); |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 423 | }; |
Behdad Esfahbod | b9d7688 | 2008-01-23 01:38:10 -0500 | [diff] [blame] | 424 | |
Behdad Esfahbod | 6f20f72 | 2009-05-17 20:28:01 -0400 | [diff] [blame] | 425 | |
Behdad Esfahbod | acdba3f | 2010-07-23 15:11:18 -0400 | [diff] [blame] | 426 | |
Behdad Esfahbod | 7a750ac | 2011-08-17 14:19:59 +0200 | [diff] [blame^] | 427 | #endif /* HB_OT_LAYOUT_GDEF_TABLE_HH */ |