1 | /* Pango |
2 | * pango-engine.h: Engines for script and language specific processing |
3 | * |
4 | * Copyright (C) 2000,2003 Red Hat Software |
5 | * |
6 | * This library is free software; you can redistribute it and/or |
7 | * modify it under the terms of the GNU Library General Public |
8 | * License as published by the Free Software Foundation; either |
9 | * version 2 of the License, or (at your option) any later version. |
10 | * |
11 | * This library is distributed in the hope that it will be useful, |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | * Library General Public License for more details. |
15 | * |
16 | * You should have received a copy of the GNU Library General Public |
17 | * License along with this library; if not, write to the |
18 | * Free Software Foundation, Inc., 59 Temple Place - Suite 330, |
19 | * Boston, MA 02111-1307, USA. |
20 | */ |
21 | |
22 | #ifndef __PANGO_ENGINE_H__ |
23 | #define __PANGO_ENGINE_H__ |
24 | |
25 | #include <pango/pango-types.h> |
26 | #include <pango/pango-item.h> |
27 | #include <pango/pango-font.h> |
28 | #include <pango/pango-glyph.h> |
29 | #include <pango/pango-script.h> |
30 | |
31 | G_BEGIN_DECLS |
32 | |
33 | #ifdef PANGO_ENABLE_ENGINE |
34 | |
35 | /** |
36 | * PANGO_RENDER_TYPE_NONE: |
37 | * |
38 | * A string constant defining the render type |
39 | * for engines that are not rendering-system specific. |
40 | * |
41 | * Deprecated: 1.38 |
42 | */ |
43 | #define PANGO_RENDER_TYPE_NONE "PangoRenderNone" |
44 | |
45 | #define PANGO_TYPE_ENGINE (pango_engine_get_type ()) |
46 | #define PANGO_ENGINE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE, PangoEngine)) |
47 | #define PANGO_IS_ENGINE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE)) |
48 | #define PANGO_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE, PangoEngineClass)) |
49 | #define PANGO_IS_ENGINE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE)) |
50 | #define PANGO_ENGINE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE, PangoEngineClass)) |
51 | |
52 | typedef struct _PangoEngine PangoEngine; |
53 | typedef struct _PangoEngineClass PangoEngineClass; |
54 | |
55 | /** |
56 | * PangoEngine: |
57 | * |
58 | * #PangoEngine is the base class for all types of language and |
59 | * script specific engines. It has no functionality by itself. |
60 | * |
61 | * Deprecated: 1.38 |
62 | **/ |
63 | struct _PangoEngine |
64 | { |
65 | /*< private >*/ |
66 | GObject parent_instance; |
67 | }; |
68 | |
69 | /** |
70 | * PangoEngineClass: |
71 | * |
72 | * Class structure for #PangoEngine |
73 | * |
74 | * Deprecated: 1.38 |
75 | **/ |
76 | struct _PangoEngineClass |
77 | { |
78 | /*< private >*/ |
79 | GObjectClass parent_class; |
80 | }; |
81 | |
82 | PANGO_DEPRECATED_IN_1_38 |
83 | GType pango_engine_get_type (void) G_GNUC_CONST; |
84 | |
85 | /** |
86 | * PANGO_ENGINE_TYPE_LANG: |
87 | * |
88 | * A string constant defining the engine type for language engines. |
89 | * These engines derive from #PangoEngineLang. |
90 | * |
91 | * Deprecated: 1.38 |
92 | */ |
93 | #define PANGO_ENGINE_TYPE_LANG "PangoEngineLang" |
94 | |
95 | #define PANGO_TYPE_ENGINE_LANG (pango_engine_lang_get_type ()) |
96 | #define PANGO_ENGINE_LANG(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE_LANG, PangoEngineLang)) |
97 | #define PANGO_IS_ENGINE_LANG(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE_LANG)) |
98 | #define PANGO_ENGINE_LANG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE_LANG, PangoEngineLangClass)) |
99 | #define PANGO_IS_ENGINE_LANG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE_LANG)) |
100 | #define PANGO_ENGINE_LANG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE_LANG, PangoEngineLangClass)) |
101 | |
102 | typedef struct _PangoEngineLangClass PangoEngineLangClass; |
103 | |
104 | /** |
105 | * PangoEngineLang: |
106 | * |
107 | * The #PangoEngineLang class is implemented by engines that |
108 | * customize the rendering-system independent part of the |
109 | * Pango pipeline for a particular script or language. For |
110 | * instance, a custom #PangoEngineLang could be provided for |
111 | * Thai to implement the dictionary-based word boundary |
112 | * lookups needed for that language. |
113 | * |
114 | * Deprecated: 1.38 |
115 | **/ |
116 | struct _PangoEngineLang |
117 | { |
118 | /*< private >*/ |
119 | PangoEngine parent_instance; |
120 | }; |
121 | |
122 | /** |
123 | * PangoEngineLangClass: |
124 | * @script_break: (nullable): Provides a custom implementation of |
125 | * pango_break(). If %NULL, pango_default_break() is used instead. If |
126 | * not %NULL, for Pango versions before 1.16 (module interface version |
127 | * before 1.6.0), this was called instead of pango_default_break(), |
128 | * but in newer versions, pango_default_break() is always called and |
129 | * this is called after that to allow tailoring the breaking results. |
130 | * |
131 | * Class structure for #PangoEngineLang |
132 | * |
133 | * Deprecated: 1.38 |
134 | **/ |
135 | struct _PangoEngineLangClass |
136 | { |
137 | /*< private >*/ |
138 | PangoEngineClass parent_class; |
139 | |
140 | /*< public >*/ |
141 | void (*script_break) (PangoEngineLang *engine, |
142 | const char *text, |
143 | int len, |
144 | PangoAnalysis *analysis, |
145 | PangoLogAttr *attrs, |
146 | int attrs_len); |
147 | }; |
148 | |
149 | PANGO_DEPRECATED_IN_1_38 |
150 | GType pango_engine_lang_get_type (void) G_GNUC_CONST; |
151 | |
152 | /** |
153 | * PANGO_ENGINE_TYPE_SHAPE: |
154 | * |
155 | * A string constant defining the engine type for shaping engines. |
156 | * These engines derive from #PangoEngineShape. |
157 | * |
158 | * Deprecated: 1.38 |
159 | */ |
160 | #define PANGO_ENGINE_TYPE_SHAPE "PangoEngineShape" |
161 | |
162 | #define PANGO_TYPE_ENGINE_SHAPE (pango_engine_shape_get_type ()) |
163 | #define PANGO_ENGINE_SHAPE(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_ENGINE_SHAPE, PangoEngineShape)) |
164 | #define PANGO_IS_ENGINE_SHAPE(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_ENGINE_SHAPE)) |
165 | #define PANGO_ENGINE_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_ENGINE_SHAPE, PangoEngine_ShapeClass)) |
166 | #define PANGO_IS_ENGINE_SHAPE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_ENGINE_SHAPE)) |
167 | #define PANGO_ENGINE_SHAPE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_ENGINE_SHAPE, PangoEngineShapeClass)) |
168 | |
169 | typedef struct _PangoEngineShapeClass PangoEngineShapeClass; |
170 | |
171 | /** |
172 | * PangoEngineShape: |
173 | * |
174 | * The #PangoEngineShape class is implemented by engines that |
175 | * customize the rendering-system dependent part of the |
176 | * Pango pipeline for a particular script or language. |
177 | * A #PangoEngineShape implementation is then specific to both |
178 | * a particular rendering system or group of rendering systems |
179 | * and to a particular script. For instance, there is one |
180 | * #PangoEngineShape implementation to handle shaping Arabic |
181 | * for Fontconfig-based backends. |
182 | * |
183 | * Deprecated: 1.38 |
184 | **/ |
185 | struct _PangoEngineShape |
186 | { |
187 | PangoEngine parent_instance; |
188 | }; |
189 | |
190 | /** |
191 | * PangoEngineShapeClass: |
192 | * @script_shape: Given a font, a piece of text, and a #PangoAnalysis |
193 | * structure, converts characters to glyphs and positions the |
194 | * resulting glyphs. The results are stored in the #PangoGlyphString |
195 | * that is passed in. (The implementation should resize it |
196 | * appropriately using pango_glyph_string_set_size()). All fields |
197 | * of the @log_clusters and @glyphs array must be filled in, with |
198 | * the exception that Pango will automatically generate |
199 | * <literal>glyphs->glyphs[i].attr.is_cluster_start</literal> |
200 | * using the @log_clusters array. Each input character must occur in one |
201 | * of the output logical clusters; |
202 | * if no rendering is desired for a character, this may involve |
203 | * inserting glyphs with the #PangoGlyph ID #PANGO_GLYPH_EMPTY, which |
204 | * is guaranteed never to render. If the shaping fails for any reason, |
205 | * the shaper should return with an empty (zero-size) glyph string. |
206 | * If the shaper has not set the size on the glyph string yet, simply |
207 | * returning signals the failure too. |
208 | * @covers: Returns the characters that this engine can cover |
209 | * with a given font for a given language. If not overridden, the default |
210 | * implementation simply returns the coverage information for the |
211 | * font itself unmodified. |
212 | * |
213 | * Class structure for #PangoEngineShape |
214 | * |
215 | * Deprecated: 1.38 |
216 | **/ |
217 | struct _PangoEngineShapeClass |
218 | { |
219 | /*< private >*/ |
220 | PangoEngineClass parent_class; |
221 | |
222 | /*< public >*/ |
223 | void (*script_shape) (PangoEngineShape *engine, |
224 | PangoFont *font, |
225 | const char *item_text, |
226 | unsigned int item_length, |
227 | const PangoAnalysis *analysis, |
228 | PangoGlyphString *glyphs, |
229 | const char *paragraph_text, |
230 | unsigned int paragraph_length); |
231 | PangoCoverageLevel (*covers) (PangoEngineShape *engine, |
232 | PangoFont *font, |
233 | PangoLanguage *language, |
234 | gunichar wc); |
235 | }; |
236 | |
237 | PANGO_DEPRECATED_IN_1_38 |
238 | GType pango_engine_shape_get_type (void) G_GNUC_CONST; |
239 | |
240 | typedef struct _PangoEngineInfo PangoEngineInfo; |
241 | typedef struct _PangoEngineScriptInfo PangoEngineScriptInfo; |
242 | |
243 | /** |
244 | * PangoEngineScriptInfo: |
245 | * @script: a #PangoScript. The value %PANGO_SCRIPT_COMMON has |
246 | * the special meaning here of "all scripts" |
247 | * @langs: a semicolon separated list of languages that this |
248 | * engine handles for this script. This may be empty, |
249 | * in which case the engine is saying that it is a |
250 | * fallback choice for all languages for this range, |
251 | * but should not be used if another engine |
252 | * indicates that it is specific for the language for |
253 | * a given code point. An entry in this list of "*" |
254 | * indicates that this engine is specific to all |
255 | * languages for this range. |
256 | * |
257 | * The #PangoEngineScriptInfo structure contains |
258 | * information about how the shaper covers a particular script. |
259 | * |
260 | * Deprecated: 1.38 |
261 | */ |
262 | struct _PangoEngineScriptInfo |
263 | { |
264 | PangoScript script; |
265 | const gchar *langs; |
266 | }; |
267 | |
268 | /** |
269 | * PangoEngineInfo: |
270 | * @id: a unique string ID for the engine. |
271 | * @engine_type: a string identifying the engine type. |
272 | * @render_type: a string identifying the render type. |
273 | * @scripts: array of scripts this engine supports. |
274 | * @n_scripts: number of items in @scripts. |
275 | * |
276 | * The #PangoEngineInfo structure contains information about a particular |
277 | * engine. It contains the following fields: |
278 | * |
279 | * Deprecated: 1.38 |
280 | */ |
281 | struct _PangoEngineInfo |
282 | { |
283 | const gchar *id; |
284 | const gchar *engine_type; |
285 | const gchar *render_type; |
286 | PangoEngineScriptInfo *scripts; |
287 | gint n_scripts; |
288 | }; |
289 | |
290 | /** |
291 | * script_engine_list: (skip) |
292 | * @engines: location to store a pointer to an array of engines. |
293 | * @n_engines: location to store the number of elements in @engines. |
294 | * |
295 | * Do not use. |
296 | * |
297 | * Deprecated: 1.38 |
298 | **/ |
299 | PANGO_DEPRECATED_IN_1_38 |
300 | void script_engine_list (PangoEngineInfo **engines, |
301 | int *n_engines); |
302 | |
303 | /** |
304 | * script_engine_init: (skip) |
305 | * @module: a #GTypeModule structure used to associate any |
306 | * GObject types created in this module with the module. |
307 | * |
308 | * Do not use. |
309 | * |
310 | * Deprecated: 1.38 |
311 | **/ |
312 | PANGO_DEPRECATED_IN_1_38 |
313 | void script_engine_init (GTypeModule *module); |
314 | |
315 | |
316 | /** |
317 | * script_engine_exit: (skip) |
318 | * |
319 | * Do not use. |
320 | * |
321 | * Deprecated: 1.38 |
322 | **/ |
323 | PANGO_DEPRECATED_IN_1_38 |
324 | void script_engine_exit (void); |
325 | |
326 | /** |
327 | * script_engine_create: (skip) |
328 | * @id: the ID of an engine as reported by script_engine_list. |
329 | * |
330 | * Do not use. |
331 | * |
332 | * Deprecated: 1.38 |
333 | **/ |
334 | PANGO_DEPRECATED_IN_1_38 |
335 | PangoEngine *script_engine_create (const char *id); |
336 | |
337 | /* Utility macro used by PANGO_ENGINE_LANG_DEFINE_TYPE and |
338 | * PANGO_ENGINE_LANG_DEFINE_TYPE |
339 | */ |
340 | #define PANGO_ENGINE_DEFINE_TYPE(name, prefix, class_init, instance_init, parent_type) \ |
341 | static GType prefix ## _type; \ |
342 | static void \ |
343 | prefix ## _register_type (GTypeModule *module) \ |
344 | { \ |
345 | const GTypeInfo object_info = \ |
346 | { \ |
347 | sizeof (name ## Class), \ |
348 | (GBaseInitFunc) NULL, \ |
349 | (GBaseFinalizeFunc) NULL, \ |
350 | (GClassInitFunc) class_init, \ |
351 | (GClassFinalizeFunc) NULL, \ |
352 | NULL, /* class_data */ \ |
353 | sizeof (name), \ |
354 | 0, /* n_prelocs */ \ |
355 | (GInstanceInitFunc) instance_init, \ |
356 | NULL /* value_table */ \ |
357 | }; \ |
358 | \ |
359 | prefix ## _type = g_type_module_register_type (module, parent_type, \ |
360 | # name, \ |
361 | &object_info, 0); \ |
362 | } |
363 | |
364 | /** |
365 | * PANGO_ENGINE_LANG_DEFINE_TYPE: |
366 | * @name: Name of the the type to register (for example:, <literal>ArabicEngineFc</literal> |
367 | * @prefix: Prefix for symbols that will be defined (for example:, <literal>arabic_engine_fc</literal> |
368 | * @class_init: (nullable): Class initialization function for the new type, or %NULL |
369 | * @instance_init: (nullable): Instance initialization function for the new type, or %NULL |
370 | * |
371 | * Outputs the necessary code for GObject type registration for a |
372 | * #PangoEngineLang class defined in a module. Two static symbols |
373 | * are defined. |
374 | * |
375 | * <programlisting> |
376 | * static GType <replaceable>prefix</replaceable>_type; |
377 | * static void <replaceable>prefix</replaceable>_register_type (GTypeModule module); |
378 | * </programlisting> |
379 | * |
380 | * The <function><replaceable>prefix</replaceable>_register_type()</function> |
381 | * function should be called in your script_engine_init() function for |
382 | * each type that your module implements, and then your script_engine_create() |
383 | * function can create instances of the object as follows: |
384 | * |
385 | * <informalexample><programlisting> |
386 | * PangoEngine *engine = g_object_new (<replaceable>prefix</replaceable>_type, NULL); |
387 | * </programlisting></informalexample> |
388 | * |
389 | * Deprecated: 1.38 |
390 | **/ |
391 | #define PANGO_ENGINE_LANG_DEFINE_TYPE(name, prefix, class_init, instance_init) \ |
392 | PANGO_ENGINE_DEFINE_TYPE (name, prefix, \ |
393 | class_init, instance_init, \ |
394 | PANGO_TYPE_ENGINE_LANG) |
395 | |
396 | /** |
397 | * PANGO_ENGINE_SHAPE_DEFINE_TYPE: |
398 | * @name: Name of the the type to register (for example:, <literal>ArabicEngineFc</literal> |
399 | * @prefix: Prefix for symbols that will be defined (for example:, <literal>arabic_engine_fc</literal> |
400 | * @class_init: (nullable): Class initialization function for the new type, or %NULL |
401 | * @instance_init: (nullable): Instance initialization function for the new type, or %NULL |
402 | * |
403 | * Outputs the necessary code for GObject type registration for a |
404 | * #PangoEngineShape class defined in a module. Two static symbols |
405 | * are defined. |
406 | * |
407 | * <programlisting> |
408 | * static GType <replaceable>prefix</replaceable>_type; |
409 | * static void <replaceable>prefix</replaceable>_register_type (GTypeModule module); |
410 | * </programlisting> |
411 | * |
412 | * The <function><replaceable>prefix</replaceable>_register_type()</function> |
413 | * function should be called in your script_engine_init() function for |
414 | * each type that your module implements, and then your script_engine_create() |
415 | * function can create instances of the object as follows: |
416 | * |
417 | * <informalexample><programlisting> |
418 | * PangoEngine *engine = g_object_new (<replaceable>prefix</replaceable>_type, NULL); |
419 | * </programlisting></informalexample> |
420 | * |
421 | * Deprecated: 1.38 |
422 | **/ |
423 | #define PANGO_ENGINE_SHAPE_DEFINE_TYPE(name, prefix, class_init, instance_init) \ |
424 | PANGO_ENGINE_DEFINE_TYPE (name, prefix, \ |
425 | class_init, instance_init, \ |
426 | PANGO_TYPE_ENGINE_SHAPE) |
427 | |
428 | /* Macro used for possibly builtin Pango modules. Not useful |
429 | * for externally build modules. If we are compiling a module standalone, |
430 | * then we name the entry points script_engine_list, etc. But if we |
431 | * are compiling it for inclusion directly in Pango, then we need them to |
432 | * to have distinct names for this module, so we prepend a prefix. |
433 | * |
434 | * The two intermediate macros are to deal with details of the C |
435 | * preprocessor; token pasting tokens must be function arguments, |
436 | * and macro substitution isn't used on function arguments that |
437 | * are used for token pasting. |
438 | */ |
439 | #ifdef PANGO_MODULE_PREFIX |
440 | #define PANGO_MODULE_ENTRY(func) _PANGO_MODULE_ENTRY2(PANGO_MODULE_PREFIX,func) |
441 | #define _PANGO_MODULE_ENTRY2(prefix,func) _PANGO_MODULE_ENTRY3(prefix,func) |
442 | #define _PANGO_MODULE_ENTRY3(prefix,func) prefix##_script_engine_##func |
443 | #else |
444 | #define PANGO_MODULE_ENTRY(func) script_engine_##func |
445 | #endif |
446 | |
447 | #endif /* PANGO_ENABLE_ENGINE */ |
448 | |
449 | G_END_DECLS |
450 | |
451 | #endif /* __PANGO_ENGINE_H__ */ |
452 | |