]> git.saurik.com Git - apple/icu.git/blobdiff - icuSources/layout/GlyphIterator.h
ICU-551.24.tar.gz
[apple/icu.git] / icuSources / layout / GlyphIterator.h
index 610a0342b3935bf23a182ab0a7a5b3c6fbecf0d2..6531434d64a78bdc44d3fefaf57c6f2314fc4c37 100644 (file)
@@ -1,6 +1,6 @@
 /*
  *
- * (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);
 
@@ -44,24 +44,18 @@ public:
     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);
@@ -69,19 +63,18 @@ public:
     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);
 
@@ -89,20 +82,28 @@ private:
     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