os/textandloc/fontservices/textshaperplugin/IcuSource/layout/StateTableProcessor.cpp
Update contrib.
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);