1 /*
2 * (C) Copyright IBM Corp. 1998 - 2013 - All Rights Reserved
3 *
4 */
5
6 #include "LETypes.h"
7 #include "LEFontInstance.h"
8 #include "OpenTypeTables.h"
9 #include "ICUFeatures.h"
10 #include "Lookups.h"
11 #include "ScriptAndLanguage.h"
12 #include "GlyphDefinitionTables.h"
13 #include "GlyphPositioningTables.h"
14 #include "SinglePositioningSubtables.h"
15 #include "PairPositioningSubtables.h"
16 #include "CursiveAttachmentSubtables.h"
17 #include "MarkToBasePosnSubtables.h"
18 #include "MarkToLigaturePosnSubtables.h"
19 #include "MarkToMarkPosnSubtables.h"
20 //#include "ContextualPositioningSubtables.h"
21 #include "ContextualSubstSubtables.h"
22 #include "ExtensionSubtables.h"
23 #include "LookupProcessor.h"
24 #include "GlyphPosnLookupProc.h"
25 #include "LESwaps.h"
26
27 U_NAMESPACE_BEGIN
28
29 // Aside from the names, the contextual positioning subtables are
30 // the same as the contextual substitution subtables.
31 typedef ContextualSubstitutionSubtable ContextualPositioningSubtable;
32 typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable;
33
GlyphPositioningLookupProcessor(const LEReferenceTo<GlyphPositioningTableHeader> & glyphPositioningTableHeader,LETag scriptTag,LETag languageTag,const FeatureMap * featureMap,le_int32 featureMapCount,le_bool featureOrder,LEErrorCode & success)34 GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor(
35 const LEReferenceTo<GlyphPositioningTableHeader> &glyphPositioningTableHeader,
36 LETag scriptTag,
37 LETag languageTag,
38 const FeatureMap *featureMap,
39 le_int32 featureMapCount,
40 le_bool featureOrder,
41 LEErrorCode& success)
42 : LookupProcessor(
43 glyphPositioningTableHeader,
44 SWAPW(glyphPositioningTableHeader->scriptListOffset),
45 SWAPW(glyphPositioningTableHeader->featureListOffset),
46 SWAPW(glyphPositioningTableHeader->lookupListOffset),
47 scriptTag,
48 languageTag,
49 featureMap,
50 featureMapCount,
51 featureOrder,
52 success
53 )
54 {
55 // anything?
56 }
57
GlyphPositioningLookupProcessor()58 GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor()
59 {
60 }
61
applySubtable(const LEReferenceTo<LookupSubtable> & lookupSubtable,le_uint16 lookupType,GlyphIterator * glyphIterator,const LEFontInstance * fontInstance,LEErrorCode & success) const62 le_uint32 GlyphPositioningLookupProcessor::applySubtable(const LEReferenceTo<LookupSubtable> &lookupSubtable, le_uint16 lookupType,
63 GlyphIterator *glyphIterator,
64 const LEFontInstance *fontInstance,
65 LEErrorCode& success) const
66 {
67 if (LE_FAILURE(success)) {
68 return 0;
69 }
70
71 le_uint32 delta = 0;
72
73 switch(lookupType)
74 {
75 case 0:
76 break;
77
78 case gpstSingle:
79 {
80 LEReferenceTo<SinglePositioningSubtable> subtable(lookupSubtable, success);
81
82 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
83 break;
84 }
85
86 case gpstPair:
87 {
88 LEReferenceTo<PairPositioningSubtable> subtable(lookupSubtable, success);
89
90 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
91 break;
92 }
93
94 case gpstCursive:
95 {
96 LEReferenceTo<CursiveAttachmentSubtable> subtable(lookupSubtable, success);
97
98 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
99 break;
100 }
101
102 case gpstMarkToBase:
103 {
104 LEReferenceTo<MarkToBasePositioningSubtable> subtable(lookupSubtable, success);
105
106 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
107 break;
108 }
109
110 case gpstMarkToLigature:
111 {
112 LEReferenceTo<MarkToLigaturePositioningSubtable> subtable(lookupSubtable, success);
113
114 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
115 break;
116 }
117
118 case gpstMarkToMark:
119 {
120 LEReferenceTo<MarkToMarkPositioningSubtable> subtable(lookupSubtable, success);
121
122 delta = subtable->process(subtable, glyphIterator, fontInstance, success);
123 break;
124 }
125
126 case gpstContext:
127 {
128 LEReferenceTo<ContextualPositioningSubtable> subtable(lookupSubtable, success);
129
130 delta = subtable->process(this, glyphIterator, fontInstance, success);
131 break;
132 }
133
134 case gpstChainedContext:
135 {
136 LEReferenceTo<ChainingContextualPositioningSubtable> subtable(lookupSubtable, success);
137
138 delta = subtable->process(this, glyphIterator, fontInstance, success);
139 break;
140 }
141
142 case gpstExtension:
143 {
144 LEReferenceTo<ExtensionSubtable> subtable(lookupSubtable, success);
145
146 delta = subtable->process(this, subtable, lookupType, glyphIterator, fontInstance, success); // Google patch: add subtable
147 break;
148 }
149
150 default:
151 break;
152 }
153
154 return delta;
155 }
156
~GlyphPositioningLookupProcessor()157 GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor()
158 {
159 }
160
161 U_NAMESPACE_END
162