xref: /inferno-os/libfreetype/otlayout.h (revision 37da2899f40661e3e9631e497da8dc59b971cbd0)
1*37da2899SCharles.Forsyth #ifndef __OT_LAYOUT_H__
2*37da2899SCharles.Forsyth #define __OT_LAYOUT_H__
3*37da2899SCharles.Forsyth 
4*37da2899SCharles.Forsyth 
5*37da2899SCharles.Forsyth #include "otlconf.h"
6*37da2899SCharles.Forsyth 
7*37da2899SCharles.Forsyth OTL_BEGIN_HEADER
8*37da2899SCharles.Forsyth 
9*37da2899SCharles.Forsyth  /************************************************************************/
10*37da2899SCharles.Forsyth  /************************************************************************/
11*37da2899SCharles.Forsyth  /*****                                                              *****/
12*37da2899SCharles.Forsyth  /*****                       BASE DATA TYPES                        *****/
13*37da2899SCharles.Forsyth  /*****                                                              *****/
14*37da2899SCharles.Forsyth  /************************************************************************/
15*37da2899SCharles.Forsyth  /************************************************************************/
16*37da2899SCharles.Forsyth 
17*37da2899SCharles.Forsyth   typedef unsigned char     OTL_Byte;
18*37da2899SCharles.Forsyth   typedef const OTL_Byte*   OTL_Bytes;
19*37da2899SCharles.Forsyth 
20*37da2899SCharles.Forsyth   typedef int               OTL_Error;
21*37da2899SCharles.Forsyth 
22*37da2899SCharles.Forsyth   typedef void*             OTL_Pointer;
23*37da2899SCharles.Forsyth 
24*37da2899SCharles.Forsyth   typedef int               OTL_Int;
25*37da2899SCharles.Forsyth   typedef unsigned int      OTL_UInt;
26*37da2899SCharles.Forsyth 
27*37da2899SCharles.Forsyth   typedef long              OTL_Long;
28*37da2899SCharles.Forsyth   typedef unsigned long     OTL_ULong;
29*37da2899SCharles.Forsyth 
30*37da2899SCharles.Forsyth   typedef short             OTL_Int16;
31*37da2899SCharles.Forsyth   typedef unsigned short    OTL_UInt16;
32*37da2899SCharles.Forsyth 
33*37da2899SCharles.Forsyth 
34*37da2899SCharles.Forsyth #if OTL_SIZEOF_INT == 4
35*37da2899SCharles.Forsyth 
36*37da2899SCharles.Forsyth   typedef int               OTL_Int32;
37*37da2899SCharles.Forsyth   typedef unsigned int      OTL_UInt32;
38*37da2899SCharles.Forsyth 
39*37da2899SCharles.Forsyth #elif OTL_SIZEOF_LONG == 4
40*37da2899SCharles.Forsyth 
41*37da2899SCharles.Forsyth   typedef long              OTL_Int32;
42*37da2899SCharles.Forsyth   typedef unsigned long     OTL_UInt32;
43*37da2899SCharles.Forsyth 
44*37da2899SCharles.Forsyth #else
45*37da2899SCharles.Forsyth #  error "no 32-bits type found"
46*37da2899SCharles.Forsyth #endif
47*37da2899SCharles.Forsyth 
48*37da2899SCharles.Forsyth   typedef OTL_UInt32        OTL_Tag;
49*37da2899SCharles.Forsyth 
50*37da2899SCharles.Forsyth  /************************************************************************/
51*37da2899SCharles.Forsyth  /************************************************************************/
52*37da2899SCharles.Forsyth  /*****                                                              *****/
53*37da2899SCharles.Forsyth  /*****                       ERROR CODES                            *****/
54*37da2899SCharles.Forsyth  /*****                                                              *****/
55*37da2899SCharles.Forsyth  /************************************************************************/
56*37da2899SCharles.Forsyth  /************************************************************************/
57*37da2899SCharles.Forsyth 
58*37da2899SCharles.Forsyth   typedef enum
59*37da2899SCharles.Forsyth   {
60*37da2899SCharles.Forsyth     OTL_Err_Ok = 0,
61*37da2899SCharles.Forsyth     OTL_Err_InvalidArgument,
62*37da2899SCharles.Forsyth     OTL_Err_InvalidFormat,
63*37da2899SCharles.Forsyth     OTL_Err_InvalidOffset,
64*37da2899SCharles.Forsyth 
65*37da2899SCharles.Forsyth     OTL_Err_Max
66*37da2899SCharles.Forsyth 
67*37da2899SCharles.Forsyth   } OTL_Error;
68*37da2899SCharles.Forsyth 
69*37da2899SCharles.Forsyth 
70*37da2899SCharles.Forsyth  /************************************************************************/
71*37da2899SCharles.Forsyth  /************************************************************************/
72*37da2899SCharles.Forsyth  /*****                                                              *****/
73*37da2899SCharles.Forsyth  /*****                     MEMORY MANAGEMENT                        *****/
74*37da2899SCharles.Forsyth  /*****                                                              *****/
75*37da2899SCharles.Forsyth  /************************************************************************/
76*37da2899SCharles.Forsyth  /************************************************************************/
77*37da2899SCharles.Forsyth 
78*37da2899SCharles.Forsyth   typedef OTL_Pointer  (*OTL_AllocFunc)( OTL_ULong    size,
79*37da2899SCharles.Forsyth                                          OTL_Pointer  data );
80*37da2899SCharles.Forsyth 
81*37da2899SCharles.Forsyth   typedef OTL_Pointer  (*OTL_ReallocFunc)( OTL_Pointer   block,
82*37da2899SCharles.Forsyth                                            OTL_ULong     size,
83*37da2899SCharles.Forsyth                                            OTL_Pointer   data );
84*37da2899SCharles.Forsyth 
85*37da2899SCharles.Forsyth   typedef void         (*OTL_FreeFunc)( OTL_Pointer  block,
86*37da2899SCharles.Forsyth                                         OTL_Pointer  data );
87*37da2899SCharles.Forsyth 
88*37da2899SCharles.Forsyth   typedef struct OTL_MemoryRec_
89*37da2899SCharles.Forsyth   {
90*37da2899SCharles.Forsyth     OTL_Pointer      mem_data;
91*37da2899SCharles.Forsyth     OTL_AllocFunc    mem_alloc;
92*37da2899SCharles.Forsyth     OTL_ReallocFunc  mem_realloc;
93*37da2899SCharles.Forsyth     OTL_FreeFunc     mem_free;
94*37da2899SCharles.Forsyth 
95*37da2899SCharles.Forsyth   } OTL_MemoryRec, *OTL_Memory;
96*37da2899SCharles.Forsyth 
97*37da2899SCharles.Forsyth  /************************************************************************/
98*37da2899SCharles.Forsyth  /************************************************************************/
99*37da2899SCharles.Forsyth  /*****                                                              *****/
100*37da2899SCharles.Forsyth  /*****                        ENUMERATIONS                          *****/
101*37da2899SCharles.Forsyth  /*****                                                              *****/
102*37da2899SCharles.Forsyth  /************************************************************************/
103*37da2899SCharles.Forsyth  /************************************************************************/
104*37da2899SCharles.Forsyth 
105*37da2899SCharles.Forsyth /* re-define OTL_MAKE_TAG to something different if you're not */
106*37da2899SCharles.Forsyth /* using an ASCII-based character set (Vaxes anyone ?)         */
107*37da2899SCharles.Forsyth #ifndef  OTL_MAKE_TAG
108*37da2899SCharles.Forsyth #define  OTL_MAKE_TAG(c1,c2,c3,c4)         \
109*37da2899SCharles.Forsyth            ( ( (OTL_UInt32)(c1) << 24 ) |  \
110*37da2899SCharles.Forsyth                (OTL_UInt32)(c2) << 16 ) |  \
111*37da2899SCharles.Forsyth                (OTL_UInt32)(c3) <<  8 ) |  \
112*37da2899SCharles.Forsyth                (OTL_UInt32)(c4)         )
113*37da2899SCharles.Forsyth #endif
114*37da2899SCharles.Forsyth 
115*37da2899SCharles.Forsyth   typedef enum OTL_ScriptTag_
116*37da2899SCharles.Forsyth   {
117*37da2899SCharles.Forsyth     OTL_SCRIPT_NONE = 0,
118*37da2899SCharles.Forsyth 
119*37da2899SCharles.Forsyth #define OTL_SCRIPT_TAG(c1,c2,c3,c4,s,n)  OTL_SCRIPT_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4),
120*37da2899SCharles.Forsyth #include "otltags.h"
121*37da2899SCharles.Forsyth 
122*37da2899SCharles.Forsyth     OTL_SCRIPT_MAX
123*37da2899SCharles.Forsyth 
124*37da2899SCharles.Forsyth   } OTL_ScriptTag;
125*37da2899SCharles.Forsyth 
126*37da2899SCharles.Forsyth 
127*37da2899SCharles.Forsyth   typedef enum OTL_LangTag_
128*37da2899SCharles.Forsyth   {
129*37da2899SCharles.Forsyth     OTL_LANG_DEFAULT = 0,
130*37da2899SCharles.Forsyth 
131*37da2899SCharles.Forsyth #define OTL_LANG_TAG(c1,c2,c3,c4,s,n)  OTL_LANG_TAG_ ## n = OTL_MAKE_TAG(c1,c2,c3,c4),
132*37da2899SCharles.Forsyth #include "otltags.h"
133*37da2899SCharles.Forsyth 
134*37da2899SCharles.Forsyth     OTL_LANG_MAX
135*37da2899SCharles.Forsyth 
136*37da2899SCharles.Forsyth   } OTL_LangTag;
137*37da2899SCharles.Forsyth 
138*37da2899SCharles.Forsyth 
139*37da2899SCharles.Forsyth  /************************************************************************/
140*37da2899SCharles.Forsyth  /************************************************************************/
141*37da2899SCharles.Forsyth  /*****                                                              *****/
142*37da2899SCharles.Forsyth  /*****                       MEMORY READS                           *****/
143*37da2899SCharles.Forsyth  /*****                                                              *****/
144*37da2899SCharles.Forsyth  /************************************************************************/
145*37da2899SCharles.Forsyth  /************************************************************************/
146*37da2899SCharles.Forsyth 
147*37da2899SCharles.Forsyth #define  OTL_PEEK_USHORT(p)  ( ((OTL_UInt)((p)[0]) << 8) |  \
148*37da2899SCharles.Forsyth                                ((OTL_UInt)((p)[1])     ) )
149*37da2899SCharles.Forsyth 
150*37da2899SCharles.Forsyth #define  OTL_PEEK_ULONG(p)   ( ((OTL_UInt32)((p)[0]) << 24) |  \
151*37da2899SCharles.Forsyth                                ((OTL_UInt32)((p)[1]) << 16) |  \
152*37da2899SCharles.Forsyth                                ((OTL_UInt32)((p)[2]) <<  8) |  \
153*37da2899SCharles.Forsyth                                ((OTL_UInt32)((p)[3])      ) )
154*37da2899SCharles.Forsyth 
155*37da2899SCharles.Forsyth #define  OTL_PEEK_SHORT(p)     ((OTL_Int16)OTL_PEEK_USHORT(p))
156*37da2899SCharles.Forsyth 
157*37da2899SCharles.Forsyth #define  OTL_PEEK_LONG(p)      ((OTL_Int32)OTL_PEEK_ULONG(p))
158*37da2899SCharles.Forsyth 
159*37da2899SCharles.Forsyth #define  OTL_NEXT_USHORT(p)  ( (p) += 2, OTL_PEEK_USHORT((p)-2) )
160*37da2899SCharles.Forsyth #define  OTL_NEXT_ULONG(p)   ( (p) += 4, OTL_PEEK_ULONG((p)-4) )
161*37da2899SCharles.Forsyth 
162*37da2899SCharles.Forsyth #define  OTL_NEXT_SHORT(p)   ((OTL_Int16)OTL_NEXT_USHORT(p))
163*37da2899SCharles.Forsyth #define  OTL_NEXT_LONG(p)    ((OTL_Int32)OTL_NEXT_ULONG(p))
164*37da2899SCharles.Forsyth 
165*37da2899SCharles.Forsyth  /************************************************************************/
166*37da2899SCharles.Forsyth  /************************************************************************/
167*37da2899SCharles.Forsyth  /*****                                                              *****/
168*37da2899SCharles.Forsyth  /*****                        VALIDATION                            *****/
169*37da2899SCharles.Forsyth  /*****                                                              *****/
170*37da2899SCharles.Forsyth  /************************************************************************/
171*37da2899SCharles.Forsyth  /************************************************************************/
172*37da2899SCharles.Forsyth 
173*37da2899SCharles.Forsyth   typedef struct OTL_ValidatorRec_*  OTL_Validator;
174*37da2899SCharles.Forsyth 
175*37da2899SCharles.Forsyth   typedef struct OTL_ValidatorRec_
176*37da2899SCharles.Forsyth   {
177*37da2899SCharles.Forsyth     OTL_Bytes    limit;
178*37da2899SCharles.Forsyth     OTL_Bytes    base;
179*37da2899SCharles.Forsyth     OTL_Error    error;
180*37da2899SCharles.Forsyth     OTL_jmp_buf  jump_buffer;
181*37da2899SCharles.Forsyth 
182*37da2899SCharles.Forsyth   } OTL_ValidatorRec;
183*37da2899SCharles.Forsyth 
184*37da2899SCharles.Forsyth   typedef void  (*OTL_ValidateFunc)( OTL_Bytes  table,
185*37da2899SCharles.Forsyth                                      OTL_Valid  valid );
186*37da2899SCharles.Forsyth 
187*37da2899SCharles.Forsyth   OTL_API( void )
188*37da2899SCharles.Forsyth   otl_validator_error( OTL_Validator  validator,
189*37da2899SCharles.Forsyth                        OTL_Error      error );
190*37da2899SCharles.Forsyth 
191*37da2899SCharles.Forsyth #define  OTL_INVALID(e)  otl_validator_error( valid, e )
192*37da2899SCharles.Forsyth 
193*37da2899SCharles.Forsyth #define  OTL_INVALID_TOO_SHORT  OTL_INVALID( OTL_Err_InvalidOffset )
194*37da2899SCharles.Forsyth #define  OTL_INVALID_DATA       OTL_INVALID( OTL_Err_InvalidFormat )
195*37da2899SCharles.Forsyth 
196*37da2899SCharles.Forsyth #define  OTL_CHECK(_count)   OTL_BEGIN_STMNT                       \
197*37da2899SCharles.Forsyth                                if ( p + (_count) > valid->limit )  \
198*37da2899SCharles.Forsyth                                  OTL_INVALID_TOO_SHORT;            \
199*37da2899SCharles.Forsyth                              OTL_END_STMNT
200*37da2899SCharles.Forsyth 
201*37da2899SCharles.Forsyth  /* */
202*37da2899SCharles.Forsyth 
203*37da2899SCharles.Forsyth OTL_END_HEADER
204*37da2899SCharles.Forsyth 
205*37da2899SCharles.Forsyth #endif /* __OPENTYPE_LAYOUT_H__ */
206