|
1 /* |
|
2 * Copyright © 2017 Google, Inc. |
|
3 * Copyright © 2018 Ebrahim Byagowi |
|
4 * |
|
5 * This is part of HarfBuzz, a text shaping library. |
|
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 * Google Author(s): Behdad Esfahbod |
|
26 */ |
|
27 |
|
28 #include "hb-open-type.hh" |
|
29 |
|
30 #include "hb-ot-face.hh" |
|
31 #include "hb-aat-layout.hh" |
|
32 #include "hb-aat-fdsc-table.hh" // Just so we compile it; unused otherwise. |
|
33 #include "hb-aat-layout-ankr-table.hh" |
|
34 #include "hb-aat-layout-bsln-table.hh" // Just so we compile it; unused otherwise. |
|
35 #include "hb-aat-layout-feat-table.hh" |
|
36 #include "hb-aat-layout-just-table.hh" // Just so we compile it; unused otherwise. |
|
37 #include "hb-aat-layout-kerx-table.hh" |
|
38 #include "hb-aat-layout-morx-table.hh" |
|
39 #include "hb-aat-layout-trak-table.hh" |
|
40 #include "hb-aat-ltag-table.hh" |
|
41 |
|
42 |
|
43 /** |
|
44 * SECTION:hb-aat-layout |
|
45 * @title: hb-aat-layout |
|
46 * @short_description: Apple Advanced Typography Layout |
|
47 * @include: hb-aat.h |
|
48 * |
|
49 * Functions for querying OpenType Layout features in the font face. |
|
50 **/ |
|
51 |
|
52 |
|
53 /* Table data courtesy of Apple. Converted from mnemonics to integers |
|
54 * when moving to this file. */ |
|
55 static const hb_aat_feature_mapping_t feature_mappings[] = |
|
56 { |
|
57 {HB_TAG ('a','f','r','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_VERTICAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS}, |
|
58 {HB_TAG ('c','2','p','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE}, |
|
59 {HB_TAG ('c','2','s','c'), HB_AAT_LAYOUT_FEATURE_TYPE_UPPER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_UPPER_CASE}, |
|
60 {HB_TAG ('c','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_ALTERNATES_OFF}, |
|
61 {HB_TAG ('c','a','s','e'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_LAYOUT_OFF}, |
|
62 {HB_TAG ('c','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_LIGATURES_OFF}, |
|
63 {HB_TAG ('c','p','s','p'), HB_AAT_LAYOUT_FEATURE_TYPE_CASE_SENSITIVE_LAYOUT, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CASE_SENSITIVE_SPACING_OFF}, |
|
64 {HB_TAG ('c','s','w','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CONTEXTUAL_SWASH_ALTERNATES_OFF}, |
|
65 {HB_TAG ('d','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RARE_LIGATURES_OFF}, |
|
66 {HB_TAG ('e','x','p','t'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_EXPERT_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
67 {HB_TAG ('f','r','a','c'), HB_AAT_LAYOUT_FEATURE_TYPE_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DIAGONAL_FRACTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_FRACTIONS}, |
|
68 {HB_TAG ('f','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
69 {HB_TAG ('h','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
70 {HB_TAG ('h','i','s','t'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF}, |
|
71 {HB_TAG ('h','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_HORIZ_KANA_OFF}, |
|
72 {HB_TAG ('h','l','i','g'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_HISTORICAL_LIGATURES_OFF}, |
|
73 {HB_TAG ('h','n','g','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TRANSLITERATION, HB_AAT_LAYOUT_FEATURE_SELECTOR_HANJA_TO_HANGUL, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_TRANSLITERATION}, |
|
74 {HB_TAG ('h','o','j','o'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_HOJO_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
75 {HB_TAG ('h','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
76 {HB_TAG ('i','t','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_ITALIC_CJK_ROMAN, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_CJK_ITALIC_ROMAN_OFF}, |
|
77 {HB_TAG ('j','p','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS2004_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
78 {HB_TAG ('j','p','7','8'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1978_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
79 {HB_TAG ('j','p','8','3'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1983_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
80 {HB_TAG ('j','p','9','0'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_JIS1990_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
81 {HB_TAG ('l','i','g','a'), HB_AAT_LAYOUT_FEATURE_TYPE_LIGATURES, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_COMMON_LIGATURES_OFF}, |
|
82 {HB_TAG ('l','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_UPPER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2}, |
|
83 {HB_TAG ('m','g','r','k'), HB_AAT_LAYOUT_FEATURE_TYPE_MATHEMATICAL_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_MATHEMATICAL_GREEK_OFF}, |
|
84 {HB_TAG ('n','l','c','k'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_NLCCHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
85 {HB_TAG ('o','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_NUMBERS, (hb_aat_layout_feature_selector_t) 2}, |
|
86 {HB_TAG ('o','r','d','n'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_ORDINALS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, |
|
87 {HB_TAG ('p','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
88 {HB_TAG ('p','c','a','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_PETITE_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE}, |
|
89 {HB_TAG ('p','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
90 {HB_TAG ('p','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_NUMBERS, (hb_aat_layout_feature_selector_t) 4}, |
|
91 {HB_TAG ('p','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
92 {HB_TAG ('q','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_QUARTER_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
93 {HB_TAG ('r','u','b','y'), HB_AAT_LAYOUT_FEATURE_TYPE_RUBY_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_RUBY_KANA_OFF}, |
|
94 {HB_TAG ('s','i','n','f'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SCIENTIFIC_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, |
|
95 {HB_TAG ('s','m','c','p'), HB_AAT_LAYOUT_FEATURE_TYPE_LOWER_CASE, HB_AAT_LAYOUT_FEATURE_SELECTOR_LOWER_CASE_SMALL_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_DEFAULT_LOWER_CASE}, |
|
96 {HB_TAG ('s','m','p','l'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_SIMPLIFIED_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
97 {HB_TAG ('s','s','0','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ONE_OFF}, |
|
98 {HB_TAG ('s','s','0','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWO_OFF}, |
|
99 {HB_TAG ('s','s','0','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THREE_OFF}, |
|
100 {HB_TAG ('s','s','0','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOUR_OFF}, |
|
101 {HB_TAG ('s','s','0','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIVE_OFF}, |
|
102 {HB_TAG ('s','s','0','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIX_OFF}, |
|
103 {HB_TAG ('s','s','0','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVEN_OFF}, |
|
104 {HB_TAG ('s','s','0','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHT_OFF}, |
|
105 {HB_TAG ('s','s','0','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINE_OFF}, |
|
106 {HB_TAG ('s','s','1','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TEN_OFF}, |
|
107 {HB_TAG ('s','s','1','1'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_ELEVEN_OFF}, |
|
108 {HB_TAG ('s','s','1','2'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWELVE_OFF}, |
|
109 {HB_TAG ('s','s','1','3'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_THIRTEEN_OFF}, |
|
110 {HB_TAG ('s','s','1','4'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FOURTEEN_OFF}, |
|
111 {HB_TAG ('s','s','1','5'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_FIFTEEN_OFF}, |
|
112 {HB_TAG ('s','s','1','6'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SIXTEEN_OFF}, |
|
113 {HB_TAG ('s','s','1','7'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_SEVENTEEN_OFF}, |
|
114 {HB_TAG ('s','s','1','8'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_EIGHTEEN_OFF}, |
|
115 {HB_TAG ('s','s','1','9'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_NINETEEN_OFF}, |
|
116 {HB_TAG ('s','s','2','0'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLISTIC_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_STYLISTIC_ALT_TWENTY_OFF}, |
|
117 {HB_TAG ('s','u','b','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_INFERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, |
|
118 {HB_TAG ('s','u','p','s'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_POSITION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUPERIORS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NORMAL_POSITION}, |
|
119 {HB_TAG ('s','w','s','h'), HB_AAT_LAYOUT_FEATURE_TYPE_CONTEXTUAL_ALTERNATIVES, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SWASH_ALTERNATES_OFF}, |
|
120 {HB_TAG ('t','i','t','l'), HB_AAT_LAYOUT_FEATURE_TYPE_STYLE_OPTIONS, HB_AAT_LAYOUT_FEATURE_SELECTOR_TITLING_CAPS, HB_AAT_LAYOUT_FEATURE_SELECTOR_NO_STYLE_OPTIONS}, |
|
121 {HB_TAG ('t','n','a','m'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_NAMES_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
122 {HB_TAG ('t','n','u','m'), HB_AAT_LAYOUT_FEATURE_TYPE_NUMBER_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_MONOSPACED_NUMBERS, (hb_aat_layout_feature_selector_t) 4}, |
|
123 {HB_TAG ('t','r','a','d'), HB_AAT_LAYOUT_FEATURE_TYPE_CHARACTER_SHAPE, HB_AAT_LAYOUT_FEATURE_SELECTOR_TRADITIONAL_CHARACTERS, (hb_aat_layout_feature_selector_t) 16}, |
|
124 {HB_TAG ('t','w','i','d'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_THIRD_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
125 {HB_TAG ('u','n','i','c'), HB_AAT_LAYOUT_FEATURE_TYPE_LETTER_CASE, (hb_aat_layout_feature_selector_t) 14, (hb_aat_layout_feature_selector_t) 15}, |
|
126 {HB_TAG ('v','a','l','t'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
127 {HB_TAG ('v','e','r','t'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF}, |
|
128 {HB_TAG ('v','h','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_HALF_WIDTH_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
129 {HB_TAG ('v','k','n','a'), HB_AAT_LAYOUT_FEATURE_TYPE_ALTERNATE_KANA, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALTERNATE_VERT_KANA_OFF}, |
|
130 {HB_TAG ('v','p','a','l'), HB_AAT_LAYOUT_FEATURE_TYPE_TEXT_SPACING, HB_AAT_LAYOUT_FEATURE_SELECTOR_ALT_PROPORTIONAL_TEXT, (hb_aat_layout_feature_selector_t) 7}, |
|
131 {HB_TAG ('v','r','t','2'), HB_AAT_LAYOUT_FEATURE_TYPE_VERTICAL_SUBSTITUTION, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SUBSTITUTE_VERTICAL_FORMS_OFF}, |
|
132 {HB_TAG ('z','e','r','o'), HB_AAT_LAYOUT_FEATURE_TYPE_TYPOGRAPHIC_EXTRAS, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_ON, HB_AAT_LAYOUT_FEATURE_SELECTOR_SLASHED_ZERO_OFF}, |
|
133 }; |
|
134 |
|
135 const hb_aat_feature_mapping_t * |
|
136 hb_aat_layout_find_feature_mapping (hb_tag_t tag) |
|
137 { |
|
138 return (const hb_aat_feature_mapping_t *) bsearch (&tag, |
|
139 feature_mappings, |
|
140 ARRAY_LENGTH (feature_mappings), |
|
141 sizeof (feature_mappings[0]), |
|
142 hb_aat_feature_mapping_t::cmp); |
|
143 } |
|
144 |
|
145 |
|
146 /* |
|
147 * hb_aat_apply_context_t |
|
148 */ |
|
149 |
|
150 AAT::hb_aat_apply_context_t::hb_aat_apply_context_t (const hb_ot_shape_plan_t *plan_, |
|
151 hb_font_t *font_, |
|
152 hb_buffer_t *buffer_, |
|
153 hb_blob_t *blob) : |
|
154 plan (plan_), |
|
155 font (font_), |
|
156 face (font->face), |
|
157 buffer (buffer_), |
|
158 sanitizer (), |
|
159 ankr_table (&Null(AAT::ankr)), |
|
160 lookup_index (0), |
|
161 debug_depth (0) |
|
162 { |
|
163 sanitizer.init (blob); |
|
164 sanitizer.set_num_glyphs (face->get_num_glyphs ()); |
|
165 sanitizer.start_processing (); |
|
166 sanitizer.set_max_ops (HB_SANITIZE_MAX_OPS_MAX); |
|
167 } |
|
168 |
|
169 AAT::hb_aat_apply_context_t::~hb_aat_apply_context_t () |
|
170 { sanitizer.end_processing (); } |
|
171 |
|
172 void |
|
173 AAT::hb_aat_apply_context_t::set_ankr_table (const AAT::ankr *ankr_table_) |
|
174 { ankr_table = ankr_table_; } |
|
175 |
|
176 |
|
177 /* |
|
178 * mort/morx/kerx/trak |
|
179 */ |
|
180 |
|
181 |
|
182 void |
|
183 hb_aat_layout_compile_map (const hb_aat_map_builder_t *mapper, |
|
184 hb_aat_map_t *map) |
|
185 { |
|
186 const AAT::morx& morx = *mapper->face->table.morx; |
|
187 if (morx.has_data ()) |
|
188 { |
|
189 morx.compile_flags (mapper, map); |
|
190 return; |
|
191 } |
|
192 |
|
193 const AAT::mort& mort = *mapper->face->table.mort; |
|
194 if (mort.has_data ()) |
|
195 { |
|
196 mort.compile_flags (mapper, map); |
|
197 return; |
|
198 } |
|
199 } |
|
200 |
|
201 |
|
202 /* |
|
203 * hb_aat_layout_has_substitution: |
|
204 * @face: |
|
205 * |
|
206 * Returns: |
|
207 * Since: 2.3.0 |
|
208 */ |
|
209 hb_bool_t |
|
210 hb_aat_layout_has_substitution (hb_face_t *face) |
|
211 { |
|
212 return face->table.morx->has_data () || |
|
213 face->table.mort->has_data (); |
|
214 } |
|
215 |
|
216 void |
|
217 hb_aat_layout_substitute (const hb_ot_shape_plan_t *plan, |
|
218 hb_font_t *font, |
|
219 hb_buffer_t *buffer) |
|
220 { |
|
221 hb_blob_t *morx_blob = font->face->table.morx.get_blob (); |
|
222 const AAT::morx& morx = *morx_blob->as<AAT::morx> (); |
|
223 if (morx.has_data ()) |
|
224 { |
|
225 AAT::hb_aat_apply_context_t c (plan, font, buffer, morx_blob); |
|
226 morx.apply (&c); |
|
227 return; |
|
228 } |
|
229 |
|
230 hb_blob_t *mort_blob = font->face->table.mort.get_blob (); |
|
231 const AAT::mort& mort = *mort_blob->as<AAT::mort> (); |
|
232 if (mort.has_data ()) |
|
233 { |
|
234 AAT::hb_aat_apply_context_t c (plan, font, buffer, mort_blob); |
|
235 mort.apply (&c); |
|
236 return; |
|
237 } |
|
238 } |
|
239 |
|
240 void |
|
241 hb_aat_layout_zero_width_deleted_glyphs (hb_buffer_t *buffer) |
|
242 { |
|
243 unsigned int count = buffer->len; |
|
244 hb_glyph_info_t *info = buffer->info; |
|
245 hb_glyph_position_t *pos = buffer->pos; |
|
246 for (unsigned int i = 0; i < count; i++) |
|
247 if (unlikely (info[i].codepoint == AAT::DELETED_GLYPH)) |
|
248 pos[i].x_advance = pos[i].y_advance = pos[i].x_offset = pos[i].y_offset = 0; |
|
249 } |
|
250 |
|
251 static bool |
|
252 is_deleted_glyph (const hb_glyph_info_t *info) |
|
253 { |
|
254 return info->codepoint == AAT::DELETED_GLYPH; |
|
255 } |
|
256 |
|
257 void |
|
258 hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) |
|
259 { |
|
260 hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); |
|
261 } |
|
262 |
|
263 /* |
|
264 * hb_aat_layout_has_positioning: |
|
265 * @face: |
|
266 * |
|
267 * Returns: |
|
268 * Since: 2.3.0 |
|
269 */ |
|
270 hb_bool_t |
|
271 hb_aat_layout_has_positioning (hb_face_t *face) |
|
272 { |
|
273 return face->table.kerx->has_data (); |
|
274 } |
|
275 |
|
276 void |
|
277 hb_aat_layout_position (const hb_ot_shape_plan_t *plan, |
|
278 hb_font_t *font, |
|
279 hb_buffer_t *buffer) |
|
280 { |
|
281 hb_blob_t *kerx_blob = font->face->table.kerx.get_blob (); |
|
282 const AAT::kerx& kerx = *kerx_blob->as<AAT::kerx> (); |
|
283 |
|
284 AAT::hb_aat_apply_context_t c (plan, font, buffer, kerx_blob); |
|
285 c.set_ankr_table (font->face->table.ankr.get ()); |
|
286 kerx.apply (&c); |
|
287 } |
|
288 |
|
289 |
|
290 /* |
|
291 * hb_aat_layout_has_tracking: |
|
292 * @face: |
|
293 * |
|
294 * Returns: |
|
295 * Since: 2.3.0 |
|
296 */ |
|
297 hb_bool_t |
|
298 hb_aat_layout_has_tracking (hb_face_t *face) |
|
299 { |
|
300 return face->table.trak->has_data (); |
|
301 } |
|
302 |
|
303 void |
|
304 hb_aat_layout_track (const hb_ot_shape_plan_t *plan, |
|
305 hb_font_t *font, |
|
306 hb_buffer_t *buffer) |
|
307 { |
|
308 const AAT::trak& trak = *font->face->table.trak; |
|
309 |
|
310 AAT::hb_aat_apply_context_t c (plan, font, buffer); |
|
311 trak.apply (&c); |
|
312 } |
|
313 |
|
314 |
|
315 hb_language_t |
|
316 _hb_aat_language_get (hb_face_t *face, |
|
317 unsigned int i) |
|
318 { |
|
319 return face->table.ltag->get_language (i); |
|
320 } |
|
321 |
|
322 /** |
|
323 * hb_aat_layout_get_feature_types: |
|
324 * @face: a face object |
|
325 * @start_offset: iteration's start offset |
|
326 * @feature_count:(inout) (allow-none): buffer size as input, filled size as output |
|
327 * @features: (out caller-allocates) (array length=feature_count): features buffer |
|
328 * |
|
329 * Return value: Number of all available feature types. |
|
330 * |
|
331 * Since: 2.2.0 |
|
332 */ |
|
333 unsigned int |
|
334 hb_aat_layout_get_feature_types (hb_face_t *face, |
|
335 unsigned int start_offset, |
|
336 unsigned int *feature_count, /* IN/OUT. May be NULL. */ |
|
337 hb_aat_layout_feature_type_t *features /* OUT. May be NULL. */) |
|
338 { |
|
339 return face->table.feat->get_feature_types (start_offset, feature_count, features); |
|
340 } |
|
341 |
|
342 /** |
|
343 * hb_aat_layout_feature_type_get_name_id: |
|
344 * @face: a face object |
|
345 * @feature_type: feature id |
|
346 * |
|
347 * Return value: Name ID index |
|
348 * |
|
349 * Since: 2.2.0 |
|
350 */ |
|
351 hb_ot_name_id_t |
|
352 hb_aat_layout_feature_type_get_name_id (hb_face_t *face, |
|
353 hb_aat_layout_feature_type_t feature_type) |
|
354 { |
|
355 return face->table.feat->get_feature_name_id (feature_type); |
|
356 } |
|
357 |
|
358 /** |
|
359 * hb_aat_layout_feature_type_get_selectors: |
|
360 * @face: a face object |
|
361 * @feature_type: feature id |
|
362 * @start_offset: iteration's start offset |
|
363 * @selector_count: (inout) (allow-none): buffer size as input, filled size as output |
|
364 * @selectors: (out caller-allocates) (array length=selector_count): settings buffer |
|
365 * @default_index: (out) (allow-none): index of default selector if any |
|
366 * |
|
367 * If upon return, @default_index is set to #HB_AAT_LAYOUT_NO_SELECTOR_INDEX, then |
|
368 * the feature type is non-exclusive. Otherwise, @default_index is the index of |
|
369 * the selector that is selected by default. |
|
370 * |
|
371 * Return value: Number of all available feature selectors. |
|
372 * |
|
373 * Since: 2.2.0 |
|
374 */ |
|
375 unsigned int |
|
376 hb_aat_layout_feature_type_get_selector_infos (hb_face_t *face, |
|
377 hb_aat_layout_feature_type_t feature_type, |
|
378 unsigned int start_offset, |
|
379 unsigned int *selector_count, /* IN/OUT. May be NULL. */ |
|
380 hb_aat_layout_feature_selector_info_t *selectors, /* OUT. May be NULL. */ |
|
381 unsigned int *default_index /* OUT. May be NULL. */) |
|
382 { |
|
383 return face->table.feat->get_selector_infos (feature_type, start_offset, selector_count, selectors, default_index); |
|
384 } |