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