2013-02-06 07:01:19 +00:00
/*
*
* ( C ) Copyright IBM Corp . and others 1998 - 2013 - All Rights Reserved
*
*/
# include "LETypes.h"
# include "MorphTables.h"
# include "SubtableProcessor2.h"
# include "NonContextualGlyphSubst.h"
# include "NonContextualGlyphSubstProc2.h"
# include "SegmentArrayProcessor2.h"
# include "LEGlyphStorage.h"
# include "LESwaps.h"
U_NAMESPACE_BEGIN
UOBJECT_DEFINE_RTTI_IMPLEMENTATION ( SegmentArrayProcessor2 )
SegmentArrayProcessor2 : : SegmentArrayProcessor2 ( )
{
}
2013-04-18 21:24:51 +00:00
SegmentArrayProcessor2 : : SegmentArrayProcessor2 ( const LEReferenceTo < MorphSubtableHeader2 > & morphSubtableHeader , LEErrorCode & success )
: NonContextualGlyphSubstitutionProcessor2 ( morphSubtableHeader , success )
2013-02-06 07:01:19 +00:00
{
2013-04-18 21:24:51 +00:00
const LEReferenceTo < NonContextualGlyphSubstitutionHeader2 > header ( morphSubtableHeader , success ) ;
segmentArrayLookupTable = LEReferenceTo < SegmentArrayLookupTable > ( morphSubtableHeader , success , & header - > table ) ; // don't parent to 'header' as it is on the stack
2013-02-06 07:01:19 +00:00
}
SegmentArrayProcessor2 : : ~ SegmentArrayProcessor2 ( )
{
}
2013-04-18 21:24:51 +00:00
void SegmentArrayProcessor2 : : process ( LEGlyphStorage & glyphStorage , LEErrorCode & success )
2013-02-06 07:01:19 +00:00
{
const LookupSegment * segments = segmentArrayLookupTable - > segments ;
le_int32 glyphCount = glyphStorage . getGlyphCount ( ) ;
le_int32 glyph ;
for ( glyph = 0 ; glyph < glyphCount ; glyph + = 1 ) {
LEGlyphID thisGlyph = glyphStorage [ glyph ] ;
2013-04-18 21:24:51 +00:00
const LookupSegment * lookupSegment = segmentArrayLookupTable - > lookupSegment ( segmentArrayLookupTable , segments , thisGlyph , success ) ;
2013-02-06 07:01:19 +00:00
if ( lookupSegment ! = NULL ) {
TTGlyphID firstGlyph = SWAPW ( lookupSegment - > firstGlyph ) ;
le_int16 offset = SWAPW ( lookupSegment - > value ) ;
if ( offset ! = 0 ) {
2013-04-18 21:24:51 +00:00
TTGlyphID * glyphArray = ( TTGlyphID * ) ( ( char * ) subtableHeader . getAliasRAW ( ) + offset ) ;
2013-02-06 07:01:19 +00:00
TTGlyphID newGlyph = SWAPW ( glyphArray [ LE_GET_GLYPH ( thisGlyph ) - firstGlyph ] ) ;
glyphStorage [ glyph ] = LE_SET_GLYPH ( thisGlyph , newGlyph ) ;
}
}
}
}
U_NAMESPACE_END