1 /*
   2  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   3  *
   4  * This code is free software; you can redistribute it and/or modify it
   5  * under the terms of the GNU General Public License version 2 only, as
   6  * published by the Free Software Foundation.  Oracle designates this
   7  * particular file as subject to the "Classpath" exception as provided
   8  * by Oracle in the LICENSE file that accompanied this code.
   9  *
  10  * This code is distributed in the hope that it will be useful, but WITHOUT
  11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  13  * version 2 for more details (a copy is included in the LICENSE file that
  14  * accompanied this code).
  15  *
  16  * You should have received a copy of the GNU General Public License version
  17  * 2 along with this work; if not, write to the Free Software Foundation,
  18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  19  *
  20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  21  * or visit www.oracle.com if you need additional information or have any
  22  * questions.
  23  *
  24  */
  25 
  26 /*
  27  *
  28  * (C) Copyright IBM Corp. 1998-2005 - All Rights Reserved
  29  *
  30  */
  31 
  32 #ifndef __THAISHAPING_H
  33 #define __THAISHAPING_H
  34 
  35 /**
  36  * \file
  37  * \internal
  38  */
  39 
  40 #include "LETypes.h"
  41 #include "LEGlyphFilter.h"
  42 #include "OpenTypeTables.h"
  43 
  44 U_NAMESPACE_BEGIN
  45 
  46 class LEGlyphStorage;
  47 
  48 class ThaiShaping /* not : public UObject because all methods are static */ {
  49 public:
  50 
  51     enum {
  52         // Character classes
  53         NON =  0,
  54         CON =  1,
  55         COA =  2,
  56         COD =  3,
  57         LVO =  4,
  58         FV1 =  5,
  59         FV2 =  6,
  60         FV3 =  7,
  61         BV1 =  8,
  62         BV2 =  9,
  63         BDI = 10,
  64         TON = 11,
  65         AD1 = 12,
  66         AD2 = 13,
  67         AD3 = 14,
  68         NIK = 15,
  69         AV1 = 16,
  70         AV2 = 17,
  71         AV3 = 18,
  72         classCount = 19,
  73 
  74         // State Transition actions
  75         tA  =  0,
  76         tC  =  1,
  77         tD  =  2,
  78         tE  =  3,
  79         tF  =  4,
  80         tG  =  5,
  81         tH  =  6,
  82         tR  =  7,
  83         tS  =  8
  84     };
  85 
  86     struct StateTransition
  87     {
  88         le_uint8 nextState;
  89         le_uint8 action;
  90 
  91         le_uint8 getNextState() { return nextState; };
  92         le_uint8 getAction() { return action; };
  93     };
  94 
  95     static le_int32 compose(const LEUnicode *input, le_int32 offset, le_int32 charCount, le_uint8 glyphSet,
  96         LEUnicode errorChar, LEUnicode *output, LEGlyphStorage &glyphStorage);
  97 
  98 private:
  99     // forbid instantiation
 100     ThaiShaping();
 101 
 102     static const le_uint8 classTable[];
 103     static const StateTransition thaiStateTable[][classCount];
 104 
 105     inline static StateTransition getTransition(le_uint8 state, le_uint8 currClass);
 106 
 107     static le_uint8 doTransition(StateTransition transition, LEUnicode currChar, le_int32 inputIndex, le_uint8 glyphSet,
 108         LEUnicode errorChar, LEUnicode *outputBuffer, LEGlyphStorage &glyphStorage, le_int32 &outputIndex);
 109 
 110     static le_uint8 getNextState(LEUnicode ch, le_uint8 state, le_int32 inputIndex, le_uint8 glyphSet, LEUnicode errorChar,
 111         le_uint8 &charClass, LEUnicode *output, LEGlyphStorage &glyphStorage, le_int32 &outputIndex);
 112 
 113     static le_bool isLegalHere(LEUnicode ch, le_uint8 prevState);
 114     static le_uint8 getCharClass(LEUnicode ch);
 115 
 116     static LEUnicode noDescenderCOD(LEUnicode cod, le_uint8 glyphSet);
 117     static LEUnicode leftAboveVowel(LEUnicode vowel, le_uint8 glyphSet);
 118     static LEUnicode lowerBelowVowel(LEUnicode vowel, le_uint8 glyphSet);
 119     static LEUnicode lowerRightTone(LEUnicode tone, le_uint8 glyphSet);
 120     static LEUnicode lowerLeftTone(LEUnicode tone, le_uint8 glyphSet);
 121     static LEUnicode upperLeftTone(LEUnicode tone, le_uint8 glyphSet);
 122 
 123 };
 124 
 125 inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass)
 126 {
 127     return thaiStateTable[state][currClass];
 128 }
 129 
 130 U_NAMESPACE_END
 131 #endif