1 /*
2  * Copyright © 2009  Red Hat, Inc.
3  * Copyright © 2011  Codethink Limited
4  * Copyright © 2011,2012  Google, Inc.
5  *
6  *  This is part of HarfBuzz, a text shaping library.
7  *
8  * Permission is hereby granted, without written agreement and without
9  * license or royalty fees, to use, copy, modify, and distribute this
10  * software and its documentation for any purpose, provided that the
11  * above copyright notice and the following two paragraphs appear in
12  * all copies of this software.
13  *
14  * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
15  * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
16  * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
17  * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
18  * DAMAGE.
19  *
20  * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
21  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
22  * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
23  * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
24  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
25  *
26  * Red Hat Author(s): Behdad Esfahbod
27  * Codethink Author(s): Ryan Lortie
28  * Google Author(s): Behdad Esfahbod
29  */
30 
31 #if !defined(HB_H_IN) && !defined(HB_NO_SINGLE_HEADER_ERROR)
32 #error "Include <hb.h> instead."
33 #endif
34 
35 #ifndef HB_UNICODE_H
36 #define HB_UNICODE_H
37 
38 #include "hb-common.h"
39 
40 HB_BEGIN_DECLS
41 
42 
43 /**
44  * HB_UNICODE_MAX:
45  *
46  * Maximum valid Unicode code point.
47  *
48  * Since: 1.9.0
49  **/
50 #define HB_UNICODE_MAX 0x10FFFFu
51 
52 
53 /**
54  * hb_unicode_general_category_t:
55  * @HB_UNICODE_GENERAL_CATEGORY_CONTROL:              [Cc]
56  * @HB_UNICODE_GENERAL_CATEGORY_FORMAT:		      [Cf]
57  * @HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED:	      [Cn]
58  * @HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE:	      [Co]
59  * @HB_UNICODE_GENERAL_CATEGORY_SURROGATE:	      [Cs]
60  * @HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER:     [Ll]
61  * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER:      [Lm]
62  * @HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER:	      [Lo]
63  * @HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER:     [Lt]
64  * @HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER:     [Lu]
65  * @HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK:	      [Mc]
66  * @HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK:	      [Me]
67  * @HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK:     [Mn]
68  * @HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER:	      [Nd]
69  * @HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER:	      [Nl]
70  * @HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER:	      [No]
71  * @HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION:  [Pc]
72  * @HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION:     [Pd]
73  * @HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION:    [Pe]
74  * @HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION:    [Pf]
75  * @HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION:  [Pi]
76  * @HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION:    [Po]
77  * @HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION:     [Ps]
78  * @HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL:      [Sc]
79  * @HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL:      [Sk]
80  * @HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL:	      [Sm]
81  * @HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL:	      [So]
82  * @HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR:	      [Zl]
83  * @HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR:  [Zp]
84  * @HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR:      [Zs]
85  *
86  * Data type for the "General_Category" (gc) property from
87  * the Unicode Character Database.
88  **/
89 
90 /* Unicode Character Database property: General_Category (gc) */
91 typedef enum
92 {
93   HB_UNICODE_GENERAL_CATEGORY_CONTROL,			/* Cc */
94   HB_UNICODE_GENERAL_CATEGORY_FORMAT,			/* Cf */
95   HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED,		/* Cn */
96   HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE,		/* Co */
97   HB_UNICODE_GENERAL_CATEGORY_SURROGATE,		/* Cs */
98   HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER,		/* Ll */
99   HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER,		/* Lm */
100   HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER,		/* Lo */
101   HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER,		/* Lt */
102   HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER,		/* Lu */
103   HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK,		/* Mc */
104   HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK,		/* Me */
105   HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK,		/* Mn */
106   HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER,		/* Nd */
107   HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER,		/* Nl */
108   HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER,		/* No */
109   HB_UNICODE_GENERAL_CATEGORY_CONNECT_PUNCTUATION,	/* Pc */
110   HB_UNICODE_GENERAL_CATEGORY_DASH_PUNCTUATION,		/* Pd */
111   HB_UNICODE_GENERAL_CATEGORY_CLOSE_PUNCTUATION,	/* Pe */
112   HB_UNICODE_GENERAL_CATEGORY_FINAL_PUNCTUATION,	/* Pf */
113   HB_UNICODE_GENERAL_CATEGORY_INITIAL_PUNCTUATION,	/* Pi */
114   HB_UNICODE_GENERAL_CATEGORY_OTHER_PUNCTUATION,	/* Po */
115   HB_UNICODE_GENERAL_CATEGORY_OPEN_PUNCTUATION,		/* Ps */
116   HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL,		/* Sc */
117   HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL,		/* Sk */
118   HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL,		/* Sm */
119   HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL,		/* So */
120   HB_UNICODE_GENERAL_CATEGORY_LINE_SEPARATOR,		/* Zl */
121   HB_UNICODE_GENERAL_CATEGORY_PARAGRAPH_SEPARATOR,	/* Zp */
122   HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR		/* Zs */
123 } hb_unicode_general_category_t;
124 
125 /**
126  * hb_unicode_combining_class_t:
127  * @HB_UNICODE_COMBINING_CLASS_NOT_REORDERED: Spacing and enclosing marks; also many vowel and consonant signs, even if nonspacing
128  * @HB_UNICODE_COMBINING_CLASS_OVERLAY: Marks which overlay a base letter or symbol
129  * @HB_UNICODE_COMBINING_CLASS_NUKTA: Diacritic nukta marks in Brahmi-derived scripts
130  * @HB_UNICODE_COMBINING_CLASS_KANA_VOICING: Hiragana/Katakana voicing marks
131  * @HB_UNICODE_COMBINING_CLASS_VIRAMA: Viramas
132  * @HB_UNICODE_COMBINING_CLASS_CCC10: [Hebrew]
133  * @HB_UNICODE_COMBINING_CLASS_CCC11: [Hebrew]
134  * @HB_UNICODE_COMBINING_CLASS_CCC12: [Hebrew]
135  * @HB_UNICODE_COMBINING_CLASS_CCC13: [Hebrew]
136  * @HB_UNICODE_COMBINING_CLASS_CCC14: [Hebrew]
137  * @HB_UNICODE_COMBINING_CLASS_CCC15: [Hebrew]
138  * @HB_UNICODE_COMBINING_CLASS_CCC16: [Hebrew]
139  * @HB_UNICODE_COMBINING_CLASS_CCC17: [Hebrew]
140  * @HB_UNICODE_COMBINING_CLASS_CCC18: [Hebrew]
141  * @HB_UNICODE_COMBINING_CLASS_CCC19: [Hebrew]
142  * @HB_UNICODE_COMBINING_CLASS_CCC20: [Hebrew]
143  * @HB_UNICODE_COMBINING_CLASS_CCC21: [Hebrew]
144  * @HB_UNICODE_COMBINING_CLASS_CCC22: [Hebrew]
145  * @HB_UNICODE_COMBINING_CLASS_CCC23: [Hebrew]
146  * @HB_UNICODE_COMBINING_CLASS_CCC24: [Hebrew]
147  * @HB_UNICODE_COMBINING_CLASS_CCC25: [Hebrew]
148  * @HB_UNICODE_COMBINING_CLASS_CCC26: [Hebrew]
149  * @HB_UNICODE_COMBINING_CLASS_CCC27: [Arabic]
150  * @HB_UNICODE_COMBINING_CLASS_CCC28: [Arabic]
151  * @HB_UNICODE_COMBINING_CLASS_CCC29: [Arabic]
152  * @HB_UNICODE_COMBINING_CLASS_CCC30: [Arabic]
153  * @HB_UNICODE_COMBINING_CLASS_CCC31: [Arabic]
154  * @HB_UNICODE_COMBINING_CLASS_CCC32: [Arabic]
155  * @HB_UNICODE_COMBINING_CLASS_CCC33: [Arabic]
156  * @HB_UNICODE_COMBINING_CLASS_CCC34: [Arabic]
157  * @HB_UNICODE_COMBINING_CLASS_CCC35: [Arabic]
158  * @HB_UNICODE_COMBINING_CLASS_CCC36: [Syriac]
159  * @HB_UNICODE_COMBINING_CLASS_CCC84: [Telugu]
160  * @HB_UNICODE_COMBINING_CLASS_CCC91: [Telugu]
161  * @HB_UNICODE_COMBINING_CLASS_CCC103: [Thai]
162  * @HB_UNICODE_COMBINING_CLASS_CCC107: [Thai]
163  * @HB_UNICODE_COMBINING_CLASS_CCC118: [Lao]
164  * @HB_UNICODE_COMBINING_CLASS_CCC122: [Lao]
165  * @HB_UNICODE_COMBINING_CLASS_CCC129: [Tibetan]
166  * @HB_UNICODE_COMBINING_CLASS_CCC130: [Tibetan]
167  * @HB_UNICODE_COMBINING_CLASS_CCC133: [Tibetan]
168  * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: Marks attached at the bottom left
169  * @HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: Marks attached directly below
170  * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: Marks attached directly above
171  * @HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: Marks attached at the top right
172  * @HB_UNICODE_COMBINING_CLASS_BELOW_LEFT: Distinct marks at the bottom left
173  * @HB_UNICODE_COMBINING_CLASS_BELOW: Distinct marks directly below
174  * @HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: Distinct marks at the bottom right
175  * @HB_UNICODE_COMBINING_CLASS_LEFT: Distinct marks to the left
176  * @HB_UNICODE_COMBINING_CLASS_RIGHT: Distinct marks to the right
177  * @HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT: Distinct marks at the top left
178  * @HB_UNICODE_COMBINING_CLASS_ABOVE: Distinct marks directly above
179  * @HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT: Distinct marks at the top right
180  * @HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW: Distinct marks subtending two bases
181  * @HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE: Distinct marks extending above two bases
182  * @HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT: Greek iota subscript only
183  * @HB_UNICODE_COMBINING_CLASS_INVALID: Invalid combining class
184  *
185  * Data type for the Canonical_Combining_Class (ccc) property
186  * from the Unicode Character Database.
187  *
188  * <note>Note: newer versions of Unicode may add new values.
189  * Client programs should be ready to handle any value in the 0..254 range
190  * being returned from hb_unicode_combining_class().</note>
191  *
192  **/
193 typedef enum
194 {
195   HB_UNICODE_COMBINING_CLASS_NOT_REORDERED	= 0,
196   HB_UNICODE_COMBINING_CLASS_OVERLAY		= 1,
197   HB_UNICODE_COMBINING_CLASS_NUKTA		= 7,
198   HB_UNICODE_COMBINING_CLASS_KANA_VOICING	= 8,
199   HB_UNICODE_COMBINING_CLASS_VIRAMA		= 9,
200 
201   /* Hebrew */
202   HB_UNICODE_COMBINING_CLASS_CCC10	=  10,
203   HB_UNICODE_COMBINING_CLASS_CCC11	=  11,
204   HB_UNICODE_COMBINING_CLASS_CCC12	=  12,
205   HB_UNICODE_COMBINING_CLASS_CCC13	=  13,
206   HB_UNICODE_COMBINING_CLASS_CCC14	=  14,
207   HB_UNICODE_COMBINING_CLASS_CCC15	=  15,
208   HB_UNICODE_COMBINING_CLASS_CCC16	=  16,
209   HB_UNICODE_COMBINING_CLASS_CCC17	=  17,
210   HB_UNICODE_COMBINING_CLASS_CCC18	=  18,
211   HB_UNICODE_COMBINING_CLASS_CCC19	=  19,
212   HB_UNICODE_COMBINING_CLASS_CCC20	=  20,
213   HB_UNICODE_COMBINING_CLASS_CCC21	=  21,
214   HB_UNICODE_COMBINING_CLASS_CCC22	=  22,
215   HB_UNICODE_COMBINING_CLASS_CCC23	=  23,
216   HB_UNICODE_COMBINING_CLASS_CCC24	=  24,
217   HB_UNICODE_COMBINING_CLASS_CCC25	=  25,
218   HB_UNICODE_COMBINING_CLASS_CCC26	=  26,
219 
220   /* Arabic */
221   HB_UNICODE_COMBINING_CLASS_CCC27	=  27,
222   HB_UNICODE_COMBINING_CLASS_CCC28	=  28,
223   HB_UNICODE_COMBINING_CLASS_CCC29	=  29,
224   HB_UNICODE_COMBINING_CLASS_CCC30	=  30,
225   HB_UNICODE_COMBINING_CLASS_CCC31	=  31,
226   HB_UNICODE_COMBINING_CLASS_CCC32	=  32,
227   HB_UNICODE_COMBINING_CLASS_CCC33	=  33,
228   HB_UNICODE_COMBINING_CLASS_CCC34	=  34,
229   HB_UNICODE_COMBINING_CLASS_CCC35	=  35,
230 
231   /* Syriac */
232   HB_UNICODE_COMBINING_CLASS_CCC36	=  36,
233 
234   /* Telugu */
235   HB_UNICODE_COMBINING_CLASS_CCC84	=  84,
236   HB_UNICODE_COMBINING_CLASS_CCC91	=  91,
237 
238   /* Thai */
239   HB_UNICODE_COMBINING_CLASS_CCC103	= 103,
240   HB_UNICODE_COMBINING_CLASS_CCC107	= 107,
241 
242   /* Lao */
243   HB_UNICODE_COMBINING_CLASS_CCC118	= 118,
244   HB_UNICODE_COMBINING_CLASS_CCC122	= 122,
245 
246   /* Tibetan */
247   HB_UNICODE_COMBINING_CLASS_CCC129	= 129,
248   HB_UNICODE_COMBINING_CLASS_CCC130	= 130,
249   HB_UNICODE_COMBINING_CLASS_CCC133	= 132,
250 
251 
252   HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT	= 200,
253   HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW		= 202,
254   HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE		= 214,
255   HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT	= 216,
256   HB_UNICODE_COMBINING_CLASS_BELOW_LEFT			= 218,
257   HB_UNICODE_COMBINING_CLASS_BELOW			= 220,
258   HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT		= 222,
259   HB_UNICODE_COMBINING_CLASS_LEFT			= 224,
260   HB_UNICODE_COMBINING_CLASS_RIGHT			= 226,
261   HB_UNICODE_COMBINING_CLASS_ABOVE_LEFT			= 228,
262   HB_UNICODE_COMBINING_CLASS_ABOVE			= 230,
263   HB_UNICODE_COMBINING_CLASS_ABOVE_RIGHT		= 232,
264   HB_UNICODE_COMBINING_CLASS_DOUBLE_BELOW		= 233,
265   HB_UNICODE_COMBINING_CLASS_DOUBLE_ABOVE		= 234,
266 
267   HB_UNICODE_COMBINING_CLASS_IOTA_SUBSCRIPT		= 240,
268 
269   HB_UNICODE_COMBINING_CLASS_INVALID	= 255
270 } hb_unicode_combining_class_t;
271 
272 
273 /*
274  * hb_unicode_funcs_t
275  */
276 
277 /**
278  * hb_unicode_funcs_t:
279  *
280  * Data type containing a set of virtual methods used for
281  * accessing various Unicode character properties.
282  *
283  * HarfBuzz provides a default function for each of the
284  * methods in #hb_unicode_funcs_t. Client programs can implement
285  * their own replacements for the individual Unicode functions, as
286  * needed, and replace the default by calling the setter for a
287  * method.
288  **/
289 typedef struct hb_unicode_funcs_t hb_unicode_funcs_t;
290 
291 
292 /*
293  * just give me the best implementation you've got there.
294  */
295 HB_EXTERN hb_unicode_funcs_t *
296 hb_unicode_funcs_get_default (void);
297 
298 
299 HB_EXTERN hb_unicode_funcs_t *
300 hb_unicode_funcs_create (hb_unicode_funcs_t *parent);
301 
302 HB_EXTERN hb_unicode_funcs_t *
303 hb_unicode_funcs_get_empty (void);
304 
305 HB_EXTERN hb_unicode_funcs_t *
306 hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs);
307 
308 HB_EXTERN void
309 hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs);
310 
311 HB_EXTERN hb_bool_t
312 hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs,
313 				hb_user_data_key_t *key,
314 				void *              data,
315 				hb_destroy_func_t   destroy,
316 				hb_bool_t           replace);
317 
318 
319 HB_EXTERN void *
320 hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs,
321 				hb_user_data_key_t *key);
322 
323 
324 HB_EXTERN void
325 hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs);
326 
327 HB_EXTERN hb_bool_t
328 hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs);
329 
330 HB_EXTERN hb_unicode_funcs_t *
331 hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs);
332 
333 
334 /*
335  * funcs
336  */
337 
338 /* typedefs */
339 
340 /**
341  * hb_unicode_combining_class_func_t:
342  * @ufuncs: A Unicode-functions structure
343  * @unicode: The code point to query
344  * @user_data: User data pointer passed by the caller
345  *
346  * A virtual method for the #hb_unicode_funcs_t structure.
347  *
348  * This method should retrieve the Canonical Combining Class (ccc)
349  * property for a specified Unicode code point.
350  *
351  * Return value: The #hb_unicode_combining_class_t of @unicode
352  *
353  **/
354 typedef hb_unicode_combining_class_t	(*hb_unicode_combining_class_func_t)	(hb_unicode_funcs_t *ufuncs,
355 										 hb_codepoint_t      unicode,
356 										 void               *user_data);
357 
358 /**
359  * hb_unicode_general_category_func_t:
360  * @ufuncs: A Unicode-functions structure
361  * @unicode: The code point to query
362  * @user_data: User data pointer passed by the caller
363  *
364  * A virtual method for the #hb_unicode_funcs_t structure.
365  *
366  * This method should retrieve the General Category property for
367  * a specified Unicode code point.
368  *
369  * Return value: The #hb_unicode_general_category_t of @unicode
370  *
371  **/
372 typedef hb_unicode_general_category_t	(*hb_unicode_general_category_func_t)	(hb_unicode_funcs_t *ufuncs,
373 										 hb_codepoint_t      unicode,
374 										 void               *user_data);
375 
376 /**
377  * hb_unicode_mirroring_func_t:
378  * @ufuncs: A Unicode-functions structure
379  * @unicode: The code point to query
380  * @user_data: User data pointer passed by the caller
381  *
382  * A virtual method for the #hb_unicode_funcs_t structure.
383  *
384  * This method should retrieve the Bi-Directional Mirroring Glyph
385  * code point for a specified Unicode code point.
386  *
387  * <note>Note: If a code point does not have a specified
388  * Bi-Directional Mirroring Glyph defined, the method should
389  * return the original code point.</note>
390  *
391  * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
392  *
393  **/
394 typedef hb_codepoint_t			(*hb_unicode_mirroring_func_t)		(hb_unicode_funcs_t *ufuncs,
395 										 hb_codepoint_t      unicode,
396 										 void               *user_data);
397 
398 /**
399  * hb_unicode_script_func_t:
400  * @ufuncs: A Unicode-functions structure
401  * @unicode: The code point to query
402  * @user_data: User data pointer passed by the caller
403  *
404  * A virtual method for the #hb_unicode_funcs_t structure.
405  *
406  * This method should retrieve the Script property for a
407  * specified Unicode code point.
408  *
409  * Return value: The #hb_script_t of @unicode
410  *
411  **/
412 typedef hb_script_t			(*hb_unicode_script_func_t)		(hb_unicode_funcs_t *ufuncs,
413 										 hb_codepoint_t      unicode,
414 										 void               *user_data);
415 
416 /**
417  * hb_unicode_compose_func_t:
418  * @ufuncs: A Unicode-functions structure
419  * @a: The first code point to compose
420  * @b: The second code point to compose
421  * @ab: (out): The composed code point
422  * @user_data: user data pointer passed by the caller
423  *
424  * A virtual method for the #hb_unicode_funcs_t structure.
425  *
426  * This method should compose a sequence of two input Unicode code
427  * points by canonical equivalence, returning the composed code
428  * point in a #hb_codepoint_t output parameter (if successful).
429  * The method must return an #hb_bool_t indicating the success
430  * of the composition.
431  *
432  * Return value: %true is @a,@b composed, %false otherwise
433  *
434  **/
435 typedef hb_bool_t			(*hb_unicode_compose_func_t)		(hb_unicode_funcs_t *ufuncs,
436 										 hb_codepoint_t      a,
437 										 hb_codepoint_t      b,
438 										 hb_codepoint_t     *ab,
439 										 void               *user_data);
440 
441 /**
442  * hb_unicode_decompose_func_t:
443  * @ufuncs: A Unicode-functions structure
444  * @ab: The code point to decompose
445  * @a: (out): The first decomposed code point
446  * @b: (out): The second decomposed code point
447  * @user_data: user data pointer passed by the caller
448  *
449  * A virtual method for the #hb_unicode_funcs_t structure.
450  *
451  * This method should decompose an input Unicode code point,
452  * returning the two decomposed code points in #hb_codepoint_t
453  * output parameters (if successful). The method must return an
454  * #hb_bool_t indicating the success of the composition.
455  *
456  * Return value: %true if @ab decomposed, %false otherwise
457  *
458  **/
459 typedef hb_bool_t			(*hb_unicode_decompose_func_t)		(hb_unicode_funcs_t *ufuncs,
460 										 hb_codepoint_t      ab,
461 										 hb_codepoint_t     *a,
462 										 hb_codepoint_t     *b,
463 										 void               *user_data);
464 
465 /* func setters */
466 
467 /**
468  * hb_unicode_funcs_set_combining_class_func:
469  * @ufuncs: A Unicode-functions structure
470  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
471  * @user_data: Data to pass to @func
472  * @destroy: (nullable): The function to call when @user_data is not needed anymore
473  *
474  * Sets the implementation function for #hb_unicode_combining_class_func_t.
475  *
476  * Since: 0.9.2
477  **/
478 HB_EXTERN void
479 hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs,
480 					   hb_unicode_combining_class_func_t func,
481 					   void *user_data, hb_destroy_func_t destroy);
482 
483 /**
484  * hb_unicode_funcs_set_general_category_func:
485  * @ufuncs: A Unicode-functions structure
486  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
487  * @user_data: Data to pass to @func
488  * @destroy: (nullable): The function to call when @user_data is not needed anymore
489  *
490  * Sets the implementation function for #hb_unicode_general_category_func_t.
491  *
492  * Since: 0.9.2
493  **/
494 HB_EXTERN void
495 hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs,
496 					    hb_unicode_general_category_func_t func,
497 					    void *user_data, hb_destroy_func_t destroy);
498 
499 /**
500  * hb_unicode_funcs_set_mirroring_func:
501  * @ufuncs: A Unicode-functions structure
502  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
503  * @user_data: Data to pass to @func
504  * @destroy: (nullable): The function to call when @user_data is not needed anymore
505  *
506  * Sets the implementation function for #hb_unicode_mirroring_func_t.
507  *
508  * Since: 0.9.2
509  **/
510 HB_EXTERN void
511 hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs,
512 				     hb_unicode_mirroring_func_t func,
513 				     void *user_data, hb_destroy_func_t destroy);
514 
515 /**
516  * hb_unicode_funcs_set_script_func:
517  * @ufuncs: A Unicode-functions structure
518  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
519  * @user_data: Data to pass to @func
520  * @destroy: (nullable): The function to call when @user_data is not needed anymore
521  *
522  * Sets the implementation function for #hb_unicode_script_func_t.
523  *
524  * Since: 0.9.2
525  **/
526 HB_EXTERN void
527 hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs,
528 				  hb_unicode_script_func_t func,
529 				  void *user_data, hb_destroy_func_t destroy);
530 
531 /**
532  * hb_unicode_funcs_set_compose_func:
533  * @ufuncs: A Unicode-functions structure
534  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
535  * @user_data: Data to pass to @func
536  * @destroy: (nullable): The function to call when @user_data is not needed anymore
537  *
538  * Sets the implementation function for #hb_unicode_compose_func_t.
539  *
540  * Since: 0.9.2
541  **/
542 HB_EXTERN void
543 hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs,
544 				   hb_unicode_compose_func_t func,
545 				   void *user_data, hb_destroy_func_t destroy);
546 
547 /**
548  * hb_unicode_funcs_set_decompose_func:
549  * @ufuncs: A Unicode-functions structure
550  * @func: (closure user_data) (destroy destroy) (scope notified): The callback function to assign
551  * @user_data: Data to pass to @func
552  * @destroy: (nullable): The function to call when @user_data is not needed anymore
553  *
554  * Sets the implementation function for #hb_unicode_decompose_func_t.
555  *
556  * Since: 0.9.2
557  **/
558 HB_EXTERN void
559 hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs,
560 				     hb_unicode_decompose_func_t func,
561 				     void *user_data, hb_destroy_func_t destroy);
562 
563 /* accessors */
564 
565 /**
566  * hb_unicode_combining_class:
567  * @ufuncs: The Unicode-functions structure
568  * @unicode: The code point to query
569  *
570  * Retrieves the Canonical Combining Class (ccc) property
571  * of code point @unicode.
572  *
573  * Return value: The #hb_unicode_combining_class_t of @unicode
574  *
575  * Since: 0.9.2
576  **/
577 HB_EXTERN hb_unicode_combining_class_t
578 hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs,
579 			    hb_codepoint_t unicode);
580 
581 /**
582  * hb_unicode_general_category:
583  * @ufuncs: The Unicode-functions structure
584  * @unicode: The code point to query
585  *
586  * Retrieves the General Category (gc) property
587  * of code point @unicode.
588  *
589  * Return value: The #hb_unicode_general_category_t of @unicode
590  *
591  * Since: 0.9.2
592  **/
593 HB_EXTERN hb_unicode_general_category_t
594 hb_unicode_general_category (hb_unicode_funcs_t *ufuncs,
595 			     hb_codepoint_t unicode);
596 
597 /**
598  * hb_unicode_mirroring:
599  * @ufuncs: The Unicode-functions structure
600  * @unicode: The code point to query
601  *
602  * Retrieves the Bi-directional Mirroring Glyph code
603  * point defined for code point @unicode.
604  *
605  * Return value: The #hb_codepoint_t of the Mirroring Glyph for @unicode
606  *
607  * Since: 0.9.2
608  **/
609 HB_EXTERN hb_codepoint_t
610 hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs,
611 		      hb_codepoint_t unicode);
612 
613 /**
614  * hb_unicode_script:
615  * @ufuncs: The Unicode-functions structure
616  * @unicode: The code point to query
617  *
618  * Retrieves the #hb_script_t script to which code
619  * point @unicode belongs.
620  *
621  * Return value: The #hb_script_t of @unicode
622  *
623  * Since: 0.9.2
624  **/
625 HB_EXTERN hb_script_t
626 hb_unicode_script (hb_unicode_funcs_t *ufuncs,
627 		   hb_codepoint_t unicode);
628 
629 HB_EXTERN hb_bool_t
630 hb_unicode_compose (hb_unicode_funcs_t *ufuncs,
631 		    hb_codepoint_t      a,
632 		    hb_codepoint_t      b,
633 		    hb_codepoint_t     *ab);
634 
635 HB_EXTERN hb_bool_t
636 hb_unicode_decompose (hb_unicode_funcs_t *ufuncs,
637 		      hb_codepoint_t      ab,
638 		      hb_codepoint_t     *a,
639 		      hb_codepoint_t     *b);
640 
641 HB_END_DECLS
642 
643 #endif /* HB_UNICODE_H */
644