• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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