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	"unsafe"
26
27	"github.com/gotk3/gotk3/glib"
28)
29
30func init() {
31	tm := []glib.TypeMarshaler{
32		// Enums
33		{glib.Type(C.pango_attr_type_get_type()), marshalAttrType},
34		{glib.Type(C.pango_underline_get_type()), marshalUnderline},
35	}
36	glib.RegisterGValueMarshalers(tm)
37}
38
39/* PangoColor */
40
41// Color is a representation of PangoColor.
42type Color struct {
43	pangoColor *C.PangoColor
44}
45
46// Native returns a pointer to the underlying PangoColor.
47func (v *Color) Native() uintptr {
48	return uintptr(unsafe.Pointer(v.native()))
49}
50
51func (v *Color) native() *C.PangoColor {
52	return (*C.PangoColor)(unsafe.Pointer(v.pangoColor))
53}
54
55func (v *Color) Set(red, green, blue uint16) {
56	v.native().red = C.guint16(red)
57	v.native().green = C.guint16(green)
58	v.native().blue = C.guint16(blue)
59}
60
61func (v *Color) Get() (red, green, blue uint16) {
62	return uint16(v.native().red), uint16(v.native().green), uint16(v.native().blue)
63}
64
65//PangoColor *pango_color_copy     (const PangoColor *src);
66func (v *Color) Copy(c *Color) *Color {
67	w := new(Color)
68	w.pangoColor = C.pango_color_copy(v.native())
69	return w
70}
71
72//void        pango_color_free     (PangoColor       *color);
73func (v *Color) Free() {
74	C.pango_color_free(v.native())
75}
76
77//gboolean    pango_color_parse    (PangoColor       *color,
78//			  const char       *spec);
79func (v *Color) Parse(spec string) bool {
80	cstr := C.CString(spec)
81	defer C.free(unsafe.Pointer(cstr))
82	c := C.pango_color_parse(v.native(), (*C.char)(cstr))
83	return gobool(c)
84}
85
86//gchar      *pango_color_to_string(const PangoColor *color);
87func (v *Color) ToString() string {
88	c := C.pango_color_to_string(v.native())
89	return C.GoString((*C.char)(c))
90}
91
92/* ---  ---  --- Attributes ---  ---  ---  */
93
94// AttrList is a representation of PangoAttrList.
95type AttrList struct {
96	pangoAttrList *C.PangoAttrList
97}
98
99// Native returns a pointer to the underlying PangoLayout.
100func (v *AttrList) Native() uintptr {
101	return uintptr(unsafe.Pointer(v.native()))
102}
103
104func (v *AttrList) native() *C.PangoAttrList {
105	return (*C.PangoAttrList)(unsafe.Pointer(v.pangoAttrList))
106}
107
108func (v *AttrList) Insert(attribute *Attribute) {
109	C.pango_attr_list_insert(v.pangoAttrList, attribute.native())
110}
111
112func AttrListNew() *AttrList {
113	c := C.pango_attr_list_new()
114	attrList := new(AttrList)
115	attrList.pangoAttrList = c
116	return attrList
117}
118
119// AttrType is a representation of Pango's PangoAttrType.
120type AttrType int
121
122const (
123	ATTR_INVALID             AttrType = C.PANGO_ATTR_INVALID             /* 0 is an invalid attribute type */
124	ATTR_LANGUAGE            AttrType = C.PANGO_ATTR_LANGUAGE            /* PangoAttrLanguage */
125	ATTR_FAMILY              AttrType = C.PANGO_ATTR_FAMILY              /* PangoAttrString */
126	ATTR_STYLE               AttrType = C.PANGO_ATTR_STYLE               /* PangoAttrInt */
127	ATTR_WEIGHT              AttrType = C.PANGO_ATTR_WEIGHT              /* PangoAttrInt */
128	ATTR_VARIANT             AttrType = C.PANGO_ATTR_VARIANT             /* PangoAttrInt */
129	ATTR_STRETCH             AttrType = C.PANGO_ATTR_STRETCH             /* PangoAttrInt */
130	ATTR_SIZE                AttrType = C.PANGO_ATTR_SIZE                /* PangoAttrSize */
131	ATTR_FONT_DESC           AttrType = C.PANGO_ATTR_FONT_DESC           /* PangoAttrFontDesc */
132	ATTR_FOREGROUND          AttrType = C.PANGO_ATTR_FOREGROUND          /* PangoAttrColor */
133	ATTR_BACKGROUND          AttrType = C.PANGO_ATTR_BACKGROUND          /* PangoAttrColor */
134	ATTR_UNDERLINE           AttrType = C.PANGO_ATTR_UNDERLINE           /* PangoAttrInt */
135	ATTR_STRIKETHROUGH       AttrType = C.PANGO_ATTR_STRIKETHROUGH       /* PangoAttrInt */
136	ATTR_RISE                AttrType = C.PANGO_ATTR_RISE                /* PangoAttrInt */
137	ATTR_SHAPE               AttrType = C.PANGO_ATTR_SHAPE               /* PangoAttrShape */
138	ATTR_SCALE               AttrType = C.PANGO_ATTR_SCALE               /* PangoAttrFloat */
139	ATTR_FALLBACK            AttrType = C.PANGO_ATTR_FALLBACK            /* PangoAttrInt */
140	ATTR_LETTER_SPACING      AttrType = C.PANGO_ATTR_LETTER_SPACING      /* PangoAttrInt */
141	ATTR_UNDERLINE_COLOR     AttrType = C.PANGO_ATTR_UNDERLINE_COLOR     /* PangoAttrColor */
142	ATTR_STRIKETHROUGH_COLOR AttrType = C.PANGO_ATTR_STRIKETHROUGH_COLOR /* PangoAttrColor */
143	ATTR_ABSOLUTE_SIZE       AttrType = C.PANGO_ATTR_ABSOLUTE_SIZE       /* PangoAttrSize */
144	ATTR_GRAVITY             AttrType = C.PANGO_ATTR_GRAVITY             /* PangoAttrInt */
145	ATTR_GRAVITY_HINT        AttrType = C.PANGO_ATTR_GRAVITY_HINT        /* PangoAttrInt */
146
147)
148
149func marshalAttrType(p uintptr) (interface{}, error) {
150	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
151	return AttrType(c), nil
152}
153
154// Underline is a representation of Pango's PangoUnderline.
155type Underline int
156
157const (
158	UNDERLINE_NONE   Underline = C.PANGO_UNDERLINE_NONE
159	UNDERLINE_SINGLE Underline = C.PANGO_UNDERLINE_SINGLE
160	UNDERLINE_DOUBLE Underline = C.PANGO_UNDERLINE_DOUBLE
161	UNDERLINE_LOW    Underline = C.PANGO_UNDERLINE_LOW
162	UNDERLINE_ERROR  Underline = C.PANGO_UNDERLINE_ERROR
163)
164
165func marshalUnderline(p uintptr) (interface{}, error) {
166	c := C.g_value_get_enum((*C.GValue)(unsafe.Pointer(p)))
167	return Underline(c), nil
168}
169
170const (
171	ATTR_INDEX_FROM_TEXT_BEGINNING uint = 0
172	ATTR_INDEX_TO_TEXT_END         uint = C.G_MAXUINT
173)
174
175// Attribute is a representation of Pango's PangoAttribute.
176type Attribute struct {
177	pangoAttribute *C.PangoAttribute
178	//start_index, end_index uint
179}
180
181// Native returns a pointer to the underlying PangoColor.
182func (v *Attribute) Native() uintptr {
183	return uintptr(unsafe.Pointer(v.native()))
184}
185
186func (v *Attribute) native() *C.PangoAttribute {
187	return (*C.PangoAttribute)(unsafe.Pointer(v.pangoAttribute))
188}
189
190/*
191//typedef gboolean (*PangoAttrFilterFunc) (PangoAttribute *attribute,
192//					 gpointer        user_data);
193func (v *Attribute) AttrFilterFunc(user_data uintptr) bool {
194	c := C.PangoAttrFilterFunc(Attribute.native(), C.gpointer(user_data))
195	return gobool(c)
196}
197
198//typedef gpointer (*PangoAttrDataCopyFunc) (gconstpointer user_data);
199func AttrDataCopyFunc(user_data uintptr) uintptr {
200	c := C.PangoAttrDataCopyFunc(C.gpointer(user_data))
201	return uintptr(c)
202}
203*/
204
205// AttrClass is a representation of Pango's PangoAttrClass.
206type AttrClass struct {
207	//PangoAttrType type;
208}
209
210// AttrString is a representation of Pango's PangoAttrString.
211type AttrString struct {
212	Attribute
213	//char *value;
214}
215
216// AttrLanguage is a representation of Pango's PangoAttrLanguage.
217type AttrLanguage struct {
218	Attribute
219	//PangoLanguage *value;
220}
221
222// AttrInt is a representation of Pango's PangoAttrInt.
223type AttrInt struct {
224	Attribute
225	//int value;
226}
227
228// AttrFloat is a representation of Pango's PangoAttrFloat.
229type AttrFloat struct {
230	Attribute
231	//double value;
232}
233
234// AttrColor is a representation of Pango's AttrColor.
235type AttrColor struct {
236	Attribute
237	Color
238}
239
240// AttrSize is a representation of Pango's PangoAttrSize.
241type AttrSize struct {
242	Attribute
243	//int size;
244	//guint absolute : 1;
245}
246
247// AttrShape is a representation of Pango's PangoAttrShape.
248type AttrShape struct {
249	Attribute
250	//PangoRectangle ink_rect;
251	//PangoRectangle logical_rect;
252
253	//gpointer              data;
254	//PangoAttrDataCopyFunc copy_func;
255	//GDestroyNotify        destroy_func;
256}
257
258// AttrFontDesc is a representation of Pango's PangoAttrFontDesc.
259type AttrFontDesc struct {
260	Attribute
261	//PangoFontDescription *desc;
262}
263
264/*
265PangoAttrType         pango_attr_type_register (const gchar        *name);
266const char *          pango_attr_type_get_name (PangoAttrType       type) G_GNUC_CONST;
267
268void             pango_attribute_init        (PangoAttribute       *attr,
269					      const PangoAttrClass *klass);
270PangoAttribute * pango_attribute_copy        (const PangoAttribute *attr);
271void             pango_attribute_destroy     (PangoAttribute       *attr);
272gboolean         pango_attribute_equal       (const PangoAttribute *attr1,
273					      const PangoAttribute *attr2) G_GNUC_PURE;
274
275PangoAttribute *pango_attr_language_new      (PangoLanguage              *language);
276PangoAttribute *pango_attr_family_new        (const char                 *family);
277PangoAttribute *pango_attr_foreground_new    (guint16                     red,
278					      guint16                     green,
279					      guint16                     blue);
280PangoAttribute *pango_attr_background_new    (guint16                     red,
281					      guint16                     green,
282					      guint16                     blue);
283PangoAttribute *pango_attr_size_new          (int                         size);
284PangoAttribute *pango_attr_size_new_absolute (int                         size);
285PangoAttribute *pango_attr_style_new         (PangoStyle                  style);
286PangoAttribute *pango_attr_weight_new        (PangoWeight                 weight);
287PangoAttribute *pango_attr_variant_new       (PangoVariant                variant);
288PangoAttribute *pango_attr_stretch_new       (PangoStretch                stretch);
289PangoAttribute *pango_attr_font_desc_new     (const PangoFontDescription *desc);
290
291PangoAttribute *pango_attr_underline_new           (PangoUnderline underline);
292PangoAttribute *pango_attr_underline_color_new     (guint16        red,
293						    guint16        green,
294						    guint16        blue);
295PangoAttribute *pango_attr_strikethrough_new       (gboolean       strikethrough);
296PangoAttribute *pango_attr_strikethrough_color_new (guint16        red,
297						    guint16        green,
298						    guint16        blue);
299
300PangoAttribute *pango_attr_rise_new          (int                         rise);
301PangoAttribute *pango_attr_scale_new         (double                      scale_factor);
302PangoAttribute *pango_attr_fallback_new      (gboolean                    enable_fallback);
303PangoAttribute *pango_attr_letter_spacing_new (int                        letter_spacing);
304
305PangoAttribute *pango_attr_shape_new           (const PangoRectangle       *ink_rect,
306						const PangoRectangle       *logical_rect);
307PangoAttribute *pango_attr_shape_new_with_data (const PangoRectangle       *ink_rect,
308						const PangoRectangle       *logical_rect,
309						gpointer                    data,
310						PangoAttrDataCopyFunc       copy_func,
311						GDestroyNotify              destroy_func);
312
313PangoAttribute *pango_attr_gravity_new      (PangoGravity     gravity);
314PangoAttribute *pango_attr_gravity_hint_new (PangoGravityHint hint);
315
316GType              pango_attr_list_get_type      (void) G_GNUC_CONST;
317PangoAttrList *    pango_attr_list_new           (void);
318PangoAttrList *    pango_attr_list_ref           (PangoAttrList  *list);
319void               pango_attr_list_unref         (PangoAttrList  *list);
320PangoAttrList *    pango_attr_list_copy          (PangoAttrList  *list);
321void               pango_attr_list_insert        (PangoAttrList  *list,
322						  PangoAttribute *attr);
323void               pango_attr_list_insert_before (PangoAttrList  *list,
324						  PangoAttribute *attr);
325void               pango_attr_list_change        (PangoAttrList  *list,
326						  PangoAttribute *attr);
327void               pango_attr_list_splice        (PangoAttrList  *list,
328						  PangoAttrList  *other,
329						  gint            pos,
330						  gint            len);
331
332PangoAttrList *pango_attr_list_filter (PangoAttrList       *list,
333				       PangoAttrFilterFunc  func,
334				       gpointer             data);
335
336PangoAttrIterator *pango_attr_list_get_iterator  (PangoAttrList  *list);
337
338void               pango_attr_iterator_range    (PangoAttrIterator     *iterator,
339						 gint                  *start,
340						 gint                  *end);
341gboolean           pango_attr_iterator_next     (PangoAttrIterator     *iterator);
342PangoAttrIterator *pango_attr_iterator_copy     (PangoAttrIterator     *iterator);
343void               pango_attr_iterator_destroy  (PangoAttrIterator     *iterator);
344PangoAttribute *   pango_attr_iterator_get      (PangoAttrIterator     *iterator,
345						 PangoAttrType          type);
346void               pango_attr_iterator_get_font (PangoAttrIterator     *iterator,
347						 PangoFontDescription  *desc,
348						 PangoLanguage        **language,
349						 GSList               **extra_attrs);
350GSList *          pango_attr_iterator_get_attrs (PangoAttrIterator     *iterator);
351
352
353gboolean pango_parse_markup (const char                 *markup_text,
354			     int                         length,
355			     gunichar                    accel_marker,
356			     PangoAttrList             **attr_list,
357			     char                      **text,
358			     gunichar                   *accel_char,
359			     GError                    **error);
360
361GMarkupParseContext * pango_markup_parser_new (gunichar               accel_marker);
362gboolean              pango_markup_parser_finish (GMarkupParseContext   *context,
363                                                  PangoAttrList        **attr_list,
364                                                  char                 **text,
365                                                  gunichar              *accel_char,
366                                                  GError               **error);
367*/
368