Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5496 | leency | 1 | /******************************************************************* |
2 | * |
||
3 | * ttextend.h 2.0 |
||
4 | * |
||
5 | * Extensions Interface. |
||
6 | * |
||
7 | * Copyright 1996-1999 by |
||
8 | * David Turner, Robert Wilhelm, and Werner Lemberg. |
||
9 | * |
||
10 | * This file is part of the FreeType project, and may only be used |
||
11 | * modified and distributed under the terms of the FreeType project |
||
12 | * license, LICENSE.TXT. By continuing to use, modify, or distribute |
||
13 | * this file you indicate that you have read the license and |
||
14 | * understand and accept it fully. |
||
15 | * |
||
16 | * This is an updated version of the extension component, now |
||
17 | * located in the main library's source directory. It allows |
||
18 | * the dynamic registration/use of various face object extensions |
||
19 | * through a simple API. |
||
20 | * |
||
21 | ******************************************************************/ |
||
22 | |||
23 | #ifndef TTEXTEND_H |
||
24 | #define TTEXTEND_H |
||
25 | |||
26 | #include "ttconfig.h" |
||
27 | #include "tttypes.h" |
||
28 | #include "ttobjs.h" |
||
29 | |||
30 | |||
31 | #ifdef __cplusplus |
||
32 | extern "C" { |
||
33 | #endif |
||
34 | |||
35 | /* The extensions don't need to be integrated at compile time into */ |
||
36 | /* the engine, only at link time. */ |
||
37 | |||
38 | |||
39 | /* When a new face object is created, the face constructor calls */ |
||
40 | /* the extension constructor with the following arguments: */ |
||
41 | /* */ |
||
42 | /* ext : typeless pointer to the face's extension block. */ |
||
43 | /* Its size is the one given at registration time */ |
||
44 | /* in the extension class's 'size' field. */ |
||
45 | /* */ |
||
46 | /* face : the parent face object. Note that the extension */ |
||
47 | /* constructor is called when the face object is */ |
||
48 | /* built. */ |
||
49 | |||
50 | typedef TT_Error TExt_Constructor( void* ext, PFace face ); |
||
51 | |||
52 | |||
53 | /* When a face object is destroyed, the face destructor calls */ |
||
54 | /* the extension destructor with the following arguments. */ |
||
55 | /* */ |
||
56 | /* ext : typeless pointer to the face's extension block. */ |
||
57 | /* Its size is the one given at registration time */ |
||
58 | /* in the extension class's 'size' field. */ |
||
59 | /* */ |
||
60 | /* face : the parent face object. Note that the extension */ |
||
61 | /* destructor is called before the actual face object */ |
||
62 | /* is destroyed. */ |
||
63 | |||
64 | typedef TT_Error TExt_Destructor ( void* ext, PFace face ); |
||
65 | |||
66 | typedef TExt_Constructor* PExt_Constructor; |
||
67 | typedef TExt_Destructor* PExt_Destructor; |
||
68 | |||
69 | |||
70 | struct TExtension_Class_ |
||
71 | { |
||
72 | Long id; /* extension id */ |
||
73 | Long size; /* size in bytes of extension record */ |
||
74 | PExt_Constructor build; /* the extension's class constructor */ |
||
75 | PExt_Destructor destroy; /* the extension's class destructor */ |
||
76 | |||
77 | Long offset; /* offset of ext. record in face obj */ |
||
78 | /* (set by the engine) */ |
||
79 | }; |
||
80 | |||
81 | typedef struct TExtension_Class_ TExtension_Class; |
||
82 | typedef TExtension_Class* PExtension_Class; |
||
83 | |||
84 | |||
85 | #define Build_Extension_ID( a, b, c, d ) \ |
||
86 | ( ((ULong)(a) << 24) | \ |
||
87 | ((ULong)(b) << 16) | \ |
||
88 | ((ULong)(c) << 8 ) | \ |
||
89 | (ULong)(d) ) |
||
90 | |||
91 | /* A note regarding extensions and the single-object compilation */ |
||
92 | /* mode : */ |
||
93 | /* */ |
||
94 | /* When the engine is compiled as a single object file, extensions */ |
||
95 | /* must remain linkable *after* compile time. In order to do this, */ |
||
96 | /* we need to export the functions that an extension may need. */ |
||
97 | /* Fortunately, we can limit ourselves to : */ |
||
98 | /* */ |
||
99 | /* o TT_Register_Extension (previously called Extension_Register) */ |
||
100 | /* which is to be called by each extension on within */ |
||
101 | /* it TT_Init_XXXX_Extension initializer. */ |
||
102 | /* */ |
||
103 | /* o File and frame access functions. Fortunately, these already */ |
||
104 | /* have their names prefixed by "TT_", so no change was needed */ |
||
105 | /* except replacing the LOCAL_DEF keyword with EXPORT_DEF */ |
||
106 | /* */ |
||
107 | /* o Memory access functions, i.e. TT_Alloc and TT_Free. Again, */ |
||
108 | /* the change is minimal */ |
||
109 | /* */ |
||
110 | /* o the table-lookup function : TT_LookUp_Table, formerly known */ |
||
111 | /* as Load_TrueType_Table in ttload.c. */ |
||
112 | /* */ |
||
113 | /* */ |
||
114 | /* Other than that, an extension should be able to #include all */ |
||
115 | /* relevant header files to get access to internal types, but */ |
||
116 | /* should not call engine internal functions.. */ |
||
117 | /* */ |
||
118 | /* If there is a need for a specific internal function call, let */ |
||
119 | /* me known to see if we need to export it by default.. */ |
||
120 | /* - DavidT */ |
||
121 | /* */ |
||
122 | |||
123 | /* Register a new extension. Called by extension */ |
||
124 | /* service initializers. */ |
||
125 | EXPORT_DEF |
||
126 | TT_Error TT_Register_Extension( PEngine_Instance engine, |
||
127 | Long id, |
||
128 | Long size, |
||
129 | PExt_Constructor create, |
||
130 | PExt_Destructor destroy ); |
||
131 | |||
132 | |||
133 | #ifdef TT_CONFIG_OPTION_EXTEND_ENGINE |
||
134 | /* Initialize the extension component */ |
||
135 | LOCAL_DEF |
||
136 | TT_Error TTExtend_Init( PEngine_Instance engine ); |
||
137 | |||
138 | /* Finalize the extension component */ |
||
139 | LOCAL_DEF |
||
140 | TT_Error TTExtend_Done( PEngine_Instance engine ); |
||
141 | |||
142 | /* Create an extension within a face object. Called by the */ |
||
143 | /* face object constructor. */ |
||
144 | LOCAL_DEF |
||
145 | TT_Error Extension_Create( PFace face ); |
||
146 | |||
147 | /* Destroy all extensions within a face object. Called by the */ |
||
148 | /* face object destructor. */ |
||
149 | LOCAL_DEF |
||
150 | TT_Error Extension_Destroy( PFace face ); |
||
151 | #endif |
||
152 | |||
153 | /* Query an extension block by extension_ID. Called by extension */ |
||
154 | /* service routines. */ |
||
155 | EXPORT_DEF |
||
156 | TT_Error TT_Extension_Get( PFace face, |
||
157 | Long extension_id, |
||
158 | void** extension_block ); |
||
159 | |||
160 | #ifdef __cplusplus |
||
161 | } |
||
162 | #endif |
||
163 | |||
164 | |||
165 | #endif /* TTEXTEND_H */ |
||
166 | |||
167 | |||
168 | /* END */><>><>><> |