1ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru/* 2ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 3ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * (C) Copyright IBM Corp. 1998-2004 - All Rights Reserved 4ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru * 5ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru */ 6ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 7ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LETypes.h" 8ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "MorphTables.h" 9ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "StateTables.h" 10ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "MorphStateTables.h" 11ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "SubtableProcessor.h" 12ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "StateTableProcessor.h" 13ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "ContextualGlyphSubstProc.h" 14ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LEGlyphStorage.h" 15ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru#include "LESwaps.h" 16ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 17ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_BEGIN 18ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 19ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruUOBJECT_DEFINE_RTTI_IMPLEMENTATION(ContextualGlyphSubstitutionProcessor) 20ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 21ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruContextualGlyphSubstitutionProcessor::ContextualGlyphSubstitutionProcessor(const MorphSubtableHeader *morphSubtableHeader) 22ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru : StateTableProcessor(morphSubtableHeader) 23ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 24ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru contextualGlyphSubstitutionHeader = (const ContextualGlyphSubstitutionHeader *) morphSubtableHeader; 25ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru substitutionTableOffset = SWAPW(contextualGlyphSubstitutionHeader->substitutionTableOffset); 26ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 27ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru entryTable = (const ContextualGlyphSubstitutionStateEntry *) ((char *) &stateTableHeader->stHeader + entryTableOffset); 28ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 29ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 30ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruContextualGlyphSubstitutionProcessor::~ContextualGlyphSubstitutionProcessor() 31ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 32ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 33ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 34ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ContextualGlyphSubstitutionProcessor::beginStateTable() 35ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 36ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru markGlyph = 0; 37ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 38ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 39ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruByteOffset ContextualGlyphSubstitutionProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index) 40ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 41ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const ContextualGlyphSubstitutionStateEntry *entry = &entryTable[index]; 42ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru ByteOffset newState = SWAPW(entry->newStateOffset); 43ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru le_int16 flags = SWAPW(entry->flags); 44ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru WordOffset markOffset = SWAPW(entry->markOffset); 45ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru WordOffset currOffset = SWAPW(entry->currOffset); 46ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 47ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (markOffset != 0) { 48ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + markOffset * 2); 49ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEGlyphID mGlyph = glyphStorage[markGlyph]; 50ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(mGlyph)]); 51ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 52ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru glyphStorage[markGlyph] = LE_SET_GLYPH(mGlyph, newGlyph); 53ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 54ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 55ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (currOffset != 0) { 56ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru const le_int16 *table = (const le_int16 *) ((char *) &stateTableHeader->stHeader + currOffset * 2); 57ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru LEGlyphID thisGlyph = glyphStorage[currGlyph]; 58ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru TTGlyphID newGlyph = SWAPW(table[LE_GET_GLYPH(thisGlyph)]); 59ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 60ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru glyphStorage[currGlyph] = LE_SET_GLYPH(thisGlyph, newGlyph); 61ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 62ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 63ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (flags & cgsSetMark) { 64ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru markGlyph = currGlyph; 65ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 66ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 67ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru if (!(flags & cgsDontAdvance)) { 68ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru // should handle reverse too! 69ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru currGlyph += 1; 70ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru } 71ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 72ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru return newState; 73ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 74ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 75ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queruvoid ContextualGlyphSubstitutionProcessor::endStateTable() 76ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru{ 77ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru} 78ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste Queru 79ac04d0bbe12b3ef54518635711412f178cb4d16Jean-Baptiste QueruU_NAMESPACE_END 80