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