os/textandloc/fontservices/textshaperplugin/IcuSource/layout/StateTableProcessor.cpp
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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