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