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