1/*
2 *
3 * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
4 *
5 */
6
7#ifndef __MORPHTABLES_H
8#define __MORPHTABLES_H
9
10/**
11 * \file
12 * \internal
13 */
14
15#include "LETypes.h"
16#include "LayoutTables.h"
17#include "LETableReference.h"
18
19U_NAMESPACE_BEGIN
20
21class LEGlyphStorage;
22
23typedef le_uint32 FeatureFlags;
24
25typedef le_int16 FeatureType;
26typedef le_int16 FeatureSetting;
27
28struct FeatureTableEntry
29{
30    FeatureType     featureType;
31    FeatureSetting  featureSetting;
32    FeatureFlags    enableFlags;
33    FeatureFlags    disableFlags;
34};
35
36struct ChainHeader
37{
38    FeatureFlags        defaultFlags;
39    le_uint32           chainLength;
40    le_int16           nFeatureEntries;
41    le_int16           nSubtables;
42    FeatureTableEntry   featureTable[ANY_NUMBER];
43};
44LE_VAR_ARRAY(ChainHeader, featureTable)
45
46struct MorphTableHeader
47{
48    le_int32    version;
49    le_uint32   nChains;
50    ChainHeader chains[ANY_NUMBER];
51
52  void process(const LETableReference& base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const;
53};
54LE_VAR_ARRAY(MorphTableHeader, chains)
55
56typedef le_int16 SubtableCoverage;
57typedef le_uint32 SubtableCoverage2;
58
59enum SubtableCoverageFlags
60{
61    scfVertical = 0x8000,
62    scfReverse  = 0x4000,
63    scfIgnoreVt = 0x2000,
64    scfReserved = 0x1FF8,
65    scfTypeMask = 0x0007
66};
67
68enum MorphSubtableType
69{
70    mstIndicRearrangement               = 0,
71    mstContextualGlyphSubstitution      = 1,
72    mstLigatureSubstitution             = 2,
73    mstReservedUnused                   = 3,
74    mstNonContextualGlyphSubstitution   = 4,
75    mstContextualGlyphInsertion         = 5
76};
77
78struct MorphSubtableHeader
79{
80    le_int16           length;
81    SubtableCoverage    coverage;
82    FeatureFlags        subtableFeatures;
83
84  void process(const LEReferenceTo<MorphSubtableHeader> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const;
85};
86
87enum SubtableCoverageFlags2
88{
89    scfVertical2 = 0x80000000,
90    scfReverse2  = 0x40000000,
91    scfIgnoreVt2 = 0x20000000,
92    scfReserved2 = 0x1FFFFF00,
93    scfTypeMask2 = 0x000000FF
94};
95
96struct MorphSubtableHeader2
97{
98    le_uint32           length;
99    SubtableCoverage2    coverage;
100    FeatureFlags        subtableFeatures;
101
102    void process(const LEReferenceTo<MorphSubtableHeader2> &base, LEGlyphStorage &glyphStorage, LEErrorCode &success) const;
103};
104
105struct ChainHeader2
106{
107    FeatureFlags        defaultFlags;
108    le_uint32           chainLength;
109    le_uint32           nFeatureEntries;
110    le_uint32           nSubtables;
111    FeatureTableEntry   featureTable[ANY_NUMBER];
112};
113LE_VAR_ARRAY(ChainHeader2, featureTable)
114
115struct MorphTableHeader2
116{
117    le_int32    version;
118    le_uint32   nChains;
119    ChainHeader2 chains[ANY_NUMBER];
120
121    void process(const LEReferenceTo<MorphTableHeader2> &base, LEGlyphStorage &glyphStorage, le_int32 typoFlags, LEErrorCode &success) const;
122};
123LE_VAR_ARRAY(MorphTableHeader2, chains)
124
125/*
126 * AAT Font Features
127 * source: https://developer.apple.com/fonts/registry/
128 * (plus addition from ATS/SFNTLayoutTypes.h)
129 */
130
131enum {
132
133   allTypographicFeaturesType = 0,
134
135      allTypeFeaturesOnSelector            = 0,
136      allTypeFeaturesOffSelector           = 1,
137
138   ligaturesType = 1,
139
140      requiredLigaturesOnSelector          = 0,
141      requiredLigaturesOffSelector         = 1,
142      commonLigaturesOnSelector            = 2,
143      commonLigaturesOffSelector           = 3,
144      rareLigaturesOnSelector              = 4,
145      rareLigaturesOffSelector             = 5,
146      logosOnSelector                      = 6,
147      logosOffSelector                     = 7,
148      rebusPicturesOnSelector              = 8,
149      rebusPicturesOffSelector             = 9,
150      diphthongLigaturesOnSelector         = 10,
151      diphthongLigaturesOffSelector        = 11,
152      squaredLigaturesOnSelector           = 12,
153      squaredLigaturesOffSelector          = 13,
154      abbrevSquaredLigaturesOnSelector     = 14,
155      abbrevSquaredLigaturesOffSelector    = 15,
156      symbolLigaturesOnSelector            = 16,
157      symbolLigaturesOffSelector           = 17,
158      contextualLigaturesOnSelector        = 18,
159      contextualLigaturesOffSelector       = 19,
160      historicalLigaturesOnSelector        = 20,
161      historicalLigaturesOffSelector       = 21,
162
163   cursiveConnectionType = 2,
164
165      unconnectedSelector                  = 0,
166      partiallyConnectedSelector           = 1,
167      cursiveSelector                      = 2,
168
169   letterCaseType = 3,
170
171      upperAndLowerCaseSelector            = 0,
172      allCapsSelector                      = 1,
173      allLowerCaseSelector                 = 2,
174      smallCapsSelector                    = 3,
175      initialCapsSelector                  = 4,
176      initialCapsAndSmallCapsSelector      = 5,
177
178   verticalSubstitutionType = 4,
179
180      substituteVerticalFormsOnSelector    = 0,
181      substituteVerticalFormsOffSelector   = 1,
182
183   linguisticRearrangementType = 5,
184
185      linguisticRearrangementOnSelector    = 0,
186      linguisticRearrangementOffSelector   = 1,
187
188   numberSpacingType = 6,
189
190      monospacedNumbersSelector            = 0,
191      proportionalNumbersSelector          = 1,
192
193   /*
194   appleReserved1Type = 7,
195   */
196
197   smartSwashType = 8,
198
199      wordInitialSwashesOnSelector         = 0,
200      wordInitialSwashesOffSelector        = 1,
201      wordFinalSwashesOnSelector           = 2,
202      wordFinalSwashesOffSelector          = 3,
203      lineInitialSwashesOnSelector         = 4,
204      lineInitialSwashesOffSelector        = 5,
205      lineFinalSwashesOnSelector           = 6,
206      lineFinalSwashesOffSelector          = 7,
207      nonFinalSwashesOnSelector            = 8,
208      nonFinalSwashesOffSelector           = 9,
209
210   diacriticsType = 9,
211
212      showDiacriticsSelector               = 0,
213      hideDiacriticsSelector               = 1,
214      decomposeDiacriticsSelector          = 2,
215
216   verticalPositionType = 10,
217
218      normalPositionSelector               = 0,
219      superiorsSelector                    = 1,
220      inferiorsSelector                    = 2,
221      ordinalsSelector                     = 3,
222
223   fractionsType = 11,
224
225      noFractionsSelector                  = 0,
226      verticalFractionsSelector            = 1,
227      diagonalFractionsSelector            = 2,
228
229   /*
230   appleReserved2Type = 12,
231   */
232
233   overlappingCharactersType = 13,
234
235      preventOverlapOnSelector             = 0,
236      preventOverlapOffSelector            = 1,
237
238   typographicExtrasType = 14,
239
240      hyphensToEmDashOnSelector            = 0,
241      hyphensToEmDashOffSelector           = 1,
242      hyphenToEnDashOnSelector             = 2,
243      hyphenToEnDashOffSelector            = 3,
244      unslashedZeroOnSelector              = 4,
245      slashedZeroOffSelector               = 4,
246      unslashedZeroOffSelector             = 5,
247      slashedZeroOnSelector                = 5,
248      formInterrobangOnSelector            = 6,
249      formInterrobangOffSelector           = 7,
250      smartQuotesOnSelector                = 8,
251      smartQuotesOffSelector               = 9,
252      periodsToEllipsisOnSelector          = 10,
253      periodsToEllipsisOffSelector         = 11,
254
255   mathematicalExtrasType = 15,
256
257      hyphenToMinusOnSelector              = 0,
258      hyphenToMinusOffSelector             = 1,
259      asteriskToMultiplyOnSelector         = 2,
260      asteriskToMultiplyOffSelector        = 3,
261      slashToDivideOnSelector              = 4,
262      slashToDivideOffSelector             = 5,
263      inequalityLigaturesOnSelector        = 6,
264      inequalityLigaturesOffSelector       = 7,
265      exponentsOnSelector                  = 8,
266      exponentsOffSelector                 = 9,
267
268   ornamentSetsType = 16,
269
270      noOrnamentsSelector                  = 0,
271      dingbatsSelector                     = 1,
272      piCharactersSelector                 = 2,
273      fleuronsSelector                     = 3,
274      decorativeBordersSelector            = 4,
275      internationalSymbolsSelector         = 5,
276      mathSymbolsSelector                  = 6,
277
278   characterAlternativesType = 17,
279
280      noAlternatesSelector                 = 0,
281
282   designComplexityType = 18,
283
284      designLevel1Selector                 = 0,
285      designLevel2Selector                 = 1,
286      designLevel3Selector                 = 2,
287      designLevel4Selector                 = 3,
288      designLevel5Selector                 = 4,
289      designLevel6Selector                 = 5,
290      designLevel7Selector                 = 6,
291
292   styleOptionsType = 19,
293
294      noStyleOptionsSelector               = 0,
295      displayTextSelector                  = 1,
296      engravedTextSelector                 = 2,
297      illuminatedCapsSelector              = 3,
298      titlingCapsSelector                  = 4,
299      tallCapsSelector                     = 5,
300
301   characterShapeType = 20,
302
303      traditionalCharactersSelector        = 0,
304      simplifiedCharactersSelector         = 1,
305      jis1978CharactersSelector            = 2,
306      jis1983CharactersSelector            = 3,
307      jis1990CharactersSelector            = 4,
308      traditionalAltOneSelector            = 5,
309      traditionalAltTwoSelector            = 6,
310      traditionalAltThreeSelector          = 7,
311      traditionalAltFourSelector           = 8,
312      traditionalAltFiveSelector           = 9,
313      expertCharactersSelector             = 10,
314
315   numberCaseType = 21,
316
317      lowerCaseNumbersSelector             = 0,
318      upperCaseNumbersSelector             = 1,
319
320   textSpacingType = 22,
321
322      proportionalTextSelector             = 0,
323      monospacedTextSelector               = 1,
324      halfWidthTextSelector                = 2,
325      normallySpacedTextSelector           = 3,
326
327   transliterationType = 23,
328
329      noTransliterationSelector            = 0,
330      hanjaToHangulSelector                = 1,
331      hiraganaToKatakanaSelector           = 2,
332      katakanaToHiraganaSelector           = 3,
333      kanaToRomanizationSelector           = 4,
334      romanizationToHiraganaSelector       = 5,
335      romanizationToKatakanaSelector       = 6,
336      hanjaToHangulAltOneSelector          = 7,
337      hanjaToHangulAltTwoSelector          = 8,
338      hanjaToHangulAltThreeSelector        = 9,
339
340   annotationType = 24,
341
342      noAnnotationSelector                 = 0,
343      boxAnnotationSelector                = 1,
344      roundedBoxAnnotationSelector         = 2,
345      circleAnnotationSelector             = 3,
346      invertedCircleAnnotationSelector     = 4,
347      parenthesisAnnotationSelector        = 5,
348      periodAnnotationSelector             = 6,
349      romanNumeralAnnotationSelector       = 7,
350      diamondAnnotationSelector            = 8,
351
352   kanaSpacingType = 25,
353
354      fullWidthKanaSelector                = 0,
355      proportionalKanaSelector             = 1,
356
357   ideographicSpacingType = 26,
358
359      fullWidthIdeographsSelector          = 0,
360      proportionalIdeographsSelector       = 1,
361
362   cjkRomanSpacingType = 103,
363
364      halfWidthCJKRomanSelector            = 0,
365      proportionalCJKRomanSelector         = 1,
366      defaultCJKRomanSelector              = 2,
367      fullWidthCJKRomanSelector            = 3,
368
369   rubyKanaType = 28,
370
371      rubyKanaOnSelector                = 2,
372      rubyKanaOffSelector               = 3,
373
374/* The following types are provided for compatibility; note that
375   their use is deprecated. */
376
377   adobeCharacterSpacingType = 100,        /* prefer 22 */
378   adobeKanaSpacingType = 101,             /* prefer 25 */
379   adobeKanjiSpacingType = 102,            /* prefer 26 */
380   adobeSquareLigatures = 104,             /* prefer 1 */
381
382   lastFeatureType = -1
383};
384
385U_NAMESPACE_END
386#endif
387
388