1/*
2 *
3 * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
4 *
5 */
6
7#ifndef __GLYPHITERATOR_H
8#define __GLYPHITERATOR_H
9
10/**
11 * \file
12 * \internal
13 */
14
15#include "LETypes.h"
16#include "OpenTypeTables.h"
17#include "GlyphDefinitionTables.h"
18
19U_NAMESPACE_BEGIN
20
21class LEGlyphStorage;
22class GlyphPositionAdjustments;
23
24class GlyphIterator : public UMemory {
25public:
26    GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
27                  FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader);
28
29    GlyphIterator(GlyphIterator &that);
30
31    GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask);
32
33    GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags);
34
35    virtual ~GlyphIterator();
36
37    void reset(le_uint16 newLookupFlags, LETag newFeatureTag);
38
39    le_bool next(le_uint32 delta = 1);
40    le_bool prev(le_uint32 delta = 1);
41    le_bool findFeatureTag();
42
43    le_bool isRightToLeft() const;
44    le_bool ignoresMarks() const;
45
46    le_bool baselineIsLogicalEnd() const;
47
48    LEGlyphID getCurrGlyphID() const;
49    le_int32  getCurrStreamPosition() const;
50
51    le_int32  getMarkComponent(le_int32 markPosition) const;
52    le_bool   findMark2Glyph();
53
54    void getCursiveEntryPoint(LEPoint &entryPoint) const;
55    void getCursiveExitPoint(LEPoint &exitPoint) const;
56
57    void setCurrGlyphID(TTGlyphID glyphID);
58    void setCurrStreamPosition(le_int32 position);
59    void setCurrGlyphBaseOffset(le_int32 baseOffset);
60    void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
61                                           float xAdvanceAdjust,   float yAdvanceAdjust);
62
63    void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
64                                        float xAdvanceAdjust,   float yAdvanceAdjust);
65
66    void clearCursiveEntryPoint();
67    void clearCursiveExitPoint();
68    void setCursiveEntryPoint(LEPoint &entryPoint);
69    void setCursiveExitPoint(LEPoint &exitPoint);
70    void setCursiveGlyph();
71
72    LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success);
73    le_int32 applyInsertions();
74
75private:
76    le_bool filterGlyph(le_uint32 index);
77    le_bool hasFeatureTag(le_bool matchGroup) const;
78    le_bool nextInternal(le_uint32 delta = 1);
79    le_bool prevInternal(le_uint32 delta = 1);
80
81    le_int32  direction;
82    le_int32  position;
83    le_int32  nextLimit;
84    le_int32  prevLimit;
85
86    LEGlyphStorage &glyphStorage;
87    GlyphPositionAdjustments *glyphPositionAdjustments;
88
89    le_int32    srcIndex;
90    le_int32    destIndex;
91    le_uint16   lookupFlags;
92    FeatureMask featureMask;
93    le_int32    glyphGroup;
94
95    LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable;
96    LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable;
97
98    GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class
99
100    struct {
101      LEGlyphID   id;
102      le_bool     result;
103    } filterCache;
104    le_bool   filterCacheValid;
105
106    void filterResetCache(void);
107};
108
109U_NAMESPACE_END
110#endif
111