2 * @(#)StateTableProcessor.cpp 1.6 00/03/15
4 * (C) Copyright IBM Corp. 1998-2003 - 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 TTGlyphID glyphCode
= (TTGlyphID
) LE_GET_GLYPH(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
);