1/* Pango
2 * pango-layout.h: High-level layout driver
3 *
4 * Copyright (C) 2000 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_LAYOUT_H__
23#define __PANGO_LAYOUT_H__
24
25#include <pango/pango-attributes.h>
26#include <pango/pango-context.h>
27#include <pango/pango-glyph-item.h>
28#include <pango/pango-tabs.h>
29
30G_BEGIN_DECLS
31
32typedef struct _PangoLayout PangoLayout;
33typedef struct _PangoLayoutClass PangoLayoutClass;
34typedef struct _PangoLayoutLine PangoLayoutLine;
35
36/**
37 * PangoLayoutRun:
38 *
39 * A `PangoLayoutRun` represents a single run within a `PangoLayoutLine`.
40 *
41 * It is simply an alternate name for [struct@Pango.GlyphItem].
42 * See the [struct@Pango.GlyphItem] docs for details on the fields.
43 */
44typedef PangoGlyphItem PangoLayoutRun;
45
46/**
47 * PangoAlignment:
48 * @PANGO_ALIGN_LEFT: Put all available space on the right
49 * @PANGO_ALIGN_CENTER: Center the line within the available space
50 * @PANGO_ALIGN_RIGHT: Put all available space on the left
51 *
52 * `PangoAlignment` describes how to align the lines of a `PangoLayout`
53 * within the available space.
54 *
55 * If the `PangoLayout` is set to justify using [method@Pango.Layout.set_justify],
56 * this only affects partial lines.
57 *
58 * See [method@Pango.Layout.set_auto_dir] for how text direction affects
59 * the interpretation of `PangoAlignment` values.
60 */
61typedef enum {
62 PANGO_ALIGN_LEFT,
63 PANGO_ALIGN_CENTER,
64 PANGO_ALIGN_RIGHT
65} PangoAlignment;
66
67/**
68 * PangoWrapMode:
69 * @PANGO_WRAP_WORD: wrap lines at word boundaries.
70 * @PANGO_WRAP_CHAR: wrap lines at character boundaries.
71 * @PANGO_WRAP_WORD_CHAR: wrap lines at word boundaries, but fall back to
72 * character boundaries if there is not enough space for a full word.
73 *
74 * `PangoWrapMode` describes how to wrap the lines of a `PangoLayout`
75 * to the desired width.
76 *
77 * For @PANGO_WRAP_WORD, Pango uses break opportunities that are determined
78 * by the Unicode line breaking algorithm. For @PANGO_WRAP_CHAR, Pango allows
79 * breaking at grapheme boundaries that are determined by the Unicode text
80 * segmentation algorithm.
81 */
82typedef enum {
83 PANGO_WRAP_WORD,
84 PANGO_WRAP_CHAR,
85 PANGO_WRAP_WORD_CHAR
86} PangoWrapMode;
87
88/**
89 * PangoEllipsizeMode:
90 * @PANGO_ELLIPSIZE_NONE: No ellipsization
91 * @PANGO_ELLIPSIZE_START: Omit characters at the start of the text
92 * @PANGO_ELLIPSIZE_MIDDLE: Omit characters in the middle of the text
93 * @PANGO_ELLIPSIZE_END: Omit characters at the end of the text
94 *
95 * `PangoEllipsizeMode` describes what sort of ellipsization
96 * should be applied to text.
97 *
98 * In the ellipsization process characters are removed from the
99 * text in order to make it fit to a given width and replaced
100 * with an ellipsis.
101 */
102typedef enum {
103 PANGO_ELLIPSIZE_NONE,
104 PANGO_ELLIPSIZE_START,
105 PANGO_ELLIPSIZE_MIDDLE,
106 PANGO_ELLIPSIZE_END
107} PangoEllipsizeMode;
108
109/**
110 * PangoLayoutLine:
111 * @layout: (nullable): the layout this line belongs to, might be %NULL
112 * @start_index: start of line as byte index into layout->text
113 * @length: length of line in bytes
114 * @runs: (nullable) (element-type Pango.LayoutRun): list of runs in the
115 * line, from left to right
116 * @is_paragraph_start: #TRUE if this is the first line of the paragraph
117 * @resolved_dir: #Resolved PangoDirection of line
118 *
119 * A `PangoLayoutLine` represents one of the lines resulting from laying
120 * out a paragraph via `PangoLayout`.
121 *
122 * `PangoLayoutLine` structures are obtained by calling
123 * [method@Pango.Layout.get_line] and are only valid until the text,
124 * attributes, or settings of the parent `PangoLayout` are modified.
125 */
126struct _PangoLayoutLine
127{
128 PangoLayout *layout;
129 gint start_index; /* start of line as byte index into layout->text */
130 gint length; /* length of line in bytes */
131 GSList *runs;
132 guint is_paragraph_start : 1; /* TRUE if this is the first line of the paragraph */
133 guint resolved_dir : 3; /* Resolved PangoDirection of line */
134};
135
136#define PANGO_TYPE_LAYOUT (pango_layout_get_type ())
137#define PANGO_LAYOUT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_LAYOUT, PangoLayout))
138#define PANGO_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANGO_TYPE_LAYOUT, PangoLayoutClass))
139#define PANGO_IS_LAYOUT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), PANGO_TYPE_LAYOUT))
140#define PANGO_IS_LAYOUT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANGO_TYPE_LAYOUT))
141#define PANGO_LAYOUT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), PANGO_TYPE_LAYOUT, PangoLayoutClass))
142
143/* The PangoLayout and PangoLayoutClass structs are private; if you
144 * need to create a subclass of these, file a bug.
145 */
146
147PANGO_AVAILABLE_IN_ALL
148GType pango_layout_get_type (void) G_GNUC_CONST;
149PANGO_AVAILABLE_IN_ALL
150PangoLayout *pango_layout_new (PangoContext *context);
151PANGO_AVAILABLE_IN_ALL
152PangoLayout *pango_layout_copy (PangoLayout *src);
153
154PANGO_AVAILABLE_IN_ALL
155PangoContext *pango_layout_get_context (PangoLayout *layout);
156
157PANGO_AVAILABLE_IN_ALL
158void pango_layout_set_attributes (PangoLayout *layout,
159 PangoAttrList *attrs);
160PANGO_AVAILABLE_IN_ALL
161PangoAttrList *pango_layout_get_attributes (PangoLayout *layout);
162
163PANGO_AVAILABLE_IN_ALL
164void pango_layout_set_text (PangoLayout *layout,
165 const char *text,
166 int length);
167PANGO_AVAILABLE_IN_ALL
168const char *pango_layout_get_text (PangoLayout *layout);
169
170PANGO_AVAILABLE_IN_1_30
171gint pango_layout_get_character_count (PangoLayout *layout);
172
173PANGO_AVAILABLE_IN_ALL
174void pango_layout_set_markup (PangoLayout *layout,
175 const char *markup,
176 int length);
177
178PANGO_AVAILABLE_IN_ALL
179void pango_layout_set_markup_with_accel (PangoLayout *layout,
180 const char *markup,
181 int length,
182 gunichar accel_marker,
183 gunichar *accel_char);
184
185PANGO_AVAILABLE_IN_ALL
186void pango_layout_set_font_description (PangoLayout *layout,
187 const PangoFontDescription *desc);
188
189PANGO_AVAILABLE_IN_1_8
190const PangoFontDescription *pango_layout_get_font_description (PangoLayout *layout);
191
192PANGO_AVAILABLE_IN_ALL
193void pango_layout_set_width (PangoLayout *layout,
194 int width);
195PANGO_AVAILABLE_IN_ALL
196int pango_layout_get_width (PangoLayout *layout);
197PANGO_AVAILABLE_IN_1_20
198void pango_layout_set_height (PangoLayout *layout,
199 int height);
200PANGO_AVAILABLE_IN_1_20
201int pango_layout_get_height (PangoLayout *layout);
202PANGO_AVAILABLE_IN_ALL
203void pango_layout_set_wrap (PangoLayout *layout,
204 PangoWrapMode wrap);
205PANGO_AVAILABLE_IN_ALL
206PangoWrapMode pango_layout_get_wrap (PangoLayout *layout);
207PANGO_AVAILABLE_IN_1_16
208gboolean pango_layout_is_wrapped (PangoLayout *layout);
209PANGO_AVAILABLE_IN_ALL
210void pango_layout_set_indent (PangoLayout *layout,
211 int indent);
212PANGO_AVAILABLE_IN_ALL
213int pango_layout_get_indent (PangoLayout *layout);
214PANGO_AVAILABLE_IN_ALL
215void pango_layout_set_spacing (PangoLayout *layout,
216 int spacing);
217PANGO_AVAILABLE_IN_ALL
218int pango_layout_get_spacing (PangoLayout *layout);
219PANGO_AVAILABLE_IN_1_44
220void pango_layout_set_line_spacing (PangoLayout *layout,
221 float factor);
222PANGO_AVAILABLE_IN_1_44
223float pango_layout_get_line_spacing (PangoLayout *layout);
224PANGO_AVAILABLE_IN_ALL
225void pango_layout_set_justify (PangoLayout *layout,
226 gboolean justify);
227PANGO_AVAILABLE_IN_ALL
228gboolean pango_layout_get_justify (PangoLayout *layout);
229PANGO_AVAILABLE_IN_1_50
230void pango_layout_set_justify_last_line (PangoLayout *layout,
231 gboolean justify);
232PANGO_AVAILABLE_IN_1_50
233gboolean pango_layout_get_justify_last_line (PangoLayout *layout);
234PANGO_AVAILABLE_IN_1_4
235void pango_layout_set_auto_dir (PangoLayout *layout,
236 gboolean auto_dir);
237PANGO_AVAILABLE_IN_1_4
238gboolean pango_layout_get_auto_dir (PangoLayout *layout);
239PANGO_AVAILABLE_IN_ALL
240void pango_layout_set_alignment (PangoLayout *layout,
241 PangoAlignment alignment);
242PANGO_AVAILABLE_IN_ALL
243PangoAlignment pango_layout_get_alignment (PangoLayout *layout);
244
245PANGO_AVAILABLE_IN_ALL
246void pango_layout_set_tabs (PangoLayout *layout,
247 PangoTabArray *tabs);
248PANGO_AVAILABLE_IN_ALL
249PangoTabArray* pango_layout_get_tabs (PangoLayout *layout);
250
251PANGO_AVAILABLE_IN_ALL
252void pango_layout_set_single_paragraph_mode (PangoLayout *layout,
253 gboolean setting);
254PANGO_AVAILABLE_IN_ALL
255gboolean pango_layout_get_single_paragraph_mode (PangoLayout *layout);
256
257PANGO_AVAILABLE_IN_1_6
258void pango_layout_set_ellipsize (PangoLayout *layout,
259 PangoEllipsizeMode ellipsize);
260PANGO_AVAILABLE_IN_1_6
261PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout *layout);
262PANGO_AVAILABLE_IN_1_16
263gboolean pango_layout_is_ellipsized (PangoLayout *layout);
264
265PANGO_AVAILABLE_IN_1_16
266int pango_layout_get_unknown_glyphs_count (PangoLayout *layout);
267
268PANGO_AVAILABLE_IN_1_46
269PangoDirection pango_layout_get_direction (PangoLayout *layout,
270 int index);
271
272PANGO_AVAILABLE_IN_ALL
273void pango_layout_context_changed (PangoLayout *layout);
274PANGO_AVAILABLE_IN_1_32
275guint pango_layout_get_serial (PangoLayout *layout);
276
277PANGO_AVAILABLE_IN_ALL
278void pango_layout_get_log_attrs (PangoLayout *layout,
279 PangoLogAttr **attrs,
280 gint *n_attrs);
281
282PANGO_AVAILABLE_IN_1_30
283const PangoLogAttr *pango_layout_get_log_attrs_readonly (PangoLayout *layout,
284 gint *n_attrs);
285
286PANGO_AVAILABLE_IN_ALL
287void pango_layout_index_to_pos (PangoLayout *layout,
288 int index_,
289 PangoRectangle *pos);
290PANGO_AVAILABLE_IN_ALL
291void pango_layout_index_to_line_x (PangoLayout *layout,
292 int index_,
293 gboolean trailing,
294 int *line,
295 int *x_pos);
296PANGO_AVAILABLE_IN_ALL
297void pango_layout_get_cursor_pos (PangoLayout *layout,
298 int index_,
299 PangoRectangle *strong_pos,
300 PangoRectangle *weak_pos);
301
302PANGO_AVAILABLE_IN_1_50
303void pango_layout_get_caret_pos (PangoLayout *layout,
304 int index_,
305 PangoRectangle *strong_pos,
306 PangoRectangle *weak_pos);
307
308PANGO_AVAILABLE_IN_ALL
309void pango_layout_move_cursor_visually (PangoLayout *layout,
310 gboolean strong,
311 int old_index,
312 int old_trailing,
313 int direction,
314 int *new_index,
315 int *new_trailing);
316PANGO_AVAILABLE_IN_ALL
317gboolean pango_layout_xy_to_index (PangoLayout *layout,
318 int x,
319 int y,
320 int *index_,
321 int *trailing);
322PANGO_AVAILABLE_IN_ALL
323void pango_layout_get_extents (PangoLayout *layout,
324 PangoRectangle *ink_rect,
325 PangoRectangle *logical_rect);
326PANGO_AVAILABLE_IN_ALL
327void pango_layout_get_pixel_extents (PangoLayout *layout,
328 PangoRectangle *ink_rect,
329 PangoRectangle *logical_rect);
330PANGO_AVAILABLE_IN_ALL
331void pango_layout_get_size (PangoLayout *layout,
332 int *width,
333 int *height);
334PANGO_AVAILABLE_IN_ALL
335void pango_layout_get_pixel_size (PangoLayout *layout,
336 int *width,
337 int *height);
338PANGO_AVAILABLE_IN_1_22
339int pango_layout_get_baseline (PangoLayout *layout);
340
341PANGO_AVAILABLE_IN_ALL
342int pango_layout_get_line_count (PangoLayout *layout);
343PANGO_AVAILABLE_IN_ALL
344PangoLayoutLine *pango_layout_get_line (PangoLayout *layout,
345 int line);
346PANGO_AVAILABLE_IN_1_16
347PangoLayoutLine *pango_layout_get_line_readonly (PangoLayout *layout,
348 int line);
349PANGO_AVAILABLE_IN_ALL
350GSList * pango_layout_get_lines (PangoLayout *layout);
351PANGO_AVAILABLE_IN_1_16
352GSList * pango_layout_get_lines_readonly (PangoLayout *layout);
353
354/**
355 * PangoLayoutSerializeFlags:
356 * @PANGO_LAYOUT_SERIALIZE_DEFAULT: Default behavior
357 * @PANGO_LAYOUT_SERIALIZE_CONTEXT: Include context information
358 * @PANGO_LAYOUT_SERIALIZE_OUTPUT: Include information about the formatted output
359 *
360 * Flags that influence the behavior of [method@Pango.Layout.serialize].
361 *
362 * New members may be added to this enumeration over time.
363 *
364 * Since: 1.50
365 */
366typedef enum {
367 PANGO_LAYOUT_SERIALIZE_DEFAULT = 0,
368 PANGO_LAYOUT_SERIALIZE_CONTEXT = 1 << 0,
369 PANGO_LAYOUT_SERIALIZE_OUTPUT = 1 << 1,
370} PangoLayoutSerializeFlags;
371
372PANGO_AVAILABLE_IN_1_50
373GBytes * pango_layout_serialize (PangoLayout *layout,
374 PangoLayoutSerializeFlags flags);
375
376PANGO_AVAILABLE_IN_1_50
377gboolean pango_layout_write_to_file (PangoLayout *layout,
378 PangoLayoutSerializeFlags flags,
379
380 const char *filename,
381 GError **error);
382
383#define PANGO_LAYOUT_DESERIALIZE_ERROR (pango_layout_deserialize_error_quark ())
384
385/**
386 * PangoLayoutDeserializeError:
387 * @PANGO_LAYOUT_DESERIALIZE_INVALID: Unspecified error
388 * @PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE: A JSon value could not be
389 * interpreted
390 * @PANGO_LAYOUT_DESERIALIZE_MISSING_VALUE: A required JSon member was
391 * not found
392 *
393 * Errors that can be returned by [func@Pango.Layout.deserialize].
394 *
395 * Since: 1.50
396 */
397typedef enum {
398 PANGO_LAYOUT_DESERIALIZE_INVALID,
399 PANGO_LAYOUT_DESERIALIZE_INVALID_VALUE,
400 PANGO_LAYOUT_DESERIALIZE_MISSING_VALUE,
401} PangoLayoutDeserializeError;
402
403PANGO_AVAILABLE_IN_1_50
404GQuark pango_layout_deserialize_error_quark (void);
405
406/**
407 * PangoLayoutDeserializeFlags:
408 * @PANGO_LAYOUT_DESERIALIZE_DEFAULT: Default behavior
409 * @PANGO_LAYOUT_DESERIALIZE_CONTEXT: Apply context information
410 * from the serialization to the `PangoContext`
411 *
412 * Flags that influence the behavior of [func@Pango.Layout.deserialize].
413 *
414 * New members may be added to this enumeration over time.
415 *
416 * Since: 1.50
417 */
418typedef enum {
419 PANGO_LAYOUT_DESERIALIZE_DEFAULT = 0,
420 PANGO_LAYOUT_DESERIALIZE_CONTEXT = 1 << 0,
421} PangoLayoutDeserializeFlags;
422
423PANGO_AVAILABLE_IN_1_50
424PangoLayout * pango_layout_deserialize (PangoContext *context,
425 GBytes *bytes,
426 PangoLayoutDeserializeFlags flags,
427 GError **error);
428
429
430#define PANGO_TYPE_LAYOUT_LINE (pango_layout_line_get_type ())
431
432PANGO_AVAILABLE_IN_ALL
433GType pango_layout_line_get_type (void) G_GNUC_CONST;
434
435PANGO_AVAILABLE_IN_1_10
436PangoLayoutLine *pango_layout_line_ref (PangoLayoutLine *line);
437PANGO_AVAILABLE_IN_ALL
438void pango_layout_line_unref (PangoLayoutLine *line);
439
440PANGO_AVAILABLE_IN_1_50
441int pango_layout_line_get_start_index (PangoLayoutLine *line);
442PANGO_AVAILABLE_IN_1_50
443int pango_layout_line_get_length (PangoLayoutLine *line);
444PANGO_AVAILABLE_IN_1_50
445gboolean pango_layout_line_is_paragraph_start (PangoLayoutLine *line);
446PANGO_AVAILABLE_IN_1_50
447PangoDirection pango_layout_line_get_resolved_direction (PangoLayoutLine *line);
448
449PANGO_AVAILABLE_IN_ALL
450gboolean pango_layout_line_x_to_index (PangoLayoutLine *line,
451 int x_pos,
452 int *index_,
453 int *trailing);
454PANGO_AVAILABLE_IN_ALL
455void pango_layout_line_index_to_x (PangoLayoutLine *line,
456 int index_,
457 gboolean trailing,
458 int *x_pos);
459PANGO_AVAILABLE_IN_ALL
460void pango_layout_line_get_x_ranges (PangoLayoutLine *line,
461 int start_index,
462 int end_index,
463 int **ranges,
464 int *n_ranges);
465PANGO_AVAILABLE_IN_ALL
466void pango_layout_line_get_extents (PangoLayoutLine *line,
467 PangoRectangle *ink_rect,
468 PangoRectangle *logical_rect);
469PANGO_AVAILABLE_IN_1_44
470void pango_layout_line_get_height (PangoLayoutLine *line,
471 int *height);
472
473PANGO_AVAILABLE_IN_ALL
474void pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line,
475 PangoRectangle *ink_rect,
476 PangoRectangle *logical_rect);
477
478typedef struct _PangoLayoutIter PangoLayoutIter;
479
480#define PANGO_TYPE_LAYOUT_ITER (pango_layout_iter_get_type ())
481
482PANGO_AVAILABLE_IN_ALL
483GType pango_layout_iter_get_type (void) G_GNUC_CONST;
484
485PANGO_AVAILABLE_IN_ALL
486PangoLayoutIter *pango_layout_get_iter (PangoLayout *layout);
487PANGO_AVAILABLE_IN_1_20
488PangoLayoutIter *pango_layout_iter_copy (PangoLayoutIter *iter);
489PANGO_AVAILABLE_IN_ALL
490void pango_layout_iter_free (PangoLayoutIter *iter);
491
492PANGO_AVAILABLE_IN_ALL
493int pango_layout_iter_get_index (PangoLayoutIter *iter);
494PANGO_AVAILABLE_IN_ALL
495PangoLayoutRun *pango_layout_iter_get_run (PangoLayoutIter *iter);
496PANGO_AVAILABLE_IN_1_16
497PangoLayoutRun *pango_layout_iter_get_run_readonly (PangoLayoutIter *iter);
498PANGO_AVAILABLE_IN_ALL
499PangoLayoutLine *pango_layout_iter_get_line (PangoLayoutIter *iter);
500PANGO_AVAILABLE_IN_1_16
501PangoLayoutLine *pango_layout_iter_get_line_readonly (PangoLayoutIter *iter);
502PANGO_AVAILABLE_IN_ALL
503gboolean pango_layout_iter_at_last_line (PangoLayoutIter *iter);
504PANGO_AVAILABLE_IN_1_20
505PangoLayout *pango_layout_iter_get_layout (PangoLayoutIter *iter);
506
507PANGO_AVAILABLE_IN_ALL
508gboolean pango_layout_iter_next_char (PangoLayoutIter *iter);
509PANGO_AVAILABLE_IN_ALL
510gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter);
511PANGO_AVAILABLE_IN_ALL
512gboolean pango_layout_iter_next_run (PangoLayoutIter *iter);
513PANGO_AVAILABLE_IN_ALL
514gboolean pango_layout_iter_next_line (PangoLayoutIter *iter);
515
516PANGO_AVAILABLE_IN_ALL
517void pango_layout_iter_get_char_extents (PangoLayoutIter *iter,
518 PangoRectangle *logical_rect);
519PANGO_AVAILABLE_IN_ALL
520void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter,
521 PangoRectangle *ink_rect,
522 PangoRectangle *logical_rect);
523PANGO_AVAILABLE_IN_ALL
524void pango_layout_iter_get_run_extents (PangoLayoutIter *iter,
525 PangoRectangle *ink_rect,
526 PangoRectangle *logical_rect);
527PANGO_AVAILABLE_IN_ALL
528void pango_layout_iter_get_line_extents (PangoLayoutIter *iter,
529 PangoRectangle *ink_rect,
530 PangoRectangle *logical_rect);
531/* All the yranges meet, unlike the logical_rect's (i.e. the yranges
532 * assign between-line spacing to the nearest line)
533 */
534PANGO_AVAILABLE_IN_ALL
535void pango_layout_iter_get_line_yrange (PangoLayoutIter *iter,
536 int *y0_,
537 int *y1_);
538PANGO_AVAILABLE_IN_ALL
539void pango_layout_iter_get_layout_extents (PangoLayoutIter *iter,
540 PangoRectangle *ink_rect,
541 PangoRectangle *logical_rect);
542PANGO_AVAILABLE_IN_ALL
543int pango_layout_iter_get_baseline (PangoLayoutIter *iter);
544PANGO_AVAILABLE_IN_1_50
545int pango_layout_iter_get_run_baseline (PangoLayoutIter *iter);
546
547
548G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoLayout, g_object_unref)
549G_DEFINE_AUTOPTR_CLEANUP_FUNC(PangoLayoutIter, pango_layout_iter_free)
550
551G_END_DECLS
552
553#endif /* __PANGO_LAYOUT_H__ */
554
555

source code of gtk/subprojects/pango/pango/pango-layout.h