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