os/textandloc/fontservices/textshaperplugin/IcuSource/layout/ThaiShaping.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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 
    19 U_NAMESPACE_BEGIN
    20 
    21 class LEGlyphStorage;
    22 
    23 class ThaiShaping /* not : public UObject because all methods are static */ {
    24 public:
    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 
    73 private:
    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 
   100 inline ThaiShaping::StateTransition ThaiShaping::getTransition(le_uint8 state, le_uint8 currClass)
   101 {
   102     return thaiStateTable[state][currClass];
   103 }
   104 
   105 U_NAMESPACE_END
   106 #endif
   107 
   108