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