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 "ContextualGlyphSubstProc.h"
     14 #include "LEGlyphStorage.h"
     15 #include "LESwaps.h"
     16 
     17 U_NAMESPACE_BEGIN
     18 
     19 UOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor)
     20 
     21 ContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader)
     22   : StateTableProcessor(morphSubtableHeader)
     23 {
     24     contextualGlyphSubstitutionHeader = (const ContextualGlyphSubstitutionHeader *) morphSubtableHeader;
     25     substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset);
     26 
     27     entryTable = (const ContextualGlyphSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset);
     28 }
     29 
     30 ContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor()
     31 {
     32 }
     33 
     34 void ContextualGlyphSubstitutionProcessor::beginStateTable()
     35 {
     36     markGlyph = 0;
     37 }
     38 
     39 ByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
     40 {
     41     const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index];
     42     ByteOffset newState = SWAPW(entry->newStateOffset);
     43     le_int16 flags = SWAPW(entry->flags);
     44     WordOffset markOffset = SWAPW(entry->markOffset);
     45     WordOffset currOffset = SWAPW(entry->currOffset);
     46 
     47     if (markOffset != 0) {
     48         const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2);
     49         LEGlyphID mGlyph = glyphStorage[markGlyph];
     50         TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]);
     51 
     52          glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph);
     53     }
     54 
     55     if (currOffset != 0) {
     56         const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2);
     57         LEGlyphID thisGlyph = glyphStorage[currGlyph];
     58         TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]);
     59 
     60         glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
     61     }
     62 
     63     if (flags & cgsSetMark) {
     64         markGlyph = currGlyph;
     65     }
     66 
     67     if (!(flags & cgsDontAdvance)) {
     68         // should handle reverse too!
     69         currGlyph += 1;
     70     }
     71 
     72     return newState;
     73 }
     74 
     75 void ContextualGlyphSubstitutionProcessor::endStateTable()
     76 {
     77 }
     78 
     79 U_NAMESPACE_END
     80