1/*
2 * Copyright (c) 2015- terrak <terrak1975@gmail.com>
3 *
4 * This file originated from: http://www.terrak.net/
5 *
6 * Permission to use, copy, modify, and distribute this software for any
7 * purpose with or without fee is hereby granted, provided that the above
8 * copyright notice and this permission notice appear in all copies.
9 *
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19package pango
20
21// #include <pango/pango.h>
22// #include "pango.go.h"
23import "C"
24import (
25	"runtime"
26	"unsafe"
27
28	"github.com/gotk3/gotk3/glib"
29)
30
31func init() {
32	tm := []glib.TypeMarshaler{
33		// Enums
34		{glib.Type(C.pango_alignment_get_type()), marshalAlignment},
35		{glib.Type(C.pango_ellipsize_mode_get_type()), marshalEllipsizeMode},
36		{glib.Type(C.pango_wrap_mode_get_type()), marshalWrapMode},
37		{glib.Type(C.pango_tab_align_get_type()), marshalTabAlign},
38
39		// Objects/Interfaces
40		//		{glib.Type(C.pango_layout_get_type()), marshalLayout},
41	}
42	glib.RegisterGValueMarshalers(tm)
43}
44
45// Layout is a representation of PangoLayout.
46type Layout struct {
47	pangoLayout *C.PangoLayout
48}
49
50// Native returns a pointer to the underlying PangoLayout.
51func (v *Layout) Native() uintptr {
52	return uintptr(unsafe.Pointer(v.native()))
53}
54
55func (v *Layout) native() *C.PangoLayout {
56	if v == nil {
57		return nil
58	}
59	return (*C.PangoLayout)(unsafe.Pointer(v.pangoLayout))
60}
61
62func WrapLayout(p uintptr) *Layout {
63	layout := new(Layout)
64	layout.pangoLayout = (*C.PangoLayout)(unsafe.Pointer(p))
65	return layout
66}
67
68// LayoutLine is a representation of PangoLayoutLine.
69type LayoutLine struct {
70	pangoLayoutLine *C.PangoLayout
71}
72
73// Native returns a pointer to the underlying PangoLayoutLine.
74func (v *LayoutLine) Native() uintptr {
75	return uintptr(unsafe.Pointer(v.native()))
76}
77
78func (v *LayoutLine) native() *C.PangoLayoutLine {
79	if v == nil {
80		return nil
81	}
82	return (*C.PangoLayoutLine)(unsafe.Pointer(v.pangoLayoutLine))
83}
84
85/*
86 * Constants
87 */
88
89// Alignment is a representation of Pango's PangoAlignment.
90type Alignment int
91
92const (
93	ALIGN_LEFT   Alignment = C.PANGO_ALIGN_LEFT
94	ALIGN_CENTER Alignment = C.PANGO_ALIGN_CENTER
95	ALIGN_RIGHT  Alignment = C.PANGO_ALIGN_RIGHT
96)
97
98func marshalAlignment(p uintptr) (interface{}, error) {
99	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
100	return Alignment(c), nil
101}
102
103// WrapMode is a representation of Pango's PangoWrapMode.
104type WrapMode int
105
106const (
107	WRAP_WORD      WrapMode = C.PANGO_WRAP_WORD
108	WRAP_CHAR      WrapMode = C.PANGO_WRAP_CHAR
109	WRAP_WORD_CHAR WrapMode = C.PANGO_WRAP_WORD_CHAR
110)
111
112func marshalWrapMode(p uintptr) (interface{}, error) {
113	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
114	return WrapMode(c), nil
115}
116
117// EllipsizeMode is a representation of Pango's PangoEllipsizeMode.
118type EllipsizeMode int
119
120const (
121	ELLIPSIZE_NONE   EllipsizeMode = C.PANGO_ELLIPSIZE_NONE
122	ELLIPSIZE_START  EllipsizeMode = C.PANGO_ELLIPSIZE_START
123	ELLIPSIZE_MIDDLE EllipsizeMode = C.PANGO_ELLIPSIZE_MIDDLE
124	ELLIPSIZE_END    EllipsizeMode = C.PANGO_ELLIPSIZE_END
125)
126
127func marshalEllipsizeMode(p uintptr) (interface{}, error) {
128	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
129	return EllipsizeMode(c), nil
130}
131
132type TabAlign int
133
134const (
135	TAB_LEFT TabAlign = C.PANGO_TAB_LEFT
136)
137
138func marshalTabAlign(p uintptr) (interface{}, error) {
139	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
140	return TabAlign(c), nil
141}
142
143/*
144func marshalLayout(p uintptr) (interface{}, error) {
145	c := C.g_value_get_object((*C.GValue)(unsafe.Pointer(p)))
146	obj := wrapObject(unsafe.Pointer(c))
147	return wrapLayout(obj), nil
148}
149
150func wrapLayout(obj *glib.Object) *Layout {
151	return &Layout{obj}
152}
153*/
154
155// LayoutNew is a wrapper around pango_layout_new().
156func LayoutNew(context *Context) *Layout {
157	c := C.pango_layout_new(context.native())
158
159	layout := new(Layout)
160	layout.pangoLayout = (*C.PangoLayout)(c)
161	return layout
162}
163
164// Copy is a wrapper around pango_layout_copy().
165func (v *Layout) Copy() *Layout {
166	c := C.pango_layout_copy(v.native())
167
168	layout := new(Layout)
169	layout.pangoLayout = (*C.PangoLayout)(c)
170	return layout
171}
172
173// GetContext is a wrapper around pango_layout_get_context().
174func (v *Layout) GetContext() *Context {
175	c := C.pango_layout_get_context(v.native())
176
177	context := new(Context)
178	context.pangoContext = (*C.PangoContext)(c)
179
180	return context
181}
182
183// SetAttributes is a wrapper around pango_layout_set_attributes().
184func (v *Layout) SetAttributes(attrs *AttrList) {
185	C.pango_layout_set_attributes(v.native(), attrs.native())
186}
187
188// GetAttributes is a wrapper around pango_layout_get_attributes().
189func (v *Layout) GetAttributes() *AttrList {
190	c := C.pango_layout_get_attributes(v.native())
191
192	attrList := new(AttrList)
193	attrList.pangoAttrList = (*C.PangoAttrList)(c)
194
195	return attrList
196}
197
198// SetText is a wrapper around pango_layout_set_text().
199func (v *Layout) SetText(text string, length int) {
200	cstr := C.CString(text)
201	defer C.free(unsafe.Pointer(cstr))
202	C.pango_layout_set_text(v.native(), (*C.char)(cstr), (C.int)(length))
203}
204
205// GetText is a wrapper around pango_layout_get_text().
206func (v *Layout) GetText() string {
207	c := C.pango_layout_get_text(v.native())
208	return C.GoString((*C.char)(c))
209}
210
211// GetCharacterCount is a wrapper around pango_layout_get_character_count().
212func (v *Layout) GetCharacterCount() int {
213	c := C.pango_layout_get_character_count(v.native())
214	return int(c)
215}
216
217// SetMarkup is a wrapper around pango_layout_set_markup().
218func (v *Layout) SetMarkup(text string, length int) {
219	cstr := C.CString(text)
220	defer C.free(unsafe.Pointer(cstr))
221	C.pango_layout_set_markup(v.native(), (*C.char)(cstr), (C.int)(length))
222}
223
224//void           pango_layout_set_markup_with_accel (PangoLayout    *layout,
225//						   const char     *markup,
226//						   int             length,
227//						   gunichar        accel_marker,
228//						   gunichar       *accel_char);
229
230/*
231func (v *Layout) SetMarkupWithAccel (text string, length int, accel_marker, accel_char rune){
232	cstr := C.CString(text)
233	defer C.free(unsafe.Pointer(cstr))
234	C.pango_layout_set_markup_with_accel (v.native(),  (*C.char)(cstr), (C.int)(length), (C.gunichar)(accel_marker), (C.gunichar)(accel_char) )
235}
236*/
237
238// SetFontDescription is a wrapper around pango_layout_set_font_description().
239func (v *Layout) SetFontDescription(desc *FontDescription) {
240	C.pango_layout_set_font_description(v.native(), desc.native())
241}
242
243// GetFontDescription is a wrapper around pango_layout_get_font_description().
244func (v *Layout) GetFontDescription() *FontDescription {
245	c := C.pango_layout_get_font_description(v.native())
246
247	desc := new(FontDescription)
248	desc.pangoFontDescription = (*C.PangoFontDescription)(c)
249
250	return desc
251}
252
253// SetWidth is a wrapper around pango_layout_set_width().
254func (v *Layout) SetWidth(width int) {
255	C.pango_layout_set_width(v.native(), C.int(width))
256}
257
258// GetWidth is a wrapper around pango_layout_get_width().
259func (v *Layout) GetWidth() int {
260	c := C.pango_layout_get_width(v.native())
261	return int(c)
262}
263
264// SetHeight is a wrapper around pango_layout_set_height().
265func (v *Layout) SetHeight(width int) {
266	C.pango_layout_set_height(v.native(), C.int(width))
267}
268
269// GetHeight is a wrapper around pango_layout_get_height().
270func (v *Layout) GetHeight() int {
271	c := C.pango_layout_get_height(v.native())
272	return int(c)
273}
274
275// SetWrap is a wrapper around pango_layout_set_wrap().
276func (v *Layout) SetWrap(wrap WrapMode) {
277	C.pango_layout_set_wrap(v.native(), C.PangoWrapMode(wrap))
278}
279
280// WrapMode is a wrapper around pango_layout_get_wrap().
281func (v *Layout) GetWrap() WrapMode {
282	c := C.pango_layout_get_wrap(v.native())
283	return WrapMode(c)
284}
285
286// IsWrapped is a wrapper around pango_layout_is_wrapped().
287func (v *Layout) IsWrapped() bool {
288	c := C.pango_layout_is_wrapped(v.native())
289	return gobool(c)
290}
291
292// SetIndent is a wrapper around pango_layout_set_indent().
293func (v *Layout) SetIndent(indent int) {
294	C.pango_layout_set_indent(v.native(), C.int(indent))
295}
296
297// GetIndent is a wrapper around pango_layout_get_indent().
298func (v *Layout) GetIndent() int {
299	c := C.pango_layout_get_indent(v.native())
300	return int(c)
301}
302
303// SetTabs is a wrapper around pango_layout_set_tabs().
304func (v *Layout) SetTabs(tabs *TabArray) {
305	C.pango_layout_set_tabs(v.native(), tabs.native())
306}
307
308// GetTabs is a wrapper around pango_layout_get_tabs().
309func (v *Layout) GetTabs() (*TabArray, error) {
310	c := C.pango_layout_get_tabs(v.native())
311	if c == nil {
312		return nil, nilPtrErr
313	}
314	ta := wrapTabArray(c)
315	runtime.SetFinalizer(ta, (*TabArray).free)
316	return ta, nil
317}
318
319// GetSize is a wrapper around pango_layout_get_size().
320func (v *Layout) GetSize() (int, int) {
321	var w, h C.int
322	C.pango_layout_get_size(v.native(), &w, &h)
323	return int(w), int(h)
324}
325
326/*
327 * TabArray
328 */
329
330// TabArray is a representation of PangoTabArray.
331type TabArray struct {
332	pangoTabArray *C.PangoTabArray
333}
334
335// Native returns a pointer to the underlying PangoTabArray.
336func (v *TabArray) Native() uintptr {
337	return uintptr(unsafe.Pointer(v.native()))
338}
339
340func (v *TabArray) native() *C.PangoTabArray {
341	if v == nil {
342		return nil
343	}
344	return (*C.PangoTabArray)(unsafe.Pointer(v.pangoTabArray))
345}
346
347func wrapTabArray(tabArray *C.PangoTabArray) *TabArray {
348	return &TabArray{tabArray}
349}
350
351func WrapTabArray(p uintptr) *TabArray {
352	tabArray := new(TabArray)
353	tabArray.pangoTabArray = (*C.PangoTabArray)(unsafe.Pointer(p))
354	return tabArray
355}
356
357// TabArrayNew is a wrapper around pango_tab_array_new().
358func TabArrayNew(initialSize int, positionsInPixels bool) *TabArray {
359	c := C.pango_tab_array_new(C.gint(initialSize), gbool(positionsInPixels))
360
361	tabArray := new(TabArray)
362	runtime.SetFinalizer(tabArray, (*TabArray).free)
363	tabArray.pangoTabArray = (*C.PangoTabArray)(c)
364	return tabArray
365}
366
367// TabArrayNewWithPositions is a wrapper around pango_tab_array_new_with_positions().
368// func TabArrayNewWithPositions(size int, positionsInPixels bool, ...) *TabArray {
369// 	c := C.pango_tab_array_new_with_positions(C.gint(size), gbool(positionsInPixels), ...)
370
371// 	tabArray := new(TabArray)
372//	runtime.SetFinalizer(e, (*TabArray).free)
373// 	tabArray.pangoTabArray = (*C.PangoTabArray)(c)
374// 	return tabArray
375// }
376
377// Copy is a wrapper around pango_tab_array_copy().
378func (v *TabArray) Copy() (*TabArray, error) {
379	c := C.pango_tab_array_copy(v.native())
380	if c == nil {
381		return nil, nilPtrErr
382	}
383	ta := wrapTabArray(c)
384	runtime.SetFinalizer(ta, (*TabArray).free)
385	return ta, nil
386}
387
388// free is a wrapper around pango_tab_array_free().
389func (v *TabArray) free() {
390	C.pango_tab_array_free(v.native())
391}
392
393// free is a wrapper around pango_tab_array_free().
394// This is only to enable other packages within gotk. Should not be used outside the gotk library.
395func (v *TabArray) Free() {
396	C.pango_tab_array_free(v.native())
397}
398
399// GetSize is a wrapper around pango_tab_array_get_size().
400func (v *TabArray) GetSize() int {
401	return int(C.pango_tab_array_get_size(v.native()))
402}
403
404// Resize is a wrapper around pango_tab_array_resize().
405func (v *TabArray) Resize(newSize int) {
406	C.pango_tab_array_resize(v.native(), C.gint(newSize))
407}
408
409// SetTab is a wrapper around pango_tab_array_set_tab().
410func (v *TabArray) SetTab(tabIndex int, alignment TabAlign, location int) {
411	C.pango_tab_array_set_tab(v.native(), C.gint(tabIndex), C.PangoTabAlign(alignment), C.gint(location))
412}
413
414// GetTab is a wrapper around pango_tab_array_get_tab().
415func (v *TabArray) GetTab(tabIndex int) (TabAlign, int) {
416	var alignment C.PangoTabAlign
417	var location C.gint
418	C.pango_tab_array_get_tab(v.native(), C.gint(tabIndex), &alignment, &location)
419	return TabAlign(alignment), int(location)
420}
421
422// GetTabs is a wrapper around pango_tab_array_get_tabs().
423// func (v *TabArray) GetTabs() ([]TabAlign, []int) {
424// 	var alignment *C.PangoTabAlign
425// 	var location *C.gint
426
427// 	C.pango_tab_array_get_tabs(v.native(), &alignment, &location)
428
429// 	size := v.GetSize()
430
431// 	var goAlignments []TabAlign
432// 	var goLocations []int
433
434// 	if &alignment != nil {
435// 		var ginthelp C.gint
436// 		sizeOf := unsafe.Sizeof(ginthelp)
437// 		for i := 0; i < int(size); i++ {
438// 			goAlignmentElement := TabAlign(*((*C.gint)(unsafe.Pointer(location))))
439// 			goAlignments = append(goAlignments, goAlignmentElement)
440// 			location += sizeOf
441// 		}
442// 	}
443
444// 	if &location != nil {
445// 		var ginthelp C.gint
446// 		sizeOf := unsafe.Sizeof(ginthelp)
447// 		for i := 0; i < int(size); i++ {
448// 			goLocationElement := int(*((*C.gint)(unsafe.Pointer(location))))
449// 			goLocations = append(goLocations, goLocationElement)
450// 			location += sizeOf
451// 		}
452
453// 		// TODO: free locations
454// 	}
455
456// 	return goAlignments, goLocations
457// }
458
459// GetPositionsInPixels is a wrapper around pango_tab_array_get_positions_in_pixels().
460func (v *TabArray) GetPositionsInPixels() bool {
461	return gobool(C.pango_tab_array_get_positions_in_pixels(v.native()))
462}
463
464//void           pango_layout_set_spacing          (PangoLayout                *layout,
465//						  int                         spacing);
466//int            pango_layout_get_spacing          (PangoLayout                *layout);
467//void           pango_layout_set_justify          (PangoLayout                *layout,
468//						  gboolean                    justify);
469//gboolean       pango_layout_get_justify          (PangoLayout                *layout);
470//void           pango_layout_set_auto_dir         (PangoLayout                *layout,
471//						  gboolean                    auto_dir);
472//gboolean       pango_layout_get_auto_dir         (PangoLayout                *layout);
473//void           pango_layout_set_alignment        (PangoLayout                *layout,
474//						  PangoAlignment              alignment);
475//PangoAlignment pango_layout_get_alignment        (PangoLayout                *layout);
476//
477//void           pango_layout_set_single_paragraph_mode (PangoLayout                *layout,
478//						       gboolean                    setting);
479//gboolean       pango_layout_get_single_paragraph_mode (PangoLayout                *layout);
480//
481//void               pango_layout_set_ellipsize (PangoLayout        *layout,
482//					       PangoEllipsizeMode  ellipsize);
483//PangoEllipsizeMode pango_layout_get_ellipsize (PangoLayout        *layout);
484//gboolean           pango_layout_is_ellipsized (PangoLayout        *layout);
485//
486//int      pango_layout_get_unknown_glyphs_count (PangoLayout    *layout);
487//
488//void     pango_layout_context_changed (PangoLayout    *layout);
489//guint    pango_layout_get_serial      (PangoLayout    *layout);
490//
491//void     pango_layout_get_log_attrs (PangoLayout    *layout,
492//				     PangoLogAttr  **attrs,
493//				     gint           *n_attrs);
494//
495//const PangoLogAttr *pango_layout_get_log_attrs_readonly (PangoLayout *layout,
496//							 gint        *n_attrs);
497//
498//void     pango_layout_index_to_pos         (PangoLayout    *layout,
499//					    int             index_,
500//					    PangoRectangle *pos);
501//void     pango_layout_index_to_line_x      (PangoLayout    *layout,
502//					    int             index_,
503//					    gboolean        trailing,
504//					    int            *line,
505//					    int            *x_pos);
506//void     pango_layout_get_cursor_pos       (PangoLayout    *layout,
507//					    int             index_,
508//					    PangoRectangle *strong_pos,
509//					    PangoRectangle *weak_pos);
510//void     pango_layout_move_cursor_visually (PangoLayout    *layout,
511//					    gboolean        strong,
512//					    int             old_index,
513//					    int             old_trailing,
514//					    int             direction,
515//					    int            *new_index,
516//					    int            *new_trailing);
517//gboolean pango_layout_xy_to_index          (PangoLayout    *layout,
518//					    int             x,
519//					    int             y,
520//					    int            *index_,
521//					    int            *trailing);
522//void     pango_layout_get_extents          (PangoLayout    *layout,
523//					    PangoRectangle *ink_rect,
524//					    PangoRectangle *logical_rect);
525//void     pango_layout_get_pixel_extents    (PangoLayout    *layout,
526//					    PangoRectangle *ink_rect,
527//					    PangoRectangle *logical_rect);
528//void     pango_layout_get_pixel_size       (PangoLayout    *layout,
529//					    int            *width,
530//					    int            *height);
531//int      pango_layout_get_baseline         (PangoLayout    *layout);
532//
533//int              pango_layout_get_line_count       (PangoLayout    *layout);
534//PangoLayoutLine *pango_layout_get_line             (PangoLayout    *layout,
535//						    int             line);
536//PangoLayoutLine *pango_layout_get_line_readonly    (PangoLayout    *layout,
537//						    int             line);
538//GSList *         pango_layout_get_lines            (PangoLayout    *layout);
539//GSList *         pango_layout_get_lines_readonly   (PangoLayout    *layout);
540//
541//
542//#define PANGO_TYPE_LAYOUT_LINE (pango_layout_line_get_type ())
543//
544//GType    pango_layout_line_get_type     (void) G_GNUC_CONST;
545//
546//PangoLayoutLine *pango_layout_line_ref   (PangoLayoutLine *line);
547//void             pango_layout_line_unref (PangoLayoutLine *line);
548//
549//gboolean pango_layout_line_x_to_index   (PangoLayoutLine  *line,
550//					 int               x_pos,
551//					 int              *index_,
552//					 int              *trailing);
553//void     pango_layout_line_index_to_x   (PangoLayoutLine  *line,
554//					 int               index_,
555//					 gboolean          trailing,
556//					 int              *x_pos);
557//void     pango_layout_line_get_x_ranges (PangoLayoutLine  *line,
558//					 int               start_index,
559//					 int               end_index,
560//					 int             **ranges,
561//					 int              *n_ranges);
562//void     pango_layout_line_get_extents  (PangoLayoutLine  *line,
563//					 PangoRectangle   *ink_rect,
564//					 PangoRectangle   *logical_rect);
565//void     pango_layout_line_get_pixel_extents (PangoLayoutLine *layout_line,
566//					      PangoRectangle  *ink_rect,
567//					      PangoRectangle  *logical_rect);
568//
569//typedef struct _PangoLayoutIter PangoLayoutIter;
570//
571//#define PANGO_TYPE_LAYOUT_ITER         (pango_layout_iter_get_type ())
572//
573//GType            pango_layout_iter_get_type (void) G_GNUC_CONST;
574//
575//PangoLayoutIter *pango_layout_get_iter  (PangoLayout     *layout);
576//PangoLayoutIter *pango_layout_iter_copy (PangoLayoutIter *iter);
577//void             pango_layout_iter_free (PangoLayoutIter *iter);
578//
579//int              pango_layout_iter_get_index  (PangoLayoutIter *iter);
580//PangoLayoutRun  *pango_layout_iter_get_run    (PangoLayoutIter *iter);
581//PangoLayoutRun  *pango_layout_iter_get_run_readonly   (PangoLayoutIter *iter);
582//PangoLayoutLine *pango_layout_iter_get_line   (PangoLayoutIter *iter);
583//PangoLayoutLine *pango_layout_iter_get_line_readonly  (PangoLayoutIter *iter);
584//gboolean         pango_layout_iter_at_last_line (PangoLayoutIter *iter);
585//PangoLayout     *pango_layout_iter_get_layout (PangoLayoutIter *iter);
586//
587//gboolean pango_layout_iter_next_char    (PangoLayoutIter *iter);
588//gboolean pango_layout_iter_next_cluster (PangoLayoutIter *iter);
589//gboolean pango_layout_iter_next_run     (PangoLayoutIter *iter);
590//gboolean pango_layout_iter_next_line    (PangoLayoutIter *iter);
591//
592//void pango_layout_iter_get_char_extents    (PangoLayoutIter *iter,
593//					    PangoRectangle  *logical_rect);
594//void pango_layout_iter_get_cluster_extents (PangoLayoutIter *iter,
595//					    PangoRectangle  *ink_rect,
596//					    PangoRectangle  *logical_rect);
597//void pango_layout_iter_get_run_extents     (PangoLayoutIter *iter,
598//					    PangoRectangle  *ink_rect,
599//					    PangoRectangle  *logical_rect);
600//void pango_layout_iter_get_line_extents    (PangoLayoutIter *iter,
601//					    PangoRectangle  *ink_rect,
602//					    PangoRectangle  *logical_rect);
603/* All the yranges meet, unlike the logical_rect's (i.e. the yranges
604 * assign between-line spacing to the nearest line)
605 */
606//void pango_layout_iter_get_line_yrange     (PangoLayoutIter *iter,
607//					    int             *y0_,
608//					    int             *y1_);
609//void pango_layout_iter_get_layout_extents  (PangoLayoutIter *iter,
610//					    PangoRectangle  *ink_rect,
611//					    PangoRectangle  *logical_rect);
612//int  pango_layout_iter_get_baseline        (PangoLayoutIter *iter);
613//
614