|  | /* | 
|  | * @(#)ThaiShaping.h	1.9 00/03/15 | 
|  | * | 
|  | * (C) Copyright IBM Corp. 1998, 1999, 2000 - All Rights Reserved | 
|  | * | 
|  | */ | 
|  |  | 
|  | #ifndef __THAISHAPING_H | 
|  | #define __THAISHAPING_H | 
|  |  | 
|  | #include "LETypes.h" | 
|  | #include "LEGlyphFilter.h" | 
|  | #include "OpenTypeTables.h" | 
|  |  | 
|  | U_NAMESPACE_BEGIN | 
|  |  | 
|  | class ThaiMarkFilter : public LEGlyphFilter | 
|  | { | 
|  | private: | 
|  | struct MarkRange | 
|  | { | 
|  | LEUnicode first; | 
|  | LEUnicode last; | 
|  | }; | 
|  |  | 
|  | MarkRange *rangeList; | 
|  |  | 
|  | public: | 
|  | ThaiMarkFilter(le_uint8 glyphSet); | 
|  | ~ThaiMarkFilter(); | 
|  |  | 
|  | virtual le_bool filter(LEGlyphID glyph); | 
|  | }; | 
|  |  | 
|  | class ThaiShaping | 
|  | { | 
|  | public: | 
|  |  | 
|  | enum { | 
|  | // Character classes | 
|  | NON	=  0, | 
|  | CON	=  1, | 
|  | COA	=  2, | 
|  | COD	=  3, | 
|  | LVO =  4, | 
|  | FV1	=  5, | 
|  | FV2	=  6, | 
|  | FV3	=  7, | 
|  | BV1	=  8, | 
|  | BV2	=  9, | 
|  | BDI = 10, | 
|  | TON	= 11, | 
|  | AD1	= 12, | 
|  | AD2	= 13, | 
|  | AD3	= 14, | 
|  | NIK	= 15, | 
|  | AV1	= 16, | 
|  | AV2	= 17, | 
|  | AV3	= 18, | 
|  | classCount = 19, | 
|  |  | 
|  | // State Transition actions | 
|  | _A  =  0, | 
|  | _C  =  1, | 
|  | _D  =  2, | 
|  | _E  =  3, | 
|  | _F  =  4, | 
|  | _G  =  5, | 
|  | _H  =  6, | 
|  | _R  =  7, | 
|  | _S  =  8 | 
|  | }; | 
|  |  | 
|  | struct StateTransition | 
|  | { | 
|  | le_uint8 nextState; | 
|  | le_uint8 action; | 
|  |  | 
|  | le_uint8 getNextState() { return nextState; }; | 
|  | le_uint8 getAction() { return action; }; | 
|  | }; | 
|  |  | 
|  | static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, | 
|  | LEUnicode errorChar, LEUnicode *output, le_int32 *charIndicies); | 
|  |  | 
|  | private: | 
|  |  | 
|  | static le_uint8 classTable[]; | 
|  | static StateTransition thaiStateTable[][classCount]; | 
|  | static StateTransition getTransition(le_uint8 state, le_uint8 currClass); | 
|  | static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, | 
|  | LEUnicode errorChar, LEUnicode *outputBuffer, le_int32 *charIndicies, le_int32 &outputIndex); | 
|  |  | 
|  | static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, | 
|  | le_uint8 &charClass, LEUnicode *output, le_int32 *charIndicies, le_int32 &outputIndex); | 
|  |  | 
|  | static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); | 
|  | static le_uint8 getCharClass(LEUnicode ch); | 
|  |  | 
|  | static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); | 
|  | static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); | 
|  | static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); | 
|  | static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); | 
|  | static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); | 
|  | static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); | 
|  |  | 
|  | }; | 
|  |  | 
|  | inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) | 
|  | { | 
|  | return thaiStateTable[state][currClass]; | 
|  | } | 
|  |  | 
|  | U_NAMESPACE_END | 
|  | #endif | 
|  |  | 
|  |  |