/*
 * @(#)LigatureSubstitutionSubtables.cpp	1.7 00/03/15
 *
 * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved
 *
 */

#include "LETypes.h"
#include "LEGlyphFilter.h"
#include "OpenTypeTables.h"
#include "GlyphSubstitutionTables.h"
#include "LigatureSubstitutionSubtables.h"
#include "GlyphIterator.h"
#include "LESwaps.h"

le_uint32 LigatureSubstitutionSubtable::process(GlyphIterator *glyphIterator, LEGlyphFilter *filter)
{
    LEGlyphID glyph = (LEGlyphID) glyphIterator->getCurrGlyphID();
    le_int32 coverageIndex = getGlyphCoverage(glyph);

    if (coverageIndex >= 0)
    {
        Offset ligSetTableOffset = SWAPW(ligSetTableOffsetArray[coverageIndex]);
        LigatureSetTable *ligSetTable = (LigatureSetTable *) ((char *) this + ligSetTableOffset);
        le_uint16 ligCount = SWAPW(ligSetTable->ligatureCount);

        for (le_uint16 lig = 0; lig < ligCount; lig += 1)
        {
            Offset ligTableOffset = SWAPW(ligSetTable->ligatureTableOffsetArray[lig]);
            LigatureTable *ligTable = (LigatureTable *) ((char *)ligSetTable + ligTableOffset);
            le_uint16 compCount = SWAPW(ligTable->compCount) - 1;
            le_int32 startPosition = glyphIterator->getCurrStreamPosition();
            LEGlyphID ligGlyph = SWAPW(ligTable->ligGlyph);
            le_uint16 comp;

            if (filter != NULL && ! filter->accept(ligGlyph))
            {
                continue;
            }

            for (comp = 0; comp < compCount; comp += 1)
            {
                if (! glyphIterator->next())
                {
                    break;
                }

                if ((LEGlyphID) glyphIterator->getCurrGlyphID() != SWAPW(ligTable->componentArray[comp]))
                {
                    break;
                }
            }

            if (comp == compCount)
            {
                GlyphIterator tempIterator(*glyphIterator);

                while (comp > 0)
                {
                    tempIterator.setCurrGlyphID(0xFFFF);
                    tempIterator.prev();

                    comp -= 1;
                }

                tempIterator.setCurrGlyphID(ligGlyph);

                return compCount + 1;
            }

            glyphIterator->setCurrStreamPosition(startPosition);
        }

    }

    return 0;
}
