1/* 2 * 3 * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved 4 * 5 */ 6 7#ifndef __THAISHAPING_H 8#define __THAISHAPING_H 9 10/** 11 * \file 12 * \internal 13 */ 14 15#include "LETypes.h" 16#include "LEGlyphFilter.h" 17#include "OpenTypeTables.h" 18 19U_NAMESPACE_BEGIN 20 21class LEGlyphStorage; 22 23class ThaiShaping /* not : public UObject because all methods are static */ { 24public: 25 26 enum { 27 // Character classes 28 NON = 0, 29 CON = 1, 30 COA = 2, 31 COD = 3, 32 LVO = 4, 33 FV1 = 5, 34 FV2 = 6, 35 FV3 = 7, 36 BV1 = 8, 37 BV2 = 9, 38 BDI = 10, 39 TON = 11, 40 AD1 = 12, 41 AD2 = 13, 42 AD3 = 14, 43 NIK = 15, 44 AV1 = 16, 45 AV2 = 17, 46 AV3 = 18, 47 classCount = 19, 48 49 // State Transition actions 50 tA = 0, 51 tC = 1, 52 tD = 2, 53 tE = 3, 54 tF = 4, 55 tG = 5, 56 tH = 6, 57 tR = 7, 58 tS = 8 59 }; 60 61 struct StateTransition 62 { 63 le_uint8 nextState; 64 le_uint8 action; 65 66 le_uint8 getNextState() { return nextState; }; 67 le_uint8 getAction() { return action; }; 68 }; 69 70 static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet, 71 LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage); 72 73private: 74 // forbid instantiation 75 ThaiShaping(); 76 77 static const le_uint8 classTable[]; 78 static const StateTransition thaiStateTable[][classCount]; 79 80 inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass); 81 82 static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet, 83 LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); 84 85 static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar, 86 le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex); 87 88 static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState); 89 static le_uint8 getCharClass(LEUnicode ch); 90 91 static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet); 92 static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet); 93 static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet); 94 static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet); 95 static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet); 96 static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet); 97 98}; 99 100inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass) 101{ 102 return thaiStateTable[state][currClass]; 103} 104 105U_NAMESPACE_END 106#endif 107 108 109