Home | History | Annotate | Download | only in layout
      1 /*
      2  * %W% %W%
      3  *
      4  * (C) Copyright IBM Corp. 1998 - 2004 - All Rights Reserved
      5  *
      6  */
      7 
      8 
      9 #include "LETypes.h"
     10 #include "LayoutTables.h"
     11 #include "MorphTables.h"
     12 #include "SubtableProcessor.h"
     13 #include "IndicRearrangementProcessor.h"
     14 #include "ContextualGlyphSubstProc.h"
     15 #include "LigatureSubstProc.h"
     16 #include "NonContextualGlyphSubstProc.h"
     17 //#include "ContextualGlyphInsertionProcessor.h"
     18 #include "LEGlyphStorage.h"
     19 #include "LESwaps.h"
     20 
     21 U_NAMESPACE_BEGIN
     22 
     23 void MorphTableHeader::process(LEGlyphStorage &glyphStorage) const
     24 {
     25     const ChainHeader *chainHeader = chains;
     26     le_uint32 chainCount = SWAPL(this->nChains);
     27     le_uint32 chain;
     28 
     29     for (chain = 0; chain < chainCount; chain += 1) {
     30         FeatureFlags defaultFlags = SWAPL(chainHeader->defaultFlags);
     31         le_uint32 chainLength = SWAPL(chainHeader->chainLength);
     32         le_int16 nFeatureEntries = SWAPW(chainHeader->nFeatureEntries);
     33         le_int16 nSubtables = SWAPW(chainHeader->nSubtables);
     34         const MorphSubtableHeader *subtableHeader =
     35             (const MorphSubtableHeader *)&chainHeader->featureTable[nFeatureEntries];
     36         le_int16 subtable;
     37 
     38         for (subtable = 0; subtable < nSubtables; subtable += 1) {
     39             le_int16 length = SWAPW(subtableHeader->length);
     40             SubtableCoverage coverage = SWAPW(subtableHeader->coverage);
     41             FeatureFlags subtableFeatures = SWAPL(subtableHeader->subtableFeatures);
     42 
     43             // should check coverage more carefully...
     44             if ((coverage & scfVertical) == 0 && (subtableFeatures & defaultFlags) != 0) {
     45                 subtableHeader->process(glyphStorage);
     46             }
     47 
     48             subtableHeader = (const MorphSubtableHeader *) ((char *)subtableHeader + length);
     49         }
     50 
     51         chainHeader = (const ChainHeader *)((char *)chainHeader + chainLength);
     52     }
     53 }
     54 
     55 void MorphSubtableHeader::process(LEGlyphStorage &glyphStorage) const
     56 {
     57     SubtableProcessor *processor = NULL;
     58 
     59     switch (SWAPW(coverage) & scfTypeMask)
     60     {
     61     case mstIndicRearrangement:
     62         processor = new IndicRearrangementProcessor(this);
     63         break;
     64 
     65     case mstContextualGlyphSubstitution:
     66         processor = new ContextualGlyphSubstitutionProcessor(this);
     67         break;
     68 
     69     case mstLigatureSubstitution:
     70         processor = new LigatureSubstitutionProcessor(this);
     71         break;
     72 
     73     case mstReservedUnused:
     74         break;
     75 
     76     case mstNonContextualGlyphSubstitution:
     77         processor = NonContextualGlyphSubstitutionProcessor::createInstance(this);
     78         break;
     79 
     80     /*
     81     case mstContextualGlyphInsertion:
     82         processor = new ContextualGlyphInsertionProcessor(this);
     83         break;
     84     */
     85 
     86     default:
     87         break;
     88     }
     89 
     90     if (processor != NULL) {
     91         processor->process(glyphStorage);
     92         delete processor;
     93     }
     94 }
     95 
     96 U_NAMESPACE_END
     97