• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
StateTableProcessor()18 StateTableProcessor::StateTableProcessor()
19 {
20 }
21 
StateTableProcessor(const MorphSubtableHeader * morphSubtableHeader)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 
~StateTableProcessor()37 StateTableProcessor::~StateTableProcessor()
38 {
39 }
40 
process(LEGlyphStorage & glyphStorage)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
78