Home | History | Annotate | Download | only in layout
      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 
     18 StateTableProcessor::StateTableProcessor()
     19 {
     20 }
     21 
     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 
     37 StateTableProcessor::~StateTableProcessor()
     38 {
     39 }
     40 
     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