1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
385bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho * (C) Copyright IBM Corp. 1998-2008 - All Rights Reserved
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LETypes.h"
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeTables.h"
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphDefinitionTables.h"
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphPositionAdjustments.h"
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphIterator.h"
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LEGlyphStorage.h"
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "Lookups.h"
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LESwaps.h"
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                             FeatureMask theFeatureMask, const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader)
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  : direction(1), position(-1), nextLimit(-1), prevLimit(-1),
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphStorage(theGlyphStorage), glyphPositionAdjustments(theGlyphPositionAdjustments),
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcIndex(-1), destIndex(-1), lookupFlags(theLookupFlags), featureMask(theFeatureMask), glyphGroup(0),
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphClassDefinitionTable(NULL), markAttachClassDefinitionTable(NULL)
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 glyphCount = glyphStorage.getGlyphCount();
27b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (theGlyphDefinitionTableHeader != NULL) {
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        glyphClassDefinitionTable = theGlyphDefinitionTableHeader->getGlyphClassDefinitionTable();
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        markAttachClassDefinitionTable = theGlyphDefinitionTableHeader->getMarkAttachClassDefinitionTable();
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nextLimit = glyphCount;
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (rightToLeft) {
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        direction = -1;
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        position = glyphCount;
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nextLimit = -1;
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prevLimit = glyphCount;
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that)
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  : glyphStorage(that.glyphStorage)
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    direction    = that.direction;
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position     = that.position;
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nextLimit    = that.nextLimit;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    prevLimit    = that.prevLimit;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments = that.glyphPositionAdjustments;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcIndex = that.srcIndex;
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destIndex = that.destIndex;
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lookupFlags = that.lookupFlags;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    featureMask = that.featureMask;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphGroup  = that.glyphGroup;
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphClassDefinitionTable = that.glyphClassDefinitionTable;
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask)
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  : glyphStorage(that.glyphStorage)
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    direction    = that.direction;
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position     = that.position;
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nextLimit    = that.nextLimit;
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    prevLimit    = that.prevLimit;
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments = that.glyphPositionAdjustments;
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcIndex = that.srcIndex;
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destIndex = that.destIndex;
72b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lookupFlags = that.lookupFlags;
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    featureMask = newFeatureMask;
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphGroup  = 0;
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphClassDefinitionTable = that.glyphClassDefinitionTable;
76b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags)
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  : glyphStorage(that.glyphStorage)
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    direction    = that.direction;
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position     = that.position;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    nextLimit    = that.nextLimit;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    prevLimit    = that.prevLimit;
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments = that.glyphPositionAdjustments;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    srcIndex = that.srcIndex;
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    destIndex = that.destIndex;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lookupFlags = newLookupFlags;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    featureMask = that.featureMask;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphGroup  = that.glyphGroup;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphClassDefinitionTable = that.glyphClassDefinitionTable;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    markAttachClassDefinitionTable = that.markAttachClassDefinitionTable;
95b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
96b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruGlyphIterator::~GlyphIterator()
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
99b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    // nothing to do, right?
100b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
101b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
102b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::reset(le_uint16 newLookupFlags, FeatureMask newFeatureMask)
103b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
104b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position     = prevLimit;
105b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    featureMask  = newFeatureMask;
106b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphGroup   = 0;
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    lookupFlags  = newLookupFlags;
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
11085bf2e2fbc60a9f938064abc8127d61da7d19882Claire HoLEGlyphID *GlyphIterator::insertGlyphs(le_int32 count, LEErrorCode& success)
111b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
11285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return glyphStorage.insertGlyphs(position, count, success);
113b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
114b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
115b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::applyInsertions()
116b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
117b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 newGlyphCount = glyphStorage.applyInsertions();
118b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
119b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
120b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        prevLimit = newGlyphCount;
121b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
122b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        nextLimit = newGlyphCount;
123b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
124b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
125b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return newGlyphCount;
126b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
127b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
128b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::getCurrStreamPosition() const
129b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
130b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return position;
131b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
132b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
133b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::isRightToLeft() const
134b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
135b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return direction < 0;
136b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
137b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
138b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::ignoresMarks() const
139b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
140b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (lookupFlags & lfIgnoreMarks) != 0;
141b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
142b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
143b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::baselineIsLogicalEnd() const
144b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
145b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return (lookupFlags & lfBaselineIsLogicalEnd) != 0;
146b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
147b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
148b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruLEGlyphID GlyphIterator::getCurrGlyphID() const
149b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
150b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
151b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
152b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0xFFFF;
153b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
154b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
155b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
156b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return 0xFFFF;
157b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
158b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
159b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
160b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return glyphStorage[position];
161b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
162b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
163b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::getCursiveEntryPoint(LEPoint &entryPoint) const
164b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
165b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
166b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
167b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
168b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
169b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
170b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
171b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
172b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
173b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
174b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
175b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->getEntryPoint(position, entryPoint);
176b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
177b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
178b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::getCursiveExitPoint(LEPoint &exitPoint) const
179b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
180b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
181b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
182b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
183b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
184b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
185b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
186b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
187b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
188b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
189b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
190b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->getExitPoint(position, exitPoint);
191b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
192b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
193b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphID(TTGlyphID glyphID)
194b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
195b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LEGlyphID glyph = glyphStorage[position];
196b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
197b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphStorage[position] = LE_SET_GLYPH(glyph, glyphID);
198b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
199b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
200b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrStreamPosition(le_int32 newPosition)
201b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
202b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
203b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (newPosition >= prevLimit) {
204b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            position = prevLimit;
205b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
206b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
207b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
208b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (newPosition <= nextLimit) {
209b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            position = nextLimit;
210b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
211b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
212b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
213b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (newPosition <= prevLimit) {
214b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            position = prevLimit;
215b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
216b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
217b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
218b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (newPosition >= nextLimit) {
219b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            position = nextLimit;
220b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
221b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
222b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
223b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
224b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position = newPosition - direction;
225b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    next();
226b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
227b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
228b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphBaseOffset(le_int32 baseOffset)
229b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
230b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
231b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
232b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
233b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
234b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
235b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
236b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
237b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
238b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
239b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
240b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setBaseOffset(position, baseOffset);
241b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
242b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
243b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
244b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                      float xAdvanceAdjust, float yAdvanceAdjust)
245b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
246b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
247b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
248b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
249b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
250b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
251b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
252b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
253b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
254b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
255b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
256b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->adjustXPlacement(position, xPlacementAdjust);
257b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->adjustYPlacement(position, yPlacementAdjust);
258b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->adjustXAdvance(position, xAdvanceAdjust);
259b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->adjustYAdvance(position, yAdvanceAdjust);
260b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
261b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
262b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
263b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                                      float xAdvanceAdjust, float yAdvanceAdjust)
264b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
265b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
266b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
267b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
268b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
269b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
270b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
271b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
272b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
273b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
274b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
275b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setXPlacement(position, xPlacementAdjust);
276b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setYPlacement(position, yPlacementAdjust);
277b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setXAdvance(position, xAdvanceAdjust);
278b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setYAdvance(position, yAdvanceAdjust);
279b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
280b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
281b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::clearCursiveEntryPoint()
282b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
283b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
284b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
285b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
286b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
287b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
288b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
289b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
290b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
291b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
292b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
293b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->clearEntryPoint(position);
294b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
295b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
296b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::clearCursiveExitPoint()
297b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
298b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
299b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
300b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
301b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
302b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
303b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
304b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
305b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
306b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
307b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
308b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->clearExitPoint(position);
309b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
310b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
311b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveEntryPoint(LEPoint &entryPoint)
312b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
313b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
314b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
315b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
316b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
317b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
318b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
319b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
320b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
321b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
322b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
323b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setEntryPoint(position, entryPoint, baselineIsLogicalEnd());
324b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
325b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
326b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveExitPoint(LEPoint &exitPoint)
327b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
328b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
329b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
330b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
331b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
332b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
333b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
334b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
335b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
336b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
337b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
338b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setExitPoint(position, exitPoint, baselineIsLogicalEnd());
339b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
340b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
341b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruvoid GlyphIterator::setCursiveGlyph()
342b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
343b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (direction < 0) {
344b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= nextLimit || position >= prevLimit) {
345b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
346b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
347b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } else {
348b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (position <= prevLimit || position >= nextLimit) {
349b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return;
350b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
351b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
352b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
353b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    glyphPositionAdjustments->setCursiveGlyph(position, baselineIsLogicalEnd());
354b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
355b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
356b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::filterGlyph(le_uint32 index) const
357b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
358b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LEGlyphID glyphID = glyphStorage[index];
359b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 glyphClass = gcdNoGlyphClass;
360b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
361b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (LE_GET_GLYPH(glyphID) >= 0xFFFE) {
362b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
363b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
364b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
365b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (glyphClassDefinitionTable != NULL) {
366b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        glyphClass = glyphClassDefinitionTable->getGlyphClass(glyphID);
367b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
368b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
369b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    switch (glyphClass)
370b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
371b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case gcdNoGlyphClass:
372b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
373b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
374b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case gcdSimpleGlyph:
375b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (lookupFlags & lfIgnoreBaseGlyphs) != 0;
376b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
377b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case gcdLigatureGlyph:
378b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (lookupFlags & lfIgnoreLigatures) != 0;
379b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
380b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case gcdMarkGlyph:
381b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    {
382b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((lookupFlags & lfIgnoreMarks) != 0) {
383b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return TRUE;
384b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
385b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
386b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        le_uint16 markAttachType = (lookupFlags & lfMarkAttachTypeMask) >> lfMarkAttachTypeShift;
387b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
388b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if ((markAttachType != 0) && (markAttachClassDefinitionTable != NULL)) {
389b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return markAttachClassDefinitionTable->getGlyphClass(glyphID) != markAttachType;
390b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
391b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
392b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
393b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
394b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
395b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    case gcdComponentGlyph:
396b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return (lookupFlags & lfIgnoreBaseGlyphs) != 0;
397b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
398b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    default:
399b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return FALSE;
400b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
401b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
402b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
403b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::hasFeatureTag(le_bool matchGroup) const
404b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
405b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    if (featureMask == 0) {
406b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        return TRUE;
407b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
408b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
409b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LEErrorCode success = LE_NO_ERROR;
410b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FeatureMask fm = glyphStorage.getAuxData(position, success);
411b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
41285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    return ((fm & featureMask) == featureMask) && (!matchGroup || (le_int32)(fm & LE_GLYPH_GROUP_MASK) == glyphGroup);
413b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
414b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
415b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::findFeatureTag()
416b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
417b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru  //glyphGroup = 0;
418b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
419b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (nextInternal()) {
420b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (hasFeatureTag(FALSE)) {
421b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            LEErrorCode success = LE_NO_ERROR;
422b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
423b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            glyphGroup = (glyphStorage.getAuxData(position, success) & LE_GLYPH_GROUP_MASK);
424b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            return TRUE;
425b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
426b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
427b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
428b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return FALSE;
429b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
430b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
431b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
432b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::nextInternal(le_uint32 delta)
433b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
434b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 newPosition = position;
435b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
436b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (newPosition != nextLimit && delta > 0) {
437b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        do {
438b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            newPosition += direction;
439b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } while (newPosition != nextLimit && filterGlyph(newPosition));
440b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
441b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delta -= 1;
442b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
443b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
444b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position = newPosition;
445b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
446b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return position != nextLimit;
447b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
448b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
449b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::next(le_uint32 delta)
450b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
451b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return nextInternal(delta) && hasFeatureTag(TRUE);
452b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
453b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
454b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::prevInternal(le_uint32 delta)
455b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
456b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 newPosition = position;
457b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
458b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    while (newPosition != prevLimit && delta > 0) {
459b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        do {
460b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            newPosition -= direction;
461b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        } while (newPosition != prevLimit && filterGlyph(newPosition));
462b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
463b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        delta -= 1;
464b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
465b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
466b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position = newPosition;
467b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
468b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return position != prevLimit;
469b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
470b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
471b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::prev(le_uint32 delta)
472b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
473b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return prevInternal(delta) && hasFeatureTag(TRUE);
474b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
475b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
476b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_int32 GlyphIterator::getMarkComponent(le_int32 markPosition) const
477b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
478b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 component = 0;
479b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 posn;
480b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
481b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    for (posn = position; posn != markPosition; posn += direction) {
482b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        if (glyphStorage[posn] == 0xFFFE) {
483b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru            component += 1;
484b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        }
485b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    }
486b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
487b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return component;
488b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
489b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
490b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// This is basically prevInternal except that it
491b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// doesn't take a delta argument, and it doesn't
492b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru// filter out 0xFFFE glyphs.
493b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querule_bool GlyphIterator::findMark2Glyph()
494b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru{
495b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 newPosition = position;
496b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
497b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    do {
498b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru        newPosition -= direction;
499b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    } while (newPosition != prevLimit && glyphStorage[newPosition] != 0xFFFE && filterGlyph(newPosition));
500b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
501b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    position = newPosition;
502b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
503b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    return position != prevLimit;
504b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru}
505b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
506b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
507