OLD | NEW |
| (Empty) |
1 /* | |
2 * Copyright (C) 2006 Red Hat, Inc. | |
3 * | |
4 * This is part of HarfBuzz, an OpenType Layout engine library. | |
5 * | |
6 * Permission is hereby granted, without written agreement and without | |
7 * license or royalty fees, to use, copy, modify, and distribute this | |
8 * software and its documentation for any purpose, provided that the | |
9 * above copyright notice and the following two paragraphs appear in | |
10 * all copies of this software. | |
11 * | |
12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR | |
13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES | |
14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN | |
15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH | |
16 * DAMAGE. | |
17 * | |
18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, | |
19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND | |
20 * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS | |
21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO | |
22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. | |
23 * | |
24 * Red Hat Author(s): Owen Taylor | |
25 */ | |
26 | |
27 #include <stdint.h> | |
28 | |
29 /* Base Types */ | |
30 | |
31 typedef hb_uint16 HB_CodePoint; /* UTF-16 codepoint (not character ) */ | |
32 typedef char HB_Boolean; | |
33 typedef hb_uint32 HB_Fixed; /* 26.6 */ | |
34 typedef hb_uint32 HB_Glyph; | |
35 typedef hb_uint32 HB_Unichar; | |
36 | |
37 /* Metrics reported by the font backend for use of the shaper */ | |
38 typedef struct _HB_GlyphMetrics HB_GlyphMetrics; | |
39 struct _HB_GlyphMetrics | |
40 { | |
41 HB_Fixed advance; | |
42 | |
43 /* Do we need ink/logical extents for the glyph here? */ | |
44 }; | |
45 | |
46 /* | |
47 * HB_Font: Abstract font interface. | |
48 * First pass of this might just have FT_Face *getFace(); | |
49 */ | |
50 typedef struct _HB_Font HB_Font; | |
51 typedef struct _HB_FontClass HB_FontClass; | |
52 | |
53 struct HB_FontClass { | |
54 HB_Glyph (*charToGlyph)(HB_Font *font, HB_Unichar chr); | |
55 void (*getMetrics)(HB_Font *font, HB_Glyph glyph, HB_GlyphMetrics *met
rics); | |
56 HB_Boolean (*getSFontTable)(HB_Font *font, void **cookie, char **start, int
*len); | |
57 HB_Boolean (*freeSFontTable)(void **cookie); | |
58 }; | |
59 | |
60 struct _HB_Font { | |
61 HB_FontClass *clazz; | |
62 }; | |
63 | |
64 /* | |
65 * Language tags, of the form en-us; represented as interned, canonicalized | |
66 * strings. hb_language_from_string("en_US"), hb_language_from_string("en-us") | |
67 * both return the same (pointer-comparable) HB_Language). | |
68 */ | |
69 typedef struct HB_Language_ *HB_Language; | |
70 | |
71 HB_Language hb_language_from_string(const char *str); | |
72 const char *hb_language_to_string(HB_Language language); | |
73 | |
74 /* Special treatment for the edges of runs. | |
75 */ | |
76 typedef enum { | |
77 HB_RUN_EDGE_LINE_VISUAL_EDGE = 1 << 0, | |
78 HB_RUN_EDGE_LINE_LOGICAL_EDGE = 1 << 1, | |
79 HB_RUN_EDGE_LINE_ADD_HYPHEN = 1 << 2 /* ???? */ | |
80 } HB_RunEdge; | |
81 | |
82 /* Defines optional informaiton in HB_ShapeInput; this allows extension | |
83 * of HB_ShapeInput while keeping binary compatibility | |
84 */ | |
85 typedef enum { | |
86 HB_SHAPE_START_TYPE = 1 << 0, | |
87 HB_SHAPE_END_TYPE = 1 << 1 | |
88 } HB_ShapeFlags; | |
89 | |
90 /* Attributes types are described by "interned strings"; this is a little | |
91 * annoying if you want to write a switch statement, but keeps things | |
92 * simple. | |
93 */ | |
94 typedef struct _HB_AttributeType *HB_AttributeType; | |
95 | |
96 HB_AttributeType hb_attribute_type_from_string(const char *str); | |
97 const char *hb_attribute_type_to_string(HB_AttributeType attribute_type); | |
98 | |
99 struct HB_Attribute { | |
100 HB_AttributeType type; | |
101 int start; | |
102 int end; | |
103 }; | |
104 | |
105 | |
106 /** | |
107 * You could handle this like HB_Language, but an enum seems a little nicer; | |
108 * another approach would be to use OpenType script tags. | |
109 */ | |
110 typedef enum { | |
111 HB_SCRIPT_LATIN | |
112 /* ... */ | |
113 } HB_ShapeScript; | |
114 | |
115 /* This is just the subset of direction information needed by the shaper */ | |
116 typedef enum { | |
117 HB_DIRECTION_LTR, | |
118 HB_DIRECTION_RTL, | |
119 HB_DIRECTION_TTB | |
120 } HB_Direction; | |
121 | |
122 typedef struct _HB_ShapeInput HB_ShapeInput; | |
123 struct _HB_ShapeInput { | |
124 /* Defines what fields the caller has initialized - fields not in | |
125 * the enum are mandatory. | |
126 */ | |
127 HB_ShapeFlags flags; | |
128 | |
129 HB_CodePoint *text; | |
130 int length; /* total length of text to shape */ | |
131 int shape_offset; /* start of section to shape */ | |
132 int shape_length; /* number of code points to shape */ | |
133 | |
134 HB_Direction direction; | |
135 HB_ShapeScript script; | |
136 HB_Language language; | |
137 | |
138 HB_AttributeType *attributes; | |
139 int n_attributes; | |
140 | |
141 HB_RunEdge start_type; | |
142 HB_RunEdge end_type; | |
143 }; | |
144 | |
145 struct HB_GlyphItem { | |
146 HB_Glyph glyph; | |
147 | |
148 HB_Fixed x_offset; | |
149 HB_Fixed y_offset; | |
150 HB_Fixed advance; | |
151 | |
152 /* Add kashida information, etc, here */ | |
153 }; | |
154 | |
155 typedef enum { | |
156 HB_RESULT_SUCCESS, | |
157 HB_RESULT_NO_MEMORY, | |
158 HB_SHAPE_RESULT_FAILED | |
159 } HB_Result; | |
160 | |
161 /* | |
162 * Buffer for output | |
163 */ | |
164 typedef struct _HB_GlyphBuffer HB_GlyphBuffer; | |
165 struct _HB_GlyphBuffer { | |
166 int glyph_item_size; | |
167 int total_glyphs; | |
168 | |
169 int *log_clusters; /* Uniscribe style */ | |
170 int cluster_space; | |
171 | |
172 int glyph_space; | |
173 void *glyph_buffer; | |
174 }; | |
175 | |
176 /* Making this self-allocating simplifies writing shapers and | |
177 * also keeps things easier for caller. item_size passed in | |
178 * must be at least sizeof(HB_GlyphItem) but can be bigger, | |
179 * to accomodate application structures that extend HB_GlyphItem. | |
180 * The allocated items will be zero-initialized. | |
181 * | |
182 * (Hack: Harfbuzz could choose to use even a *bigger* item size | |
183 * and stick internal information before the public item structure. | |
184 * This hack could possibly be used to unify this with HB_Buffer) | |
185 */ | |
186 HB_GlyphBuffer *hb_glyph_buffer_new (size_t item_size); | |
187 void hb_glyph_buffer_clear (HB_GlyphBuffer *buf); | |
188 HB_Result hb_glyph_buffer_extend_glyphs (HB_GlyphBuffer *buf, int n_item
s); | |
189 HB_Result hb_glyph_buffer_extend_clusters (HB_GlyphBuffer *buf, int n_clus
ters); | |
190 void hb_glyph_buffer_free (HB_GlyphBuffer *buf); | |
191 | |
192 | |
193 /* Accessor for a particular glyph */ | |
194 #define HB_GLYPH_BUFFER_ITEM(buffer, index) | |
195 | |
196 /* | |
197 * Main shaping function | |
198 */ | |
199 HB_Result hb_shape(HB_ShapeInput *input, HB_GlyphBuffer *output); | |
OLD | NEW |