18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/*
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project *
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project */
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "LETypes.h"
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "MorphTables.h"
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "SubtableProcessor.h"
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "NonContextualGlyphSubst.h"
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "NonContextualGlyphSubstProc.h"
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "SegmentArrayProcessor.h"
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "LEGlyphStorage.h"
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "LESwaps.h"
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectU_NAMESPACE_BEGIN
178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectUOBJECT_DEFINE_RTTI_IMPLEMENTATION(SegmentArrayProcessor)
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSegmentArrayProcessor::SegmentArrayProcessor()
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSegmentArrayProcessor::SegmentArrayProcessor(const MorphSubtableHeader *morphSubtableHeader)
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project  : NonContextualGlyphSubstitutionProcessor(morphSubtableHeader)
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const NonContextualGlyphSubstitutionHeader *header = (const NonContextualGlyphSubstitutionHeader *) morphSubtableHeader;
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    segmentArrayLookupTable = (const SegmentArrayLookupTable *) &header->table;
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectSegmentArrayProcessor::~SegmentArrayProcessor()
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid SegmentArrayProcessor::process(LEGlyphStorage &glyphStorage)
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    const LookupSegment *segments = segmentArrayLookupTable->segments;
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    le_int32 glyphCount = glyphStorage.getGlyphCount();
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    le_int32 glyph;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (glyph = 0; glyph < glyphCount; glyph += 1) {
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        LEGlyphID thisGlyph = glyphStorage[glyph];
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        const LookupSegment *lookupSegment = segmentArrayLookupTable->lookupSegment(segments, thisGlyph);
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (lookupSegment != NULL)  {
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            TTGlyphID firstGlyph = SWAPW(lookupSegment->firstGlyph);
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            le_int16  offset = SWAPW(lookupSegment->value);
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if (offset != 0) {
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                TTGlyphID  *glyphArray = (TTGlyphID *) ((char *) subtableHeader + offset);
52                TTGlyphID   newGlyph   = SWAPW(glyphArray[LE_GET_GLYPH(thisGlyph) - firstGlyph]);
53
54                glyphStorage[glyph] = LE_SET_GLYPH(thisGlyph, newGlyph);
55            }
56        }
57    }
58}
59
60U_NAMESPACE_END
61