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