/*
*
- * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
+ * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
*
*/
#include "LETypes.h"
#include "OpenTypeTables.h"
#include "GlyphDefinitionTables.h"
-#include "GlyphPositionAdjustments.h"
U_NAMESPACE_BEGIN
class LEGlyphStorage;
+class GlyphPositionAdjustments;
class GlyphIterator : public UMemory {
public:
- GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustment *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags, LETag theFeatureTag,
- const GlyphDefinitionTableHeader *theGlyphDefinitionTableHeader);
+ GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
+ FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader);
GlyphIterator(GlyphIterator &that);
- GlyphIterator(GlyphIterator &that, LETag newFeatureTag);
+ GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask);
GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags);
le_bool ignoresMarks() const;
le_bool baselineIsLogicalEnd() const;
- le_bool hasCursiveFirstExitPoint() const;
- le_bool hasCursiveLastExitPoint() const;
LEGlyphID getCurrGlyphID() const;
le_int32 getCurrStreamPosition() const;
- void getCurrGlyphPositionAdjustment(GlyphPositionAdjustment &adjustment) const;
le_int32 getMarkComponent(le_int32 markPosition) const;
le_bool findMark2Glyph();
- void getCursiveLastExitPoint(LEPoint &exitPoint) const;
- LEGlyphID getCursiveLastGlyphID() const;
- float getCursiveBaselineAdjustment() const;
- void getCursiveLastPositionAdjustment(GlyphPositionAdjustment &adjustment) const;
+ void getCursiveEntryPoint(LEPoint &entryPoint) const;
+ void getCursiveExitPoint(LEPoint &exitPoint) const;
void setCurrGlyphID(TTGlyphID glyphID);
void setCurrStreamPosition(le_int32 position);
- void setCurrGlyphPositionAdjustment(const GlyphPositionAdjustment *adjustment);
void setCurrGlyphBaseOffset(le_int32 baseOffset);
void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
float xAdvanceAdjust, float yAdvanceAdjust);
void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
float xAdvanceAdjust, float yAdvanceAdjust);
- void setCursiveFirstExitPoint();
- void resetCursiveLastExitPoint();
- void setCursiveLastExitPoint(LEPoint &exitPoint);
- void setCursiveBaselineAdjustment(float adjustment);
- void adjustCursiveLastGlyphPositionAdjustment(float xPlacmentAdjust, float yPlacementAdjust,
- float xAdvanceAdjust, float yAdvanceAdjust);
+ void clearCursiveEntryPoint();
+ void clearCursiveExitPoint();
+ void setCursiveEntryPoint(LEPoint &entryPoint);
+ void setCursiveExitPoint(LEPoint &exitPoint);
+ void setCursiveGlyph();
- LEGlyphID *insertGlyphs(le_int32 count);
+ LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success);
le_int32 applyInsertions();
private:
- le_bool filterGlyph(le_uint32 index) const;
- le_bool hasFeatureTag() const;
+ le_bool filterGlyph(le_uint32 index);
+ le_bool hasFeatureTag(le_bool matchGroup) const;
le_bool nextInternal(le_uint32 delta = 1);
le_bool prevInternal(le_uint32 delta = 1);
le_int32 position;
le_int32 nextLimit;
le_int32 prevLimit;
- le_int32 cursiveFirstPosition;
- le_int32 cursiveLastPosition;
- float cursiveBaselineAdjustment;
- LEPoint cursiveLastExitPoint;
+
LEGlyphStorage &glyphStorage;
- GlyphPositionAdjustment *glyphPositionAdjustments;
- le_int32 srcIndex;
- le_int32 destIndex;
- le_uint16 lookupFlags;
- LETag featureTag;
- const GlyphClassDefinitionTable *glyphClassDefinitionTable;
- const MarkAttachClassDefinitionTable *markAttachClassDefinitionTable;
+ GlyphPositionAdjustments *glyphPositionAdjustments;
+
+ le_int32 srcIndex;
+ le_int32 destIndex;
+ le_uint16 lookupFlags;
+ FeatureMask featureMask;
+ le_int32 glyphGroup;
+
+ LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable;
+ LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable;
GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class
+
+ struct {
+ LEGlyphID id;
+ le_bool result;
+ } filterCache;
+ le_bool filterCacheValid;
+
+ void filterResetCache(void);
};
U_NAMESPACE_END