18393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius/*
28393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius *
3fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius * (C) Copyright IBM Corp.  and others 1998-2014 - All Rights Reserved
48393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius *
58393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius */
68393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
78393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LETypes.h"
88393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "MorphTables.h"
98393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "StateTables.h"
108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "MorphStateTables.h"
118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "SubtableProcessor2.h"
128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "StateTableProcessor2.h"
138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LEGlyphStorage.h"
148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LESwaps.h"
158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#include "LookupTables.h"
168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_BEGIN
188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusStateTableProcessor2::StateTableProcessor2()
208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
2359d709d503bab6e2b61931737e662dd293b40578ccorneliusStateTableProcessor2::StateTableProcessor2(const LEReferenceTo<MorphSubtableHeader2> &morphSubtableHeader, LEErrorCode &success)
24fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius  : SubtableProcessor2(morphSubtableHeader, success),
25fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    dir(1),
26fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    format(0),
27fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    nClasses(0),
28fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    classTableOffset(0),
29fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    stateArrayOffset(0),
30fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    entryTableOffset(0),
31fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    classTable(),
32fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    stateArray(),
33fceb39872958b9fa2505e63f8b8699a9e0f882f4ccornelius    stateTableHeader(morphSubtableHeader, success),
3459d709d503bab6e2b61931737e662dd293b40578ccornelius    stHeader(stateTableHeader, success, (const StateTableHeader2*)&stateTableHeader->stHeader)
358393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
3659d709d503bab6e2b61931737e662dd293b40578ccornelius  if (LE_FAILURE(success)) {
3759d709d503bab6e2b61931737e662dd293b40578ccornelius    return;
3859d709d503bab6e2b61931737e662dd293b40578ccornelius  }
3959d709d503bab6e2b61931737e662dd293b40578ccornelius  nClasses = SWAPL(stHeader->nClasses);
4059d709d503bab6e2b61931737e662dd293b40578ccornelius  classTableOffset = SWAPL(stHeader->classTableOffset);
4159d709d503bab6e2b61931737e662dd293b40578ccornelius  stateArrayOffset = SWAPL(stHeader->stateArrayOffset);
4259d709d503bab6e2b61931737e662dd293b40578ccornelius  entryTableOffset = SWAPL(stHeader->entryTableOffset);
4359d709d503bab6e2b61931737e662dd293b40578ccornelius
4459d709d503bab6e2b61931737e662dd293b40578ccornelius  classTable = LEReferenceTo<LookupTable>(stHeader, success, classTableOffset);
4559d709d503bab6e2b61931737e662dd293b40578ccornelius  format = SWAPW(classTable->format);
4659d709d503bab6e2b61931737e662dd293b40578ccornelius
4759d709d503bab6e2b61931737e662dd293b40578ccornelius  stateArray = LEReferenceToArrayOf<EntryTableIndex2>(stHeader, success, stateArrayOffset, LE_UNBOUNDED_ARRAY);
488393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
498393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
508393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusStateTableProcessor2::~StateTableProcessor2()
518393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
5459d709d503bab6e2b61931737e662dd293b40578ccorneliusvoid StateTableProcessor2::process(LEGlyphStorage &glyphStorage, LEErrorCode &success)
558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius{
5659d709d503bab6e2b61931737e662dd293b40578ccornelius    if (LE_FAILURE(success)) return;
578393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    // Start at state 0
588393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    // XXX: How do we know when to start at state 1?
598393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    le_uint16 currentState = 0;
608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    le_int32 glyphCount = glyphStorage.getGlyphCount();
6159d709d503bab6e2b61931737e662dd293b40578ccornelius
6259d709d503bab6e2b61931737e662dd293b40578ccornelius    LE_STATE_PATIENCE_INIT();
6359d709d503bab6e2b61931737e662dd293b40578ccornelius
648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    le_int32 currGlyph = 0;
658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    if ((coverage & scfReverse2) != 0) {  // process glyphs in descending order
668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        currGlyph = glyphCount - 1;
678393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        dir = -1;
688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    } else {
698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        dir = 1;
708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    beginStateTable();
738393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    switch (format) {
748393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        case ltfSimpleArray: {
758393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#ifdef TEST_FORMAT
7659d709d503bab6e2b61931737e662dd293b40578ccornelius          LEReferenceTo<SimpleArrayLookupTable> lookupTable0(classTable, success);
7759d709d503bab6e2b61931737e662dd293b40578ccornelius          if(LE_FAILURE(success)) break;
788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) {
7959d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_FAILURE(success)) break;
8059d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_STATE_PATIENCE_DECR()) {
8159d709d503bab6e2b61931737e662dd293b40578ccornelius                  LE_DEBUG_BAD_FONT("patience exceeded - state table not moving")
8259d709d503bab6e2b61931737e662dd293b40578ccornelius                  break; // patience exceeded.
8359d709d503bab6e2b61931737e662dd293b40578ccornelius                }
848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                LookupValue classCode = classCodeOOB;
858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                if (currGlyph == glyphCount || currGlyph == -1) {
868393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    // XXX: How do we handle EOT vs. EOL?
878393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    classCode = classCodeEOT;
888393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                } else {
898393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    LEGlyphID gid = glyphStorage[currGlyph];
908393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
918393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    if (glyphCode == 0xFFFF) {
938393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = classCodeDEL;
948393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    } else {
958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = SWAPW(lookupTable0->valueArray[gid]);
968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    }
978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                }
9859d709d503bab6e2b61931737e662dd293b40578ccornelius                EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success));
9959d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
1008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex); // return a zero-based index instead of a byte offset
10159d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_INCR(currGlyph);
1028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
1038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius#endif
1048393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
1058393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
1068393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        case ltfSegmentSingle: {
10759d709d503bab6e2b61931737e662dd293b40578ccornelius          LEReferenceTo<SegmentSingleLookupTable> lookupTable2(classTable, success);
10859d709d503bab6e2b61931737e662dd293b40578ccornelius          if(LE_FAILURE(success)) break;
1098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) {
11059d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_FAILURE(success)) break;
11159d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_STATE_PATIENCE_DECR()) {
11259d709d503bab6e2b61931737e662dd293b40578ccornelius                  LE_DEBUG_BAD_FONT("patience exceeded  - state table not moving")
11359d709d503bab6e2b61931737e662dd293b40578ccornelius                  break; // patience exceeded.
11459d709d503bab6e2b61931737e662dd293b40578ccornelius                }
1158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                LookupValue classCode = classCodeOOB;
1168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                if (currGlyph == glyphCount || currGlyph == -1) {
1178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    // XXX: How do we handle EOT vs. EOL?
1188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    classCode = classCodeEOT;
1198393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                } else {
1208393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    LEGlyphID gid = glyphStorage[currGlyph];
1218393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
1228393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1238393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    if (glyphCode == 0xFFFF) {
1248393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = classCodeDEL;
1258393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    } else {
12659d709d503bab6e2b61931737e662dd293b40578ccornelius                      const LookupSegment *segment =
12759d709d503bab6e2b61931737e662dd293b40578ccornelius                        lookupTable2->lookupSegment(lookupTable2, lookupTable2->segments, gid, success);
12859d709d503bab6e2b61931737e662dd293b40578ccornelius                        if (segment != NULL && LE_SUCCESS(success)) {
1298393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                            classCode = SWAPW(segment->value);
1308393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        }
1318393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    }
1328393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                }
13359d709d503bab6e2b61931737e662dd293b40578ccornelius                EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses,success));
13459d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
13559d709d503bab6e2b61931737e662dd293b40578ccornelius                currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success);
13659d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_INCR(currGlyph);
1378393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
1388393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
1398393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
1408393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        case ltfSegmentArray: {
14159d709d503bab6e2b61931737e662dd293b40578ccornelius          //printf("Lookup Table Format4: specific interpretation needed!\n");
1428393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
1438393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
1448393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        case ltfSingleTable: {
14559d709d503bab6e2b61931737e662dd293b40578ccornelius            LEReferenceTo<SingleTableLookupTable> lookupTable6(classTable, success);
1468393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) {
14759d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_FAILURE(success)) break;
14859d709d503bab6e2b61931737e662dd293b40578ccornelius                if (LE_STATE_PATIENCE_DECR()) {
14959d709d503bab6e2b61931737e662dd293b40578ccornelius                  LE_DEBUG_BAD_FONT("patience exceeded - state table not moving")
15059d709d503bab6e2b61931737e662dd293b40578ccornelius                  break; // patience exceeded.
15159d709d503bab6e2b61931737e662dd293b40578ccornelius                }
1528393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                LookupValue classCode = classCodeOOB;
1538393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                if (currGlyph == glyphCount || currGlyph == -1) {
1548393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    // XXX: How do we handle EOT vs. EOL?
1558393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    classCode = classCodeEOT;
15659d709d503bab6e2b61931737e662dd293b40578ccornelius                } else if(currGlyph > glyphCount) {
15759d709d503bab6e2b61931737e662dd293b40578ccornelius                  // note if > glyphCount, we've run off the end (bad font)
15859d709d503bab6e2b61931737e662dd293b40578ccornelius                  currGlyph = glyphCount;
15959d709d503bab6e2b61931737e662dd293b40578ccornelius                  classCode = classCodeEOT;
1608393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                } else {
1618393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    LEGlyphID gid = glyphStorage[currGlyph];
1628393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(gid);
1638393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1648393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    if (glyphCode == 0xFFFF) {
1658393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = classCodeDEL;
1668393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    } else {
16759d709d503bab6e2b61931737e662dd293b40578ccornelius                      const LookupSingle *segment = lookupTable6->lookupSingle(lookupTable6, lookupTable6->entries, gid, success);
1688393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        if (segment != NULL) {
1698393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                            classCode = SWAPW(segment->value);
1708393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        }
1718393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    }
1728393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                }
17359d709d503bab6e2b61931737e662dd293b40578ccornelius                EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success));
17459d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
17559d709d503bab6e2b61931737e662dd293b40578ccornelius                currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success);
17659d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_INCR(currGlyph);
1778393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
1788393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
1798393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
1808393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        case ltfTrimmedArray: {
18159d709d503bab6e2b61931737e662dd293b40578ccornelius            LEReferenceTo<TrimmedArrayLookupTable> lookupTable8(classTable, success);
18259d709d503bab6e2b61931737e662dd293b40578ccornelius            if (LE_FAILURE(success)) break;
1838393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            TTGlyphID firstGlyph = SWAPW(lookupTable8->firstGlyph);
1848393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            TTGlyphID lastGlyph  = firstGlyph + SWAPW(lookupTable8->glyphCount);
1858393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
1868393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            while ((dir == 1 && currGlyph <= glyphCount) || (dir == -1 && currGlyph >= -1)) {
18759d709d503bab6e2b61931737e662dd293b40578ccornelius                if(LE_STATE_PATIENCE_DECR()) {
18859d709d503bab6e2b61931737e662dd293b40578ccornelius                  LE_DEBUG_BAD_FONT("patience exceeded - state table not moving")
18959d709d503bab6e2b61931737e662dd293b40578ccornelius                  break; // patience exceeded.
19059d709d503bab6e2b61931737e662dd293b40578ccornelius                }
19159d709d503bab6e2b61931737e662dd293b40578ccornelius
1928393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                LookupValue classCode = classCodeOOB;
1938393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                if (currGlyph == glyphCount || currGlyph == -1) {
1948393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    // XXX: How do we handle EOT vs. EOL?
1958393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    classCode = classCodeEOT;
1968393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                } else {
1978393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    TTGlyphID glyphCode = (TTGlyphID) LE_GET_GLYPH(glyphStorage[currGlyph]);
1988393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    if (glyphCode == 0xFFFF) {
1998393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = classCodeDEL;
2008393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    } else if ((glyphCode >= firstGlyph) && (glyphCode < lastGlyph)) {
2018393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                        classCode = SWAPW(lookupTable8->valueArray[glyphCode - firstGlyph]);
2028393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                    }
2038393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius                }
20459d709d503bab6e2b61931737e662dd293b40578ccornelius                EntryTableIndex2 entryTableIndex = SWAPW(stateArray(classCode + currentState * nClasses, success));
20559d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_CURR(le_int32, currGlyph);
20659d709d503bab6e2b61931737e662dd293b40578ccornelius                currentState = processStateEntry(glyphStorage, currGlyph, entryTableIndex, success);
20759d709d503bab6e2b61931737e662dd293b40578ccornelius                LE_STATE_PATIENCE_INCR(currGlyph);
2088393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            }
2098393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
2108393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        }
2118393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius        default:
2128393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius            break;
2138393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    }
2148393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
2158393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius    endStateTable();
2168393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius}
2178393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig Cornelius
2188393335b955da7340c9f19b1b4b2d6c0c2c04be7Craig CorneliusU_NAMESPACE_END
219