|
1 /* |
|
2 * |
|
3 * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved |
|
4 * |
|
5 */ |
|
6 |
|
7 #include "LETypes.h" |
|
8 #include "MorphTables.h" |
|
9 #include "StateTables.h" |
|
10 #include "MorphStateTables.h" |
|
11 #include "SubtableProcessor.h" |
|
12 #include "StateTableProcessor.h" |
|
13 #include "LEGlyphStorage.h" |
|
14 #include "LESwaps.h" |
|
15 |
|
16 U_NAMESPACE_BEGIN |
|
17 |
|
18 StateTableProcessor::StateTableProcessor() |
|
19 { |
|
20 } |
|
21 |
|
22 StateTableProcessor::StateTableProcessor(const MorphSubtableHeader *morphSubtableHeader) |
|
23 : SubtableProcessor(morphSubtableHeader) |
|
24 { |
|
25 stateTableHeader = (const MorphStateTableHeader *) morphSubtableHeader; |
|
26 |
|
27 stateSize = SWAPW(stateTableHeader->stHeader.stateSize); |
|
28 classTableOffset = SWAPW(stateTableHeader->stHeader.classTableOffset); |
|
29 stateArrayOffset = SWAPW(stateTableHeader->stHeader.stateArrayOffset); |
|
30 entryTableOffset = SWAPW(stateTableHeader->stHeader.entryTableOffset); |
|
31 |
|
32 classTable = (const ClassTable *) ((char *) &stateTableHeader->stHeader + classTableOffset); |
|
33 firstGlyph = SWAPW(classTable->firstGlyph); |
|
34 lastGlyph = firstGlyph + SWAPW(classTable->nGlyphs); |
|
35 } |
|
36 |
|
37 StateTableProcessor::~StateTableProcessor() |
|
38 { |
|
39 } |
|
40 |
|
41 void StateTableProcessor::process(LEGlyphStorage &glyphStorage) |
|
42 { |
|
43 // Start at state 0 |
|
44 // XXX: How do we know when to start at state 1? |
|
45 ByteOffset currentState = stateArrayOffset; |
|
46 |
|
47 // XXX: reverse? |
|
48 le_int32 currGlyph = 0; |
|
49 le_int32 glyphCount = glyphStorage.getGlyphCount(); |
|
50 |
|
51 beginStateTable(); |
|
52 |
|
53 while (currGlyph <= glyphCount) { |
|
54 ClassCode classCode = classCodeOOB; |
|
55 if (currGlyph == glyphCount) { |
|
56 // XXX: How do we handle EOT vs. EOL? |
|
57 classCode = classCodeEOT; |
|
58 } else { |
|
59 TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]); |
|
60 |
|
61 if (glyphCode == 0xFFFF) { |
|
62 classCode = classCodeDEL; |
|
63 } else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) { |
|
64 classCode = classTable->classArray[glyphCode - firstGlyph]; |
|
65 } |
|
66 } |
|
67 |
|
68 const EntryTableIndex *stateArray = (const EntryTableIndex *) ((char *) &stateTableHeader->stHeader + currentState); |
|
69 EntryTableIndex entryTableIndex = stateArray[(le_uint8)classCode]; |
|
70 |
|
71 currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); |
|
72 } |
|
73 |
|
74 endStateTable(); |
|
75 } |
|
76 |
|
77 U_NAMESPACE_END |