• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1  /*
2   *
3   * (C) Copyright IBM Corp. and others 1998-2013 - All Rights Reserved
4   *
5   */
6  
7  #ifndef __STATETABLES_H
8  #define __STATETABLES_H
9  
10  /**
11   * \file
12   * \internal
13   */
14  
15  #include "LETypes.h"
16  #include "LayoutTables.h"
17  
18  U_NAMESPACE_BEGIN
19  
20  
21  
22  
23  /*
24   * State table loop detection.
25   * Detects if too many ( LE_STATE_PATIENCE_COUNT ) state changes occur without moving the glyph index 'g'.
26   *
27   * Usage (pseudocode):
28   *
29   * {
30   *   LE_STATE_PATIENCE_INIT();
31   *
32   *   int g=0; // the glyph index - expect it to be moving
33   *
34   *   for(;;) {
35   *     if(LE_STATE_PATIENCE_DECR()) { // decrements the patience counter
36   *        // ran out of patience, get out.
37   *        break;
38   *     }
39   *
40   *     LE_STATE_PATIENCE_CURR(int, g); // store the 'current'
41   *     state = newState(state,g);
42   *     g+= <something, could be zero>;
43   *     LE_STATE_PATIENCE_INCR(g);  // if g has moved, increment the patience counter. Otherwise leave it.
44   *   }
45   *
46   */
47  
48  #define LE_STATE_PATIENCE_COUNT 4096 /**< give up if a state table doesn't move the glyph after this many iterations */
49  #define LE_STATE_PATIENCE_INIT()  le_uint32 le_patience_count = LE_STATE_PATIENCE_COUNT
50  #define LE_STATE_PATIENCE_DECR()  --le_patience_count==0
51  #define LE_STATE_PATIENCE_CURR(type,x)  type le_patience_curr=(x)
52  #define LE_STATE_PATIENCE_INCR(x)    if((x)!=le_patience_curr) ++le_patience_count;
53  
54  
55  struct StateTableHeader
56  {
57      le_int16 stateSize;
58      ByteOffset classTableOffset;
59      ByteOffset stateArrayOffset;
60      ByteOffset entryTableOffset;
61  };
62  
63  struct StateTableHeader2
64  {
65      le_uint32 nClasses;
66      le_uint32 classTableOffset;
67      le_uint32 stateArrayOffset;
68      le_uint32 entryTableOffset;
69  };
70  
71  enum ClassCodes
72  {
73      classCodeEOT = 0,
74      classCodeOOB = 1,
75      classCodeDEL = 2,
76      classCodeEOL = 3,
77      classCodeFirstFree = 4,
78      classCodeMAX = 0xFF
79  };
80  
81  typedef le_uint8 ClassCode;
82  
83  struct ClassTable
84  {
85      TTGlyphID firstGlyph;
86      le_uint16 nGlyphs;
87      ClassCode classArray[ANY_NUMBER];
88  };
89  LE_VAR_ARRAY(ClassTable, classArray)
90  
91  enum StateNumber
92  {
93      stateSOT        = 0,
94      stateSOL        = 1,
95      stateFirstFree  = 2,
96      stateMAX        = 0xFF
97  };
98  
99  typedef le_uint8 EntryTableIndex;
100  
101  struct StateEntry
102  {
103      ByteOffset  newStateOffset;
104      le_int16    flags;
105  };
106  
107  typedef le_uint16 EntryTableIndex2;
108  
109  struct StateEntry2 // same struct different interpretation
110  {
111      le_uint16    newStateIndex;
112      le_uint16    flags;
113  };
114  
115  U_NAMESPACE_END
116  #endif
117  
118