Go to most recent revision | Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3918 | Serge | 1 | /***************************************************************************/ |
2 | /* */ |
||
3 | /* ttobjs.h */ |
||
4 | /* */ |
||
5 | /* Objects manager (specification). */ |
||
6 | /* */ |
||
7 | /* Copyright 1996-2009, 2011-2013 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 | /***************************************************************************/ |
||
17 | |||
18 | |||
19 | #ifndef __TTOBJS_H__ |
||
20 | #define __TTOBJS_H__ |
||
21 | |||
22 | |||
23 | #include |
||
24 | #include FT_INTERNAL_OBJECTS_H |
||
25 | #include FT_INTERNAL_TRUETYPE_TYPES_H |
||
26 | |||
27 | |||
28 | FT_BEGIN_HEADER |
||
29 | |||
30 | |||
31 | /*************************************************************************/ |
||
32 | /* */ |
||
33 | /* |
||
34 | /* TT_Driver */ |
||
35 | /* */ |
||
36 | /* |
||
37 | /* A handle to a TrueType driver object. */ |
||
38 | /* */ |
||
39 | typedef struct TT_DriverRec_* TT_Driver; |
||
40 | |||
41 | |||
42 | /*************************************************************************/ |
||
43 | /* */ |
||
44 | /* |
||
45 | /* TT_Instance */ |
||
46 | /* */ |
||
47 | /* |
||
48 | /* A handle to a TrueType size object. */ |
||
49 | /* */ |
||
50 | typedef struct TT_SizeRec_* TT_Size; |
||
51 | |||
52 | |||
53 | /*************************************************************************/ |
||
54 | /* */ |
||
55 | /* |
||
56 | /* TT_GlyphSlot */ |
||
57 | /* */ |
||
58 | /* |
||
59 | /* A handle to a TrueType glyph slot object. */ |
||
60 | /* */ |
||
61 | /* |
||
62 | /* This is a direct typedef of FT_GlyphSlot, as there is nothing */ |
||
63 | /* specific about the TrueType glyph slot. */ |
||
64 | /* */ |
||
65 | typedef FT_GlyphSlot TT_GlyphSlot; |
||
66 | |||
67 | |||
68 | /*************************************************************************/ |
||
69 | /* */ |
||
70 | /* |
||
71 | /* TT_GraphicsState */ |
||
72 | /* */ |
||
73 | /* |
||
74 | /* The TrueType graphics state used during bytecode interpretation. */ |
||
75 | /* */ |
||
76 | typedef struct TT_GraphicsState_ |
||
77 | { |
||
78 | FT_UShort rp0; |
||
79 | FT_UShort rp1; |
||
80 | FT_UShort rp2; |
||
81 | |||
82 | FT_UnitVector dualVector; |
||
83 | FT_UnitVector projVector; |
||
84 | FT_UnitVector freeVector; |
||
85 | |||
86 | #ifdef TT_CONFIG_OPTION_UNPATENTED_HINTING |
||
87 | FT_Bool both_x_axis; |
||
88 | #endif |
||
89 | |||
90 | FT_Long loop; |
||
91 | FT_F26Dot6 minimum_distance; |
||
92 | FT_Int round_state; |
||
93 | |||
94 | FT_Bool auto_flip; |
||
95 | FT_F26Dot6 control_value_cutin; |
||
96 | FT_F26Dot6 single_width_cutin; |
||
97 | FT_F26Dot6 single_width_value; |
||
98 | FT_Short delta_base; |
||
99 | FT_Short delta_shift; |
||
100 | |||
101 | FT_Byte instruct_control; |
||
102 | /* According to Greg Hitchcock from Microsoft, the `scan_control' */ |
||
103 | /* variable as documented in the TrueType specification is a 32-bit */ |
||
104 | /* integer; the high-word part holds the SCANTYPE value, the low-word */ |
||
105 | /* part the SCANCTRL value. We separate it into two fields. */ |
||
106 | FT_Bool scan_control; |
||
107 | FT_Int scan_type; |
||
108 | |||
109 | FT_UShort gep0; |
||
110 | FT_UShort gep1; |
||
111 | FT_UShort gep2; |
||
112 | |||
113 | } TT_GraphicsState; |
||
114 | |||
115 | |||
116 | #ifdef TT_USE_BYTECODE_INTERPRETER |
||
117 | |||
118 | FT_LOCAL( void ) |
||
119 | tt_glyphzone_done( TT_GlyphZone zone ); |
||
120 | |||
121 | FT_LOCAL( FT_Error ) |
||
122 | tt_glyphzone_new( FT_Memory memory, |
||
123 | FT_UShort maxPoints, |
||
124 | FT_Short maxContours, |
||
125 | TT_GlyphZone zone ); |
||
126 | |||
127 | #endif /* TT_USE_BYTECODE_INTERPRETER */ |
||
128 | |||
129 | |||
130 | |||
131 | /*************************************************************************/ |
||
132 | /* */ |
||
133 | /* EXECUTION SUBTABLES */ |
||
134 | /* */ |
||
135 | /* These sub-tables relate to instruction execution. */ |
||
136 | /* */ |
||
137 | /*************************************************************************/ |
||
138 | |||
139 | |||
140 | #define TT_MAX_CODE_RANGES 3 |
||
141 | |||
142 | |||
143 | /*************************************************************************/ |
||
144 | /* */ |
||
145 | /* There can only be 3 active code ranges at once: */ |
||
146 | /* - the Font Program */ |
||
147 | /* - the CVT Program */ |
||
148 | /* - a glyph's instructions set */ |
||
149 | /* */ |
||
150 | typedef enum TT_CodeRange_Tag_ |
||
151 | { |
||
152 | tt_coderange_none = 0, |
||
153 | tt_coderange_font, |
||
154 | tt_coderange_cvt, |
||
155 | tt_coderange_glyph |
||
156 | |||
157 | } TT_CodeRange_Tag; |
||
158 | |||
159 | |||
160 | typedef struct TT_CodeRange_ |
||
161 | { |
||
162 | FT_Byte* base; |
||
163 | FT_ULong size; |
||
164 | |||
165 | } TT_CodeRange; |
||
166 | |||
167 | typedef TT_CodeRange TT_CodeRangeTable[TT_MAX_CODE_RANGES]; |
||
168 | |||
169 | |||
170 | /*************************************************************************/ |
||
171 | /* */ |
||
172 | /* Defines a function/instruction definition record. */ |
||
173 | /* */ |
||
174 | typedef struct TT_DefRecord_ |
||
175 | { |
||
176 | FT_Int range; /* in which code range is it located? */ |
||
177 | FT_Long start; /* where does it start? */ |
||
178 | FT_Long end; /* where does it end? */ |
||
179 | FT_UInt opc; /* function #, or instruction code */ |
||
180 | FT_Bool active; /* is it active? */ |
||
181 | FT_Bool inline_delta; /* is function that defines inline delta? */ |
||
182 | FT_ULong sph_fdef_flags; /* flags to identify special functions */ |
||
183 | |||
184 | } TT_DefRecord, *TT_DefArray; |
||
185 | |||
186 | |||
187 | /*************************************************************************/ |
||
188 | /* */ |
||
189 | /* Subglyph transformation record. */ |
||
190 | /* */ |
||
191 | typedef struct TT_Transform_ |
||
192 | { |
||
193 | FT_Fixed xx, xy; /* transformation matrix coefficients */ |
||
194 | FT_Fixed yx, yy; |
||
195 | FT_F26Dot6 ox, oy; /* offsets */ |
||
196 | |||
197 | } TT_Transform; |
||
198 | |||
199 | |||
200 | /*************************************************************************/ |
||
201 | /* */ |
||
202 | /* A note regarding non-squared pixels: */ |
||
203 | /* */ |
||
204 | /* (This text will probably go into some docs at some time; for now, it */ |
||
205 | /* is kept here to explain some definitions in the TT_Size_Metrics */ |
||
206 | /* record). */ |
||
207 | /* */ |
||
208 | /* The CVT is a one-dimensional array containing values that control */ |
||
209 | /* certain important characteristics in a font, like the height of all */ |
||
210 | /* capitals, all lowercase letter, default spacing or stem width/height. */ |
||
211 | /* */ |
||
212 | /* These values are found in FUnits in the font file, and must be scaled */ |
||
213 | /* to pixel coordinates before being used by the CVT and glyph programs. */ |
||
214 | /* Unfortunately, when using distinct x and y resolutions (or distinct x */ |
||
215 | /* and y pointsizes), there are two possible scalings. */ |
||
216 | /* */ |
||
217 | /* A first try was to implement a `lazy' scheme where all values were */ |
||
218 | /* scaled when first used. However, while some values are always used */ |
||
219 | /* in the same direction, some others are used under many different */ |
||
220 | /* circumstances and orientations. */ |
||
221 | /* */ |
||
222 | /* I have found a simpler way to do the same, and it even seems to work */ |
||
223 | /* in most of the cases: */ |
||
224 | /* */ |
||
225 | /* - All CVT values are scaled to the maximum ppem size. */ |
||
226 | /* */ |
||
227 | /* - When performing a read or write in the CVT, a ratio factor is used */ |
||
228 | /* to perform adequate scaling. Example: */ |
||
229 | /* */ |
||
230 | /* x_ppem = 14 */ |
||
231 | /* y_ppem = 10 */ |
||
232 | /* */ |
||
233 | /* We choose ppem = x_ppem = 14 as the CVT scaling size. All cvt */ |
||
234 | /* entries are scaled to it. */ |
||
235 | /* */ |
||
236 | /* x_ratio = 1.0 */ |
||
237 | /* y_ratio = y_ppem/ppem (< 1.0) */ |
||
238 | /* */ |
||
239 | /* We compute the current ratio like: */ |
||
240 | /* */ |
||
241 | /* - If projVector is horizontal, */ |
||
242 | /* ratio = x_ratio = 1.0 */ |
||
243 | /* */ |
||
244 | /* - if projVector is vertical, */ |
||
245 | /* ratio = y_ratio */ |
||
246 | /* */ |
||
247 | /* - else, */ |
||
248 | /* ratio = sqrt( (proj.x * x_ratio) ^ 2 + (proj.y * y_ratio) ^ 2 ) */ |
||
249 | /* */ |
||
250 | /* Reading a cvt value returns */ |
||
251 | /* ratio * cvt[index] */ |
||
252 | /* */ |
||
253 | /* Writing a cvt value in pixels: */ |
||
254 | /* cvt[index] / ratio */ |
||
255 | /* */ |
||
256 | /* The current ppem is simply */ |
||
257 | /* ratio * ppem */ |
||
258 | /* */ |
||
259 | /*************************************************************************/ |
||
260 | |||
261 | |||
262 | /*************************************************************************/ |
||
263 | /* */ |
||
264 | /* Metrics used by the TrueType size and context objects. */ |
||
265 | /* */ |
||
266 | typedef struct TT_Size_Metrics_ |
||
267 | { |
||
268 | /* for non-square pixels */ |
||
269 | FT_Long x_ratio; |
||
270 | FT_Long y_ratio; |
||
271 | |||
272 | FT_UShort ppem; /* maximum ppem size */ |
||
273 | FT_Long ratio; /* current ratio */ |
||
274 | FT_Fixed scale; |
||
275 | |||
276 | FT_F26Dot6 compensations[4]; /* device-specific compensations */ |
||
277 | |||
278 | FT_Bool valid; |
||
279 | |||
280 | FT_Bool rotated; /* `is the glyph rotated?'-flag */ |
||
281 | FT_Bool stretched; /* `is the glyph stretched?'-flag */ |
||
282 | |||
283 | } TT_Size_Metrics; |
||
284 | |||
285 | |||
286 | /*************************************************************************/ |
||
287 | /* */ |
||
288 | /* TrueType size class. */ |
||
289 | /* */ |
||
290 | typedef struct TT_SizeRec_ |
||
291 | { |
||
292 | FT_SizeRec root; |
||
293 | |||
294 | /* we have our own copy of metrics so that we can modify */ |
||
295 | /* it without affecting auto-hinting (when used) */ |
||
296 | FT_Size_Metrics metrics; |
||
297 | |||
298 | TT_Size_Metrics ttmetrics; |
||
299 | |||
300 | FT_ULong strike_index; /* 0xFFFFFFFF to indicate invalid */ |
||
301 | |||
302 | #ifdef TT_USE_BYTECODE_INTERPRETER |
||
303 | |||
304 | FT_UInt num_function_defs; /* number of function definitions */ |
||
305 | FT_UInt max_function_defs; |
||
306 | TT_DefArray function_defs; /* table of function definitions */ |
||
307 | |||
308 | FT_UInt num_instruction_defs; /* number of ins. definitions */ |
||
309 | FT_UInt max_instruction_defs; |
||
310 | TT_DefArray instruction_defs; /* table of ins. definitions */ |
||
311 | |||
312 | FT_UInt max_func; |
||
313 | FT_UInt max_ins; |
||
314 | |||
315 | TT_CodeRangeTable codeRangeTable; |
||
316 | |||
317 | TT_GraphicsState GS; |
||
318 | |||
319 | FT_ULong cvt_size; /* the scaled control value table */ |
||
320 | FT_Long* cvt; |
||
321 | |||
322 | FT_UShort storage_size; /* The storage area is now part of */ |
||
323 | FT_Long* storage; /* the instance */ |
||
324 | |||
325 | TT_GlyphZoneRec twilight; /* The instance's twilight zone */ |
||
326 | |||
327 | /* debugging variables */ |
||
328 | |||
329 | /* When using the debugger, we must keep the */ |
||
330 | /* execution context tied to the instance */ |
||
331 | /* object rather than asking it on demand. */ |
||
332 | |||
333 | FT_Bool debug; |
||
334 | TT_ExecContext context; |
||
335 | |||
336 | FT_Bool bytecode_ready; |
||
337 | FT_Bool cvt_ready; |
||
338 | |||
339 | #endif /* TT_USE_BYTECODE_INTERPRETER */ |
||
340 | |||
341 | } TT_SizeRec; |
||
342 | |||
343 | |||
344 | /*************************************************************************/ |
||
345 | /* */ |
||
346 | /* TrueType driver class. */ |
||
347 | /* */ |
||
348 | typedef struct TT_DriverRec_ |
||
349 | { |
||
350 | FT_DriverRec root; |
||
351 | |||
352 | TT_ExecContext context; /* execution context */ |
||
353 | TT_GlyphZoneRec zone; /* glyph loader points zone */ |
||
354 | |||
355 | FT_UInt interpreter_version; |
||
356 | |||
357 | } TT_DriverRec; |
||
358 | |||
359 | |||
360 | /* Note: All of the functions below (except tt_size_reset()) are used */ |
||
361 | /* as function pointers in a FT_Driver_ClassRec. Therefore their */ |
||
362 | /* parameters are of types FT_Face, FT_Size, etc., rather than TT_Face, */ |
||
363 | /* TT_Size, etc., so that the compiler can confirm that the types and */ |
||
364 | /* number of parameters are correct. In all cases the FT_xxx types are */ |
||
365 | /* cast to their TT_xxx counterparts inside the functions since FreeType */ |
||
366 | /* will always use the TT driver to create them. */ |
||
367 | |||
368 | |||
369 | /*************************************************************************/ |
||
370 | /* */ |
||
371 | /* Face functions */ |
||
372 | /* */ |
||
373 | FT_LOCAL( FT_Error ) |
||
374 | tt_face_init( FT_Stream stream, |
||
375 | FT_Face ttface, /* TT_Face */ |
||
376 | FT_Int face_index, |
||
377 | FT_Int num_params, |
||
378 | FT_Parameter* params ); |
||
379 | |||
380 | FT_LOCAL( void ) |
||
381 | tt_face_done( FT_Face ttface ); /* TT_Face */ |
||
382 | |||
383 | |||
384 | /*************************************************************************/ |
||
385 | /* */ |
||
386 | /* Size functions */ |
||
387 | /* */ |
||
388 | FT_LOCAL( FT_Error ) |
||
389 | tt_size_init( FT_Size ttsize ); /* TT_Size */ |
||
390 | |||
391 | FT_LOCAL( void ) |
||
392 | tt_size_done( FT_Size ttsize ); /* TT_Size */ |
||
393 | |||
394 | #ifdef TT_USE_BYTECODE_INTERPRETER |
||
395 | |||
396 | FT_LOCAL( FT_Error ) |
||
397 | tt_size_run_fpgm( TT_Size size, |
||
398 | FT_Bool pedantic ); |
||
399 | |||
400 | FT_LOCAL( FT_Error ) |
||
401 | tt_size_run_prep( TT_Size size, |
||
402 | FT_Bool pedantic ); |
||
403 | |||
404 | FT_LOCAL( FT_Error ) |
||
405 | tt_size_ready_bytecode( TT_Size size, |
||
406 | FT_Bool pedantic ); |
||
407 | |||
408 | #endif /* TT_USE_BYTECODE_INTERPRETER */ |
||
409 | |||
410 | FT_LOCAL( FT_Error ) |
||
411 | tt_size_reset( TT_Size size ); |
||
412 | |||
413 | |||
414 | /*************************************************************************/ |
||
415 | /* */ |
||
416 | /* Driver functions */ |
||
417 | /* */ |
||
418 | FT_LOCAL( FT_Error ) |
||
419 | tt_driver_init( FT_Module ttdriver ); /* TT_Driver */ |
||
420 | |||
421 | FT_LOCAL( void ) |
||
422 | tt_driver_done( FT_Module ttdriver ); /* TT_Driver */ |
||
423 | |||
424 | |||
425 | /*************************************************************************/ |
||
426 | /* */ |
||
427 | /* Slot functions */ |
||
428 | /* */ |
||
429 | FT_LOCAL( FT_Error ) |
||
430 | tt_slot_init( FT_GlyphSlot slot ); |
||
431 | |||
432 | |||
433 | /* auxiliary */ |
||
434 | #define IS_HINTED( flags ) ( ( flags & FT_LOAD_NO_HINTING ) == 0 ) |
||
435 | |||
436 | |||
437 | FT_END_HEADER |
||
438 | |||
439 | #endif /* __TTOBJS_H__ */ |
||
440 | |||
441 | |||
442 | /* END */> |