1b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/*
2b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
359d709d503bab6e2b61931737e662dd293b40578ccornelius * (C) Copyright IBM Corp. 1998-2013 - All Rights Reserved
4b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru *
5b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
6b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#ifndef __GLYPHITERATOR_H
8b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#define __GLYPHITERATOR_H
9b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
10b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru/**
11b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \file
12b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru * \internal
13b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru */
14b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
15b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "LETypes.h"
16b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "OpenTypeTables.h"
17b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#include "GlyphDefinitionTables.h"
18b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
19b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_BEGIN
20b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
21b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass LEGlyphStorage;
22b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass GlyphPositionAdjustments;
23b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
24b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruclass GlyphIterator : public UMemory {
25b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Querupublic:
26b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphIterator(LEGlyphStorage &theGlyphStorage, GlyphPositionAdjustments *theGlyphPositionAdjustments, le_bool rightToLeft, le_uint16 theLookupFlags,
2759d709d503bab6e2b61931737e662dd293b40578ccornelius                  FeatureMask theFeatureMask, const LEReferenceTo<GlyphDefinitionTableHeader> &theGlyphDefinitionTableHeader);
28b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
29b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphIterator(GlyphIterator &that);
30b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
31b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphIterator(GlyphIterator &that, FeatureMask newFeatureMask);
32b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
33b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphIterator(GlyphIterator &that, le_uint16 newLookupFlags);
34b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
35b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    virtual ~GlyphIterator();
36b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
37b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void reset(le_uint16 newLookupFlags, LETag newFeatureTag);
38b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
39b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool next(le_uint32 delta = 1);
40b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool prev(le_uint32 delta = 1);
41b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool findFeatureTag();
42b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
43b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool isRightToLeft() const;
44b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool ignoresMarks() const;
45b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
46b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool baselineIsLogicalEnd() const;
47b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
48b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LEGlyphID getCurrGlyphID() const;
49b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  getCurrStreamPosition() const;
50b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
51b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  getMarkComponent(le_int32 markPosition) const;
52b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool   findMark2Glyph();
53b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
54b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void getCursiveEntryPoint(LEPoint &entryPoint) const;
55b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void getCursiveExitPoint(LEPoint &exitPoint) const;
56b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
57b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCurrGlyphID(TTGlyphID glyphID);
58b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCurrStreamPosition(le_int32 position);
59b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCurrGlyphBaseOffset(le_int32 baseOffset);
60b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void adjustCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
61b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                           float xAdvanceAdjust,   float yAdvanceAdjust);
62b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
63b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCurrGlyphPositionAdjustment(float xPlacementAdjust, float yPlacementAdjust,
64b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru                                        float xAdvanceAdjust,   float yAdvanceAdjust);
65b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
66b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void clearCursiveEntryPoint();
67b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void clearCursiveExitPoint();
68b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCursiveEntryPoint(LEPoint &entryPoint);
69b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCursiveExitPoint(LEPoint &exitPoint);
70b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    void setCursiveGlyph();
71b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
7285bf2e2fbc60a9f938064abc8127d61da7d19882Claire Ho    LEGlyphID *insertGlyphs(le_int32 count, LEErrorCode& success);
73b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32 applyInsertions();
74b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
75b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queruprivate:
7659d709d503bab6e2b61931737e662dd293b40578ccornelius    le_bool filterGlyph(le_uint32 index);
77b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool hasFeatureTag(le_bool matchGroup) const;
78b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool nextInternal(le_uint32 delta = 1);
79b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_bool prevInternal(le_uint32 delta = 1);
80b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
81b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  direction;
82b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  position;
83b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  nextLimit;
84b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32  prevLimit;
85b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
86b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    LEGlyphStorage &glyphStorage;
87b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphPositionAdjustments *glyphPositionAdjustments;
88b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
89b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32    srcIndex;
90b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32    destIndex;
91b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_uint16   lookupFlags;
92b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    FeatureMask featureMask;
93b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    le_int32    glyphGroup;
94b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
9559d709d503bab6e2b61931737e662dd293b40578ccornelius    LEReferenceTo<GlyphClassDefinitionTable> glyphClassDefinitionTable;
9659d709d503bab6e2b61931737e662dd293b40578ccornelius    LEReferenceTo<MarkAttachClassDefinitionTable> markAttachClassDefinitionTable;
97b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
98b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru    GlyphIterator &operator=(const GlyphIterator &other); // forbid copying of this class
9959d709d503bab6e2b61931737e662dd293b40578ccornelius
10059d709d503bab6e2b61931737e662dd293b40578ccornelius    struct {
10159d709d503bab6e2b61931737e662dd293b40578ccornelius      LEGlyphID   id;
10259d709d503bab6e2b61931737e662dd293b40578ccornelius      le_bool     result;
10359d709d503bab6e2b61931737e662dd293b40578ccornelius    } filterCache;
10459d709d503bab6e2b61931737e662dd293b40578ccornelius    le_bool   filterCacheValid;
10559d709d503bab6e2b61931737e662dd293b40578ccornelius
10659d709d503bab6e2b61931737e662dd293b40578ccornelius    void filterResetCache(void);
107b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru};
108b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru
109b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste QueruU_NAMESPACE_END
110b13da9df870a61b11249bf741347908dbea0edd8Jean-Baptiste Queru#endif
111