1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/* otlbuffer.h: Buffer of glyphs for substitution/positioning
*
* Copyrigh 2004 Red Hat Software
*
* Portions Copyright 1996-2000 by
* David Turner, Robert Wilhelm, and Werner Lemberg.
*
* This file is part of the FreeType project, and may only be used
* modified and distributed under the terms of the FreeType project
* license, LICENSE.TXT. By continuing to use, modify, or distribute
* this file you indicate that you have read the license and
* understand and accept it fully.
*/
#ifndef OTL_BUFFER_H
#define OTL_BUFFER_H
#include <ft2build.h>
#include FT_FREETYPE_H
FT_BEGIN_HEADER
#define OTL_GLYPH_PROPERTIES_UNKNOWN 0xFFFF
#define IN_GLYPH( pos ) buffer->in_string[(pos)].gindex
#define IN_ITEM( pos ) (&buffer->in_string[(pos)])
#define IN_CURGLYPH() buffer->in_string[buffer->in_pos].gindex
#define IN_CURITEM() (&buffer->in_string[buffer->in_pos])
#define IN_PROPERTIES( pos ) buffer->in_string[(pos)].properties
#define IN_LIGID( pos ) buffer->in_string[(pos)].ligID
#define IN_COMPONENT( pos ) (buffer->in_string[(pos)].component)
#define OUT_GLYPH( pos ) buffer->out_string[(pos)].gindex
#define OUT_ITEM( pos ) (&buffer->out_string[(pos)])
#define POSITION( pos ) (&buffer->positions[(pos)])
#define ADD_String( buffer, num_in, num_out, glyph_data, component, ligID ) \
( ( error = otl_buffer_add_output_glyphs( (buffer), \
(num_in), (num_out), \
(glyph_data), (component), (ligID) \
) ) != TT_Err_Ok )
#define ADD_Glyph( buffer, glyph_index, component, ligID ) \
( ( error = otl_buffer_add_output_glyph( (buffer), \
(glyph_index), (component), (ligID) \
) ) != TT_Err_Ok )
typedef struct OTL_GlyphItemRec_ {
FT_UInt gindex;
FT_UInt properties;
FT_UInt cluster;
FT_UShort component;
FT_UShort ligID;
FT_UShort gproperties;
} OTL_GlyphItemRec, *OTL_GlyphItem;
typedef struct OTL_PositionRec_ {
FT_Pos x_pos;
FT_Pos y_pos;
FT_Pos x_advance;
FT_Pos y_advance;
FT_UShort back; /* number of glyphs to go back
for drawing current glyph */
FT_Bool new_advance; /* if set, the advance width values are
absolute, i.e., they won't be
added to the original glyph's value
but rather tqreplace them. */
FT_Short cursive_chain; /* character to which this connects,
may be positive or negative; used
only internally */
} OTL_PositionRec, *OTL_Position;
typedef struct OTL_BufferRec_{
FT_Memory memory;
FT_ULong allocated;
FT_ULong in_length;
FT_ULong out_length;
FT_ULong in_pos;
FT_ULong out_pos;
OTL_GlyphItem in_string;
OTL_GlyphItem out_string;
OTL_Position positions;
FT_UShort max_ligID;
} OTL_BufferRec, *OTL_Buffer;
FT_Error
otl_buffer_new( FT_Memory memory,
OTL_Buffer *buffer );
FT_Error
otl_buffer_swap( OTL_Buffer buffer );
FT_Error
otl_buffer_free( OTL_Buffer buffer );
FT_Error
otl_buffer_clear( OTL_Buffer buffer );
FT_Error
otl_buffer_add_glyph( OTL_Buffer buffer,
FT_UInt glyph_index,
FT_UInt properties,
FT_UInt cluster );
FT_Error
otl_buffer_add_output_glyphs( OTL_Buffer buffer,
FT_UShort num_in,
FT_UShort num_out,
FT_UShort *glyph_data,
FT_UShort component,
FT_UShort ligID );
FT_Error
otl_buffer_add_output_glyph ( OTL_Buffer buffer,
FT_UInt glyph_index,
FT_UShort component,
FT_UShort ligID );
FT_Error
otl_buffer_copy_output_glyph ( OTL_Buffer buffer );
FT_UShort
otl_buffer_allocate_ligid( OTL_Buffer buffer );
FT_END_HEADER
#endif
|