os/textandloc/fontservices/textshaperplugin/IcuSource/layout/MorphTables.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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