]> git.saurik.com Git - apple/icu.git/blob - icuSources/layout/StateTables.h
ICU-531.48.tar.gz
[apple/icu.git] / icuSources / layout / StateTables.h
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