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
27U_NAMESPACE_BEGIN
28
29// Aside from the names, the contextual positioning subtables are
30// the same as the contextual substitution subtables.
31typedef ContextualSubstitutionSubtable ContextualPositioningSubtable;
32typedef ChainingContextualSubstitutionSubtable ChainingContextualPositioningSubtable;
33
34GlyphPositioningLookupProcessor::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
58GlyphPositioningLookupProcessor::GlyphPositioningLookupProcessor()
59{
60}
61
62le_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, lookupType, glyphIterator, fontInstance, success);
147        break;
148    }
149
150    default:
151        break;
152    }
153
154    return delta;
155}
156
157GlyphPositioningLookupProcessor::~GlyphPositioningLookupProcessor()
158{
159}
160
161U_NAMESPACE_END
162