| /* |
| * @(#)IndicRearrangementProcessor.cpp 1.7 00/03/15 |
| * |
| * (C) Copyright IBM Corp. 1998-2003 - All Rights Reserved |
| * |
| */ |
| |
| #include "LETypes.h" |
| #include "MorphTables.h" |
| #include "StateTables.h" |
| #include "MorphStateTables.h" |
| #include "SubtableProcessor.h" |
| #include "StateTableProcessor.h" |
| #include "IndicRearrangementProcessor.h" |
| #include "LESwaps.h" |
| |
| U_NAMESPACE_BEGIN |
| |
| const char IndicRearrangementProcessor::fgClassID=0; |
| |
| IndicRearrangementProcessor::IndicRearrangementProcessor(const MorphSubtableHeader *morphSubtableHeader) |
| : StateTableProcessor(morphSubtableHeader) |
| { |
| indicRearrangementSubtableHeader = (const IndicRearrangementSubtableHeader *) morphSubtableHeader; |
| entryTable = (const IndicRearrangementStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); |
| } |
| |
| IndicRearrangementProcessor::~IndicRearrangementProcessor() |
| { |
| } |
| |
| void IndicRearrangementProcessor::beginStateTable() |
| { |
| firstGlyph = 0; |
| lastGlyph = 0; |
| } |
| |
| ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 &currGlyph, |
| le_int32 /*glyphCount*/, EntryTableIndex index) |
| { |
| const IndicRearrangementStateEntry *entry = &entryTable[index]; |
| ByteOffset newState = SWAPW(entry->newStateOffset); |
| IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags); |
| |
| if (flags & irfMarkFirst) { |
| firstGlyph = currGlyph; |
| } |
| |
| if (flags & irfMarkLast) { |
| lastGlyph = currGlyph; |
| } |
| |
| doRearrangementAction(glyphs, charIndices, (IndicRearrangementVerb) (flags & irfVerbMask)); |
| |
| if (!(flags & irfDontAdvance)) { |
| // XXX: Should handle reverse too... |
| currGlyph += 1; |
| } |
| |
| return newState; |
| } |
| |
| void IndicRearrangementProcessor::endStateTable() |
| { |
| } |
| |
| void IndicRearrangementProcessor::doRearrangementAction(LEGlyphID *glyphs, le_int32 *charIndices, IndicRearrangementVerb verb) const |
| { |
| LEGlyphID a, b, c, d; |
| le_int32 ia, ib, ic, id, x; |
| |
| switch(verb) |
| { |
| case irvNoAction: |
| break; |
| |
| case irvxA: |
| a = glyphs[firstGlyph]; |
| ia = charIndices[firstGlyph]; |
| x = firstGlyph + 1; |
| |
| while (x <= lastGlyph) { |
| glyphs[x - 1] = glyphs[x]; |
| charIndices[x - 1] = charIndices[x]; |
| x += 1; |
| } |
| |
| glyphs[lastGlyph] = a; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvDx: |
| d = glyphs[lastGlyph]; |
| id = charIndices[lastGlyph]; |
| x = lastGlyph - 1; |
| |
| while (x >= firstGlyph) { |
| glyphs[x + 1] = glyphs[x]; |
| charIndices[x + 1] = charIndices[x]; |
| x -= 1; |
| } |
| |
| glyphs[firstGlyph] = d; |
| charIndices[firstGlyph] = id; |
| break; |
| |
| case irvDxA: |
| a = glyphs[firstGlyph]; |
| ia = charIndices[firstGlyph]; |
| |
| glyphs[firstGlyph] = glyphs[lastGlyph]; |
| glyphs[lastGlyph] = a; |
| |
| charIndices[firstGlyph] = charIndices[lastGlyph]; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvxAB: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| x = firstGlyph + 2; |
| |
| while (x <= lastGlyph) { |
| glyphs[x - 2] = glyphs[x]; |
| charIndices[x - 2] = charIndices[x]; |
| x += 1; |
| } |
| |
| glyphs[lastGlyph - 1] = a; |
| glyphs[lastGlyph] = b; |
| |
| charIndices[lastGlyph - 1] = ia; |
| charIndices[lastGlyph] = ib; |
| break; |
| |
| case irvxBA: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| x = firstGlyph + 2; |
| |
| while (x <= lastGlyph) { |
| glyphs[x - 2] = glyphs[x]; |
| charIndices[x - 2] = charIndices[x]; |
| x += 1; |
| } |
| |
| glyphs[lastGlyph - 1] = b; |
| glyphs[lastGlyph] = a; |
| |
| charIndices[lastGlyph - 1] = ib; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvCDx: |
| c = glyphs[lastGlyph - 1]; |
| d = glyphs[lastGlyph]; |
| ic = charIndices[lastGlyph - 1]; |
| id = charIndices[lastGlyph]; |
| x = lastGlyph - 2; |
| |
| while (x >= lastGlyph) { |
| glyphs[x + 2] = glyphs[x]; |
| charIndices[x + 2] = charIndices[x]; |
| x -= 1; |
| } |
| |
| glyphs[firstGlyph] = c; |
| glyphs[firstGlyph + 1] = d; |
| |
| charIndices[firstGlyph] = ic; |
| charIndices[firstGlyph + 1] = id; |
| break; |
| |
| case irvDCx: |
| c = glyphs[lastGlyph - 1]; |
| d = glyphs[lastGlyph]; |
| ic = charIndices[lastGlyph - 1]; |
| id = charIndices[lastGlyph]; |
| x = lastGlyph - 2; |
| |
| while (x >= lastGlyph) { |
| glyphs[x + 2] = glyphs[x]; |
| charIndices[x + 2] = charIndices[x]; |
| x -= 1; |
| } |
| |
| glyphs[firstGlyph] = d; |
| glyphs[firstGlyph + 1] = c; |
| |
| charIndices[firstGlyph] = id; |
| charIndices[firstGlyph + 1] = ic; |
| break; |
| |
| case irvCDxA: |
| a = glyphs[firstGlyph]; |
| c = glyphs[lastGlyph - 1]; |
| d = glyphs[lastGlyph]; |
| ia = charIndices[firstGlyph]; |
| ic = charIndices[lastGlyph - 1]; |
| id = charIndices[lastGlyph]; |
| x = lastGlyph - 2; |
| |
| while (x > firstGlyph) { |
| glyphs[x + 1] = glyphs[x]; |
| charIndices[x + 1] = charIndices[x]; |
| x -= 1; |
| } |
| |
| glyphs[firstGlyph] = c; |
| glyphs[firstGlyph + 1] = d; |
| glyphs[lastGlyph] = a; |
| |
| charIndices[firstGlyph] = ic; |
| charIndices[firstGlyph + 1] = id; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvDCxA: |
| a = glyphs[firstGlyph]; |
| c = glyphs[lastGlyph - 1]; |
| d = glyphs[lastGlyph]; |
| ia = charIndices[firstGlyph]; |
| ic = charIndices[lastGlyph - 1]; |
| id = charIndices[lastGlyph]; |
| x = lastGlyph - 2; |
| |
| while (x > firstGlyph) { |
| glyphs[x + 1] = glyphs[x]; |
| charIndices[x + 1] = charIndices[x]; |
| x -= 1; |
| } |
| |
| glyphs[firstGlyph] = d; |
| glyphs[firstGlyph + 1] = c; |
| glyphs[lastGlyph] = a; |
| |
| charIndices[firstGlyph] = id; |
| charIndices[firstGlyph + 1] = ic; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvDxAB: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| d = glyphs[lastGlyph]; |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| id = charIndices[lastGlyph]; |
| x = firstGlyph + 2; |
| |
| while (x < lastGlyph) { |
| glyphs[x - 2] = glyphs[x]; |
| charIndices[x - 2] = charIndices[x]; |
| x += 1; |
| } |
| |
| glyphs[firstGlyph] = d; |
| glyphs[lastGlyph - 1] = a; |
| glyphs[lastGlyph] = b; |
| |
| charIndices[firstGlyph] = id; |
| charIndices[lastGlyph - 1] = ia; |
| charIndices[lastGlyph] = ib; |
| break; |
| |
| case irvDxBA: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| d = glyphs[lastGlyph]; |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| id = charIndices[lastGlyph]; |
| x = firstGlyph + 2; |
| |
| while (x < lastGlyph) { |
| glyphs[x - 2] = glyphs[x]; |
| charIndices[x - 2] = charIndices[x]; |
| x += 1; |
| } |
| |
| glyphs[firstGlyph] = d; |
| glyphs[lastGlyph - 1] = b; |
| glyphs[lastGlyph] = a; |
| |
| charIndices[firstGlyph] = id; |
| charIndices[lastGlyph - 1] = ib; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvCDxAB: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| |
| glyphs[firstGlyph] = glyphs[lastGlyph - 1]; |
| glyphs[firstGlyph + 1] = glyphs[lastGlyph]; |
| |
| glyphs[lastGlyph - 1] = a; |
| glyphs[lastGlyph] = b; |
| |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| |
| charIndices[firstGlyph] = charIndices[lastGlyph - 1]; |
| charIndices[firstGlyph + 1] = charIndices[lastGlyph]; |
| |
| charIndices[lastGlyph - 1] = ia; |
| charIndices[lastGlyph] = ib; |
| break; |
| |
| case irvCDxBA: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| |
| glyphs[firstGlyph] = glyphs[lastGlyph - 1]; |
| glyphs[firstGlyph + 1] = glyphs[lastGlyph]; |
| |
| glyphs[lastGlyph - 1] = b; |
| glyphs[lastGlyph] = a; |
| |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| |
| charIndices[firstGlyph] = charIndices[lastGlyph - 1]; |
| charIndices[firstGlyph + 1] = charIndices[lastGlyph]; |
| |
| charIndices[lastGlyph - 1] = ib; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| case irvDCxAB: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| |
| glyphs[firstGlyph] = glyphs[lastGlyph]; |
| glyphs[firstGlyph + 1] = glyphs[lastGlyph - 1]; |
| |
| glyphs[lastGlyph - 1] = a; |
| glyphs[lastGlyph] = b; |
| |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| |
| charIndices[firstGlyph] = charIndices[lastGlyph]; |
| charIndices[firstGlyph + 1] = charIndices[lastGlyph - 1]; |
| |
| charIndices[lastGlyph - 1] = ia; |
| charIndices[lastGlyph] = ib; |
| break; |
| |
| case irvDCxBA: |
| a = glyphs[firstGlyph]; |
| b = glyphs[firstGlyph + 1]; |
| |
| glyphs[firstGlyph] = glyphs[lastGlyph]; |
| glyphs[firstGlyph + 1] = glyphs[lastGlyph - 1]; |
| |
| glyphs[lastGlyph - 1] = b; |
| glyphs[lastGlyph] = a; |
| |
| ia = charIndices[firstGlyph]; |
| ib = charIndices[firstGlyph + 1]; |
| |
| charIndices[firstGlyph] = charIndices[lastGlyph]; |
| charIndices[firstGlyph + 1] = charIndices[lastGlyph - 1]; |
| |
| charIndices[lastGlyph - 1] = ib; |
| charIndices[lastGlyph] = ia; |
| break; |
| |
| default: |
| break; |
| } |
| } |
| |
| U_NAMESPACE_END |