de95737116
X-SVN-Rev: 12253
380 lines
9.7 KiB
C++
380 lines
9.7 KiB
C++
/*
|
|
* @(#)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
|