2
* @(#)StateTableProcessor.cpp 1.6 00/03/15
4
* (C) Copyright IBM Corp. 1998, 1999, 2000, 2001 - All Rights Reserved
9
#include "MorphTables.h"
10
#include "StateTables.h"
11
#include "MorphStateTables.h"
12
#include "SubtableProcessor.h"
13
#include "StateTableProcessor.h"
18
StateTableProcessor::StateTableProcessor()
22
StateTableProcessor::StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader)
23
: SubtableProcessor(morphSubtableHeader)
25
stateTableHeader = (const MorphStateTableHeader *) morphSubtableHeader;
27
stateSize = SWAPW(stateTableHeader->stHeader.stateSize);
28
classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset);
29
stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset);
30
entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset);
32
classTable = (const ClassTable *) ((char *) &stateTableHeader->stHeader + classTableOffset);
33
firstGlyph = SWAPW(classTable->firstGlyph);
34
lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs);
37
StateTableProcessor::~StateTableProcessor()
41
void StateTableProcessor::process(LEGlyphID *glyphs, le_int32 *charIndices, le_int32 glyphCount)
44
// XXX: How do we know when to start at state 1?
45
ByteOffset currentState = stateArrayOffset;
48
le_int32 currGlyph = 0;
52
while (currGlyph <= glyphCount) {
53
ClassCode classCode = classCodeOOB;
54
if (currGlyph == glyphCount) {
55
// XXX: How do we handle EOT vs. EOL?
56
classCode = classCodeEOT;
58
LEGlyphID glyphCode = glyphs[currGlyph];
60
if (glyphCode == 0xFFFF) {
61
classCode = classCodeDEL;
62
} else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) {
63
classCode = classTable->classArray[glyphCode - firstGlyph];
67
const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState);
68
EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode];
70
currentState = processStateEntry(glyphs, charIndices, currGlyph, glyphCount, entryTableIndex);