• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
19 U_NAMESPACE_BEGIN
20 
21 class LEGlyphStorage;
22 class GlyphPositionAdjustments;
23 
24 class GlyphIterator : public UMemory {
25 public:
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 
75 private:
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 
109 U_NAMESPACE_END
110 #endif
111