< prev index next >

src/share/native/sun/font/layout/IndicRearrangementProcessor.cpp

Print this page
rev 1554 : 8158302: Handle contextual glyph substitutions
Reviewed-by: prr


  46   IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
  47   : StateTableProcessor(morphSubtableHeader, success),
  48   indicRearrangementSubtableHeader(morphSubtableHeader, success),
  49   entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader),
  50              entryTableOffset, LE_UNBOUNDED_ARRAY),
  51   int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY)
  52 
  53 {
  54 }
  55 
  56 IndicRearrangementProcessor::~IndicRearrangementProcessor()
  57 {
  58 }
  59 
  60 void IndicRearrangementProcessor::beginStateTable()
  61 {
  62     firstGlyph = 0;
  63     lastGlyph = 0;
  64 }
  65 
  66 ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index)
  67 {
  68   LEErrorCode success = LE_NO_ERROR; // todo- make a param?
  69   const IndicRearrangementStateEntry *entry = entryTable.getAlias(index,success);
  70     ByteOffset newState = SWAPW(entry->newStateOffset);
  71     IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
  72 
  73     if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
  74        success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
  75        return 0;
  76     }
  77 
  78     if (flags & irfMarkFirst) {
  79         firstGlyph = currGlyph;
  80     }
  81 
  82     if (flags & irfMarkLast) {
  83         lastGlyph = currGlyph;
  84     }
  85 
  86     doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
  87 
  88     if (!(flags & irfDontAdvance)) {
  89         // XXX: Should handle reverse too...




  46   IndicRearrangementProcessor::IndicRearrangementProcessor(const LEReferenceTo<MorphSubtableHeader> &morphSubtableHeader, LEErrorCode &success)
  47   : StateTableProcessor(morphSubtableHeader, success),
  48   indicRearrangementSubtableHeader(morphSubtableHeader, success),
  49   entryTable(stateTableHeader, success, (const IndicRearrangementStateEntry*)(&stateTableHeader->stHeader),
  50              entryTableOffset, LE_UNBOUNDED_ARRAY),
  51   int16Table(stateTableHeader, success, (const le_int16*)entryTable.getAlias(), 0, LE_UNBOUNDED_ARRAY)
  52 
  53 {
  54 }
  55 
  56 IndicRearrangementProcessor::~IndicRearrangementProcessor()
  57 {
  58 }
  59 
  60 void IndicRearrangementProcessor::beginStateTable()
  61 {
  62     firstGlyph = 0;
  63     lastGlyph = 0;
  64 }
  65 
  66 ByteOffset IndicRearrangementProcessor::processStateEntry(LEGlyphStorage &glyphStorage, le_int32 &currGlyph, EntryTableIndex index, LEErrorCode &success)
  67 {
  68     const IndicRearrangementStateEntry *entry = entryTable.getAlias(index, success);
  69     if (LE_FAILURE(success)) return 0;
  70     ByteOffset newState = SWAPW(entry->newStateOffset);
  71     IndicRearrangementFlags flags = (IndicRearrangementFlags) SWAPW(entry->flags);
  72 
  73     if (currGlyph < 0 || currGlyph >= glyphStorage.getGlyphCount()) {
  74        success = LE_INDEX_OUT_OF_BOUNDS_ERROR;
  75        return 0;
  76     }
  77 
  78     if (flags & irfMarkFirst) {
  79         firstGlyph = currGlyph;
  80     }
  81 
  82     if (flags & irfMarkLast) {
  83         lastGlyph = currGlyph;
  84     }
  85 
  86     doRearrangementAction(glyphStorage, (IndicRearrangementVerb) (flags & irfVerbMask), success);
  87 
  88     if (!(flags & irfDontAdvance)) {
  89         // XXX: Should handle reverse too...


< prev index next >