blob: 3d93be03757484ba824ad1bc6ede7249d15516a9 [file] [log] [blame]
/*
* @(#)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