46 IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
47 : StateTableProcessor(morphSubtableHeader, success),
48 indicRearrangementSubtableHeader(morphSubtableHeader, success),
49 entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader),
50 entryTableOffset, LE_UNBOUNDED_ARRAY),
51 int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY)
52
53 {
54 }
55
56 IndicRearrangementProcessor::~IndicRearrangementProcessor()
57 {
58 }
59
60 void IndicRearrangementProcessor::beginStateTable()
61 {
62 firstGlyph = 0;
63 lastGlyph = 0;
64 }
65
66 ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
67 {
68 LEErrorCode success = LE_NO_ERROR; // todo- make a param?
69 const IndicRearrangementStateEntry *entry = entryTable.getAlias(index,success);
70 ByteOffset newState = SWAPW(entry->newStateOffset);
71 IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
72
73 if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
74 success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
75 return 0;
76 }
77
78 if (flags & irfMarkFirst) {
79 firstGlyph = currGlyph;
80 }
81
82 if (flags & irfMarkLast) {
83 lastGlyph = currGlyph;
84 }
85
86 doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
87
88 if (!(flags & irfDontAdvance)) {
89 // XXX: Should handle reverse too...
|
46 IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
47 : StateTableProcessor(morphSubtableHeader, success),
48 indicRearrangementSubtableHeader(morphSubtableHeader, success),
49 entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader),
50 entryTableOffset, LE_UNBOUNDED_ARRAY),
51 int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY)
52
53 {
54 }
55
56 IndicRearrangementProcessor::~IndicRearrangementProcessor()
57 {
58 }
59
60 void IndicRearrangementProcessor::beginStateTable()
61 {
62 firstGlyph = 0;
63 lastGlyph = 0;
64 }
65
66 ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success)
67 {
68 const IndicRearrangementStateEntry *entry = entryTable.getAlias(index, success);
69 if (LE_FAILURE(success)) return 0;
70 ByteOffset newState = SWAPW(entry->newStateOffset);
71 IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
72
73 if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
74 success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
75 return 0;
76 }
77
78 if (flags & irfMarkFirst) {
79 firstGlyph = currGlyph;
80 }
81
82 if (flags & irfMarkLast) {
83 lastGlyph = currGlyph;
84 }
85
86 doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
87
88 if (!(flags & irfDontAdvance)) {
89 // XXX: Should handle reverse too...
|