3 * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
8 #include "MorphTables.h"
9 #include "StateTables.h"
10 #include "MorphStateTables.h"
11 #include "SubtableProcessor.h"
12 #include "StateTableProcessor.h"
13 #include "LEGlyphStorage.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(LEGlyphStorage
&glyphStorage
)
44 // XXX: How do we know when to start at state 1?
45 ByteOffset currentState
= stateArrayOffset
;
48 le_int32 currGlyph
= 0;
49 le_int32 glyphCount
= glyphStorage
.getGlyphCount();
53 while (currGlyph
<= glyphCount
) {
54 ClassCode classCode
= classCodeOOB
;
55 if (currGlyph
== glyphCount
) {
56 // XXX: How do we handle EOT vs. EOL?
57 classCode
= classCodeEOT
;
59 TTGlyphID glyphCode
= (TTGlyphID
) LE_GET_GLYPH(glyphStorage
[currGlyph
]);
61 if (glyphCode
== 0xFFFF) {
62 classCode
= classCodeDEL
;
63 } else if ((glyphCode
>= firstGlyph
) && (glyphCode
< lastGlyph
)) {
64 classCode
= classTable
->classArray
[glyphCode
- firstGlyph
];
68 const EntryTableIndex
*stateArray
= (const EntryTableIndex
*) ((char *) &stateTableHeader
->stHeader
+ currentState
);
69 EntryTableIndex entryTableIndex
= stateArray
[(le_uint8
)classCode
];
71 currentState
= processStateEntry(glyphStorage
, currGlyph
, entryTableIndex
);