1 /* Pango
2  * pango-ot.h:
3  *
4  * Copyright (C) 2000,2007 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_OT_H__
23 #define __PANGO_OT_H__
24 
25 /* Deprecated.  Use HarfBuzz directly! */
26 
27 #include <pango/pangofc-font.h>
28 #include <pango/pango-glyph.h>
29 #include <pango/pango-font.h>
30 #include <pango/pango-script.h>
31 #include <pango/pango-language.h>
32 
33 #include <ft2build.h>
34 #include FT_FREETYPE_H
35 
36 G_BEGIN_DECLS
37 
38 #ifndef PANGO_DISABLE_DEPRECATED
39 
40 /**
41  * PangoOTTag:
42  *
43  * The `PangoOTTag` typedef is used to represent TrueType and OpenType
44  * four letter tags inside Pango. Use PANGO_OT_TAG_MAKE()
45  * or PANGO_OT_TAG_MAKE_FROM_STRING() macros to create PangoOTTags manually.
46  */
47 typedef guint32 PangoOTTag;
48 
49 /**
50  * PANGO_OT_TAG_MAKE:
51  * @c1: First character.
52  * @c2: Second character.
53  * @c3: Third character.
54  * @c4: Fourth character.
55  *
56  * Creates a `PangoOTTag` from four characters.  This is similar and
57  * compatible with the FT_MAKE_TAG() macro from FreeType.
58  */
59 /**
60  * PANGO_OT_TAG_MAKE_FROM_STRING:
61  * @s: The string representation of the tag.
62  *
63  * Creates a `PangoOTTag` from a string. The string should be at least
64  * four characters long (pad with space characters if needed), and need
65  * not be nul-terminated.  This is a convenience wrapper around
66  * PANGO_OT_TAG_MAKE(), but cannot be used in certain situations, for
67  * example, as a switch expression, as it dereferences pointers.
68  */
69 #define PANGO_OT_TAG_MAKE(c1,c2,c3,c4)		((PangoOTTag) FT_MAKE_TAG (c1, c2, c3, c4))
70 #define PANGO_OT_TAG_MAKE_FROM_STRING(s)	(PANGO_OT_TAG_MAKE(((const char *) s)[0], \
71 								   ((const char *) s)[1], \
72 								   ((const char *) s)[2], \
73 								   ((const char *) s)[3]))
74 
75 typedef struct _PangoOTInfo       PangoOTInfo;
76 typedef struct _PangoOTBuffer     PangoOTBuffer;
77 typedef struct _PangoOTGlyph      PangoOTGlyph;
78 typedef struct _PangoOTRuleset    PangoOTRuleset;
79 typedef struct _PangoOTFeatureMap PangoOTFeatureMap;
80 typedef struct _PangoOTRulesetDescription PangoOTRulesetDescription;
81 
82 /**
83  * PangoOTTableType:
84  * @PANGO_OT_TABLE_GSUB: The GSUB table.
85  * @PANGO_OT_TABLE_GPOS: The GPOS table.
86  *
87  * The PangoOTTableType enumeration values are used to
88  * identify the various OpenType tables in the
89  * pango_ot_info_… functions.
90  */
91 typedef enum
92 {
93   PANGO_OT_TABLE_GSUB,
94   PANGO_OT_TABLE_GPOS
95 } PangoOTTableType;
96 
97 /**
98  * PANGO_OT_ALL_GLYPHS:
99  *
100  * This is used as the property bit in pango_ot_ruleset_add_feature() when a
101  * feature should be applied to all glyphs.
102  *
103  * Since: 1.16
104  */
105 /**
106  * PANGO_OT_NO_FEATURE:
107  *
108  * This is used as a feature index that represent no feature, that is, should be
109  * skipped.  It may be returned as feature index by pango_ot_info_find_feature()
110  * if the feature is not found, and pango_ot_ruleset_add_feature() function
111  * automatically skips this value, so no special handling is required by the user.
112  *
113  * Since: 1.18
114  */
115 /**
116  * PANGO_OT_NO_SCRIPT:
117  *
118  * This is used as a script index that represent no script, that is, when the
119  * requested script was not found, and a default ('DFLT') script was not found
120  * either.  It may be returned as script index by pango_ot_info_find_script()
121  * if the script or a default script are not found, all other functions
122  * taking a script index essentially return if the input script index is
123  * this value, so no special handling is required by the user.
124  *
125  * Since: 1.18
126  */
127 /**
128  * PANGO_OT_DEFAULT_LANGUAGE:
129  *
130  * This is used as the language index in pango_ot_info_find_feature() when
131  * the default language system of the script is desired.
132  *
133  * It is also returned by pango_ot_info_find_language() if the requested language
134  * is not found, or the requested language tag was PANGO_OT_TAG_DEFAULT_LANGUAGE.
135  * The end result is that one can always call pango_ot_tag_from_language()
136  * followed by pango_ot_info_find_language() and pass the result to
137  * pango_ot_info_find_feature() without having to worry about falling back to
138  * default language system explicitly.
139  *
140  * Since: 1.16
141  */
142 #define PANGO_OT_ALL_GLYPHS			((guint) 0xFFFF)
143 #define PANGO_OT_NO_FEATURE			((guint) 0xFFFF)
144 #define PANGO_OT_NO_SCRIPT			((guint) 0xFFFF)
145 #define PANGO_OT_DEFAULT_LANGUAGE		((guint) 0xFFFF)
146 
147 /**
148  * PANGO_OT_TAG_DEFAULT_SCRIPT:
149  *
150  * This is a `PangoOTTag` representing the special script tag 'DFLT'.  It is
151  * returned as script tag by pango_ot_tag_from_script() if the requested script
152  * is not found.
153  *
154  * Since: 1.18
155  */
156 /**
157  * PANGO_OT_TAG_DEFAULT_LANGUAGE:
158  *
159  * This is a `PangoOTTag` representing a special language tag 'dflt'.  It is
160  * returned as language tag by pango_ot_tag_from_language() if the requested
161  * language is not found.  It is safe to pass this value to
162  * pango_ot_info_find_language() as that function falls back to returning default
163  * language-system if the requested language tag is not found.
164  *
165  * Since: 1.18
166  */
167 #define PANGO_OT_TAG_DEFAULT_SCRIPT		PANGO_OT_TAG_MAKE ('D', 'F', 'L', 'T')
168 #define PANGO_OT_TAG_DEFAULT_LANGUAGE		PANGO_OT_TAG_MAKE ('d', 'f', 'l', 't')
169 
170 /* Note that this must match hb_glyph_info_t */
171 /**
172  * PangoOTGlyph:
173  * @glyph: the glyph itself.
174  * @properties: the properties value, identifying which features should be
175  * applied on this glyph.  See pango_ot_ruleset_add_feature().
176  * @cluster: the cluster that this glyph belongs to.
177  * @component: a component value, set by the OpenType layout engine.
178  * @ligID: a ligature index value, set by the OpenType layout engine.
179  * @internal: for Pango internal use
180  *
181  * The `PangoOTGlyph` structure represents a single glyph together with
182  * information used for OpenType layout processing of the glyph.
183  * It contains the following fields.
184  */
185 struct _PangoOTGlyph
186 {
187   guint32  glyph;
188   guint    properties;
189   guint    cluster;
190   gushort  component;
191   gushort  ligID;
192 
193   guint    internal;
194 };
195 
196 /**
197  * PangoOTFeatureMap:
198  * @feature_name: feature tag in represented as four-letter ASCII string.
199  * @property_bit: the property bit to use for this feature.  See
200  * pango_ot_ruleset_add_feature() for details.
201  *
202  * The `PangoOTFeatureMap` typedef is used to represent an OpenType
203  * feature with the property bit associated with it.  The feature tag is
204  * represented as a char array instead of a `PangoOTTag` for convenience.
205  *
206  * Since: 1.18
207  */
208 struct _PangoOTFeatureMap
209 {
210   char     feature_name[5];
211   gulong   property_bit;
212 };
213 
214 /**
215  * PangoOTRulesetDescription:
216  * @script: a `PangoScript`
217  * @language: a `PangoLanguage`
218  * @static_gsub_features: (nullable): static map of GSUB features
219  * @n_static_gsub_features: length of @static_gsub_features, or 0.
220  * @static_gpos_features: (nullable): static map of GPOS features
221  * @n_static_gpos_features: length of @static_gpos_features, or 0.
222  * @other_features: (nullable): map of extra features to add to both
223  *   GSUB and GPOS. Unlike the static maps, this pointer need not
224  *   live beyond the life of function calls taking this struct.
225  * @n_other_features: length of @other_features, or 0.
226  *
227  * The `PangoOTRuleset` structure holds all the information needed
228  * to build a complete `PangoOTRuleset` from an OpenType font.
229  * The main use of this struct is to act as the key for a per-font
230  * hash of rulesets.  The user populates a ruleset description and
231  * gets the ruleset using pango_ot_ruleset_get_for_description()
232  * or create a new one using pango_ot_ruleset_new_from_description().
233  *
234  * Since: 1.18
235  */
236 struct _PangoOTRulesetDescription {
237   PangoScript               script;
238   PangoLanguage            *language;
239   const PangoOTFeatureMap  *static_gsub_features;
240   guint                   n_static_gsub_features;
241   const PangoOTFeatureMap  *static_gpos_features;
242   guint                   n_static_gpos_features;
243   const PangoOTFeatureMap  *other_features;
244   guint                   n_other_features;
245 };
246 
247 #ifdef __GI_SCANNER__
248 #define PANGO_OT_TYPE_INFO              (pango_ot_info_get_type ())
249 #define PANGO_OT_INFO(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_OT_TYPE_INFO, PangoOTInfo))
250 #define PANGO_OT_IS_INFO(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_OT_TYPE_INFO))
251 #else
252 #define PANGO_TYPE_OT_INFO              (pango_ot_info_get_type ())
253 #define PANGO_OT_INFO(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_OT_INFO, PangoOTInfo))
254 #define PANGO_IS_OT_INFO(object)        (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_INFO))
255 #endif
256 
257 PANGO_DEPRECATED
258 GType pango_ot_info_get_type (void) G_GNUC_CONST;
259 
260 #ifdef __GI_SCANNER__
261 #define PANGO_OT_TYPE_RULESET           (pango_ot_ruleset_get_type ())
262 #define PANGO_OT_RULESET(object)        (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_OT_TYPE_RULESET, PangoOTRuleset))
263 #define PANGO_OT_IS_RULESET(object)     (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_OT_TYPE_RULESET))
264 #else
265 #define PANGO_TYPE_OT_RULESET           (pango_ot_ruleset_get_type ())
266 #define PANGO_OT_RULESET(object)        (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_OT_RULESET, PangoOTRuleset))
267 #define PANGO_IS_OT_RULESET(object)     (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_OT_RULESET))
268 #endif
269 
270 PANGO_DEPRECATED
271 GType pango_ot_ruleset_get_type (void) G_GNUC_CONST;
272 
273 
274 PANGO_DEPRECATED
275 PangoOTInfo *pango_ot_info_get (FT_Face face);
276 
277 PANGO_DEPRECATED
278 gboolean pango_ot_info_find_script   (PangoOTInfo      *info,
279 				      PangoOTTableType  table_type,
280 				      PangoOTTag        script_tag,
281 				      guint            *script_index);
282 
283 PANGO_DEPRECATED
284 gboolean pango_ot_info_find_language (PangoOTInfo      *info,
285 				      PangoOTTableType  table_type,
286 				      guint             script_index,
287 				      PangoOTTag        language_tag,
288 				      guint            *language_index,
289 				      guint            *required_feature_index);
290 PANGO_DEPRECATED
291 gboolean pango_ot_info_find_feature  (PangoOTInfo      *info,
292 				      PangoOTTableType  table_type,
293 				      PangoOTTag        feature_tag,
294 				      guint             script_index,
295 				      guint             language_index,
296 				      guint            *feature_index);
297 
298 PANGO_DEPRECATED
299 PangoOTTag *pango_ot_info_list_scripts   (PangoOTInfo      *info,
300 					  PangoOTTableType  table_type);
301 PANGO_DEPRECATED
302 PangoOTTag *pango_ot_info_list_languages (PangoOTInfo      *info,
303 					  PangoOTTableType  table_type,
304 					  guint             script_index,
305 					  PangoOTTag        language_tag);
306 PANGO_DEPRECATED
307 PangoOTTag *pango_ot_info_list_features  (PangoOTInfo      *info,
308 					  PangoOTTableType  table_type,
309 					  PangoOTTag        tag,
310 					  guint             script_index,
311 					  guint             language_index);
312 
313 #ifdef __GI_SCANNER__
314 #define PANGO_OT_TYPE_BUFFER (pango_ot_buffer_get_type())
315 #else
316 #define PANGO_TYPE_OT_BUFFER (pango_ot_buffer_get_type())
317 #endif
318 
319 PANGO_DEPRECATED
320 GType          pango_ot_buffer_get_type   (void) G_GNUC_CONST;
321 
322 PANGO_DEPRECATED
323 PangoOTBuffer *pango_ot_buffer_new        (PangoFcFont       *font);
324 PANGO_DEPRECATED
325 void           pango_ot_buffer_destroy    (PangoOTBuffer     *buffer);
326 PANGO_DEPRECATED
327 void           pango_ot_buffer_clear      (PangoOTBuffer     *buffer);
328 PANGO_DEPRECATED
329 void           pango_ot_buffer_set_rtl    (PangoOTBuffer     *buffer,
330 					   gboolean           rtl);
331 PANGO_DEPRECATED
332 void           pango_ot_buffer_add_glyph  (PangoOTBuffer     *buffer,
333 					   guint              glyph,
334 					   guint              properties,
335 					   guint              cluster);
336 PANGO_DEPRECATED
337 void           pango_ot_buffer_get_glyphs (const PangoOTBuffer  *buffer,
338 					   PangoOTGlyph        **glyphs,
339 					   int                  *n_glyphs);
340 PANGO_DEPRECATED
341 void           pango_ot_buffer_output     (const PangoOTBuffer  *buffer,
342 					   PangoGlyphString     *glyphs);
343 
344 PANGO_DEPRECATED
345 void           pango_ot_buffer_set_zero_width_marks (PangoOTBuffer     *buffer,
346 						     gboolean           zero_width_marks);
347 
348 PANGO_DEPRECATED
349 const PangoOTRuleset *pango_ot_ruleset_get_for_description (PangoOTInfo                     *info,
350 							    const PangoOTRulesetDescription *desc);
351 PANGO_DEPRECATED
352 PangoOTRuleset *pango_ot_ruleset_new (PangoOTInfo       *info);
353 PANGO_DEPRECATED
354 PangoOTRuleset *pango_ot_ruleset_new_for (PangoOTInfo       *info,
355 					  PangoScript        script,
356 					  PangoLanguage     *language);
357 PANGO_DEPRECATED
358 PangoOTRuleset *pango_ot_ruleset_new_from_description (PangoOTInfo                     *info,
359 						       const PangoOTRulesetDescription *desc);
360 PANGO_DEPRECATED
361 void            pango_ot_ruleset_add_feature (PangoOTRuleset   *ruleset,
362 					      PangoOTTableType  table_type,
363 					      guint             feature_index,
364 					      gulong            property_bit);
365 PANGO_DEPRECATED
366 gboolean        pango_ot_ruleset_maybe_add_feature (PangoOTRuleset   *ruleset,
367 						    PangoOTTableType  table_type,
368 						    PangoOTTag        feature_tag,
369 						    gulong            property_bit);
370 PANGO_DEPRECATED
371 guint           pango_ot_ruleset_maybe_add_features (PangoOTRuleset          *ruleset,
372 						     PangoOTTableType         table_type,
373 						     const PangoOTFeatureMap *features,
374 						     guint                    n_features);
375 PANGO_DEPRECATED
376 guint           pango_ot_ruleset_get_feature_count (const PangoOTRuleset   *ruleset,
377 						    guint                  *n_gsub_features,
378 						    guint                  *n_gpos_features);
379 
380 PANGO_DEPRECATED
381 void            pango_ot_ruleset_substitute  (const PangoOTRuleset   *ruleset,
382 					      PangoOTBuffer          *buffer);
383 
384 PANGO_DEPRECATED
385 void            pango_ot_ruleset_position    (const PangoOTRuleset   *ruleset,
386 					      PangoOTBuffer          *buffer);
387 
388 PANGO_DEPRECATED
389 PangoScript     pango_ot_tag_to_script     (PangoOTTag     script_tag) G_GNUC_CONST;
390 
391 PANGO_DEPRECATED
392 PangoOTTag      pango_ot_tag_from_script   (PangoScript    script) G_GNUC_CONST;
393 
394 PANGO_DEPRECATED
395 PangoLanguage  *pango_ot_tag_to_language   (PangoOTTag     language_tag) G_GNUC_CONST;
396 
397 PANGO_DEPRECATED
398 PangoOTTag      pango_ot_tag_from_language (PangoLanguage *language) G_GNUC_CONST;
399 
400 #ifdef __GI_SCANNER__
401 #define PANGO_OT_TYPE_RULESET_DESCRIPTION (pango_ot_ruleset_description_get_type())
402 #else
403 #define PANGO_TYPE_OT_RULESET_DESCRIPTION (pango_ot_ruleset_description_get_type())
404 #endif
405 
406 PANGO_DEPRECATED
407 GType           pango_ot_ruleset_description_get_type (void) G_GNUC_CONST;
408 
409 PANGO_DEPRECATED
410 guint           pango_ot_ruleset_description_hash  (const PangoOTRulesetDescription *desc) G_GNUC_PURE;
411 
412 PANGO_DEPRECATED
413 gboolean        pango_ot_ruleset_description_equal (const PangoOTRulesetDescription *desc1,
414 						    const PangoOTRulesetDescription *desc2) G_GNUC_PURE;
415 
416 PANGO_DEPRECATED
417 PangoOTRulesetDescription *pango_ot_ruleset_description_copy  (const PangoOTRulesetDescription *desc);
418 
419 PANGO_DEPRECATED
420 void            pango_ot_ruleset_description_free  (PangoOTRulesetDescription       *desc);
421 
422 
423 #endif /* PANGO_DISABLE_DEPRECATED */
424 
425 G_END_DECLS
426 
427 #endif /* __PANGO_OT_H__ */
428