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