sl@0: /* sl@0: * sl@0: * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved sl@0: * sl@0: */ sl@0: sl@0: #ifndef __THAISHAPING_H sl@0: #define __THAISHAPING_H sl@0: sl@0: /** sl@0: * \file sl@0: * \internal sl@0: */ sl@0: sl@0: #include "LETypes.h" sl@0: #include "LEGlyphFilter.h" sl@0: #include "OpenTypeTables.h" sl@0: sl@0: U_NAMESPACE_BEGIN sl@0: sl@0: class LEGlyphStorage; sl@0: sl@0: class ThaiShaping /* not : public UObject because all methods are static */ { sl@0: public: sl@0: sl@0: enum { sl@0: // Character classes sl@0: NON = 0, sl@0: CON = 1, sl@0: COA = 2, sl@0: COD = 3, sl@0: LVO = 4, sl@0: FV1 = 5, sl@0: FV2 = 6, sl@0: FV3 = 7, sl@0: BV1 = 8, sl@0: BV2 = 9, sl@0: BDI = 10, sl@0: TON = 11, sl@0: AD1 = 12, sl@0: AD2 = 13, sl@0: AD3 = 14, sl@0: NIK = 15, sl@0: AV1 = 16, sl@0: AV2 = 17, sl@0: AV3 = 18, sl@0: classCount = 19, sl@0: sl@0: // State Transition actions sl@0: tA = 0, sl@0: tC = 1, sl@0: tD = 2, sl@0: tE = 3, sl@0: tF = 4, sl@0: tG = 5, sl@0: tH = 6, sl@0: tR = 7, sl@0: tS = 8 sl@0: }; sl@0: sl@0: struct StateTransition sl@0: { sl@0: le_uint8 nextState; sl@0: le_uint8 action; sl@0: sl@0: le_uint8 getNextState() { return nextState; }; sl@0: le_uint8 getAction() { return action; }; sl@0: }; sl@0: sl@0: static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, sl@0: LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); sl@0: sl@0: private: sl@0: // forbid instantiation sl@0: ThaiShaping(); sl@0: sl@0: static const le_uint8 classTable[]; sl@0: static const StateTransition thaiStateTable[][classCount]; sl@0: sl@0: inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass); sl@0: sl@0: static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, sl@0: LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); sl@0: sl@0: static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, sl@0: le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); sl@0: sl@0: static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); sl@0: static le_uint8 getCharClass(LEUnicode ch); sl@0: sl@0: static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); sl@0: static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); sl@0: static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); sl@0: static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); sl@0: static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); sl@0: static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); sl@0: sl@0: }; sl@0: sl@0: inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) sl@0: { sl@0: return thaiStateTable[state][currClass]; sl@0: } sl@0: sl@0: U_NAMESPACE_END sl@0: #endif sl@0: sl@0: