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