pango 0.20.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. data/ChangeLog +662 -0
  2. data/README +33 -0
  3. data/Rakefile +86 -0
  4. data/extconf.rb +68 -0
  5. data/sample/attribute.rb +82 -0
  6. data/sample/break.rb +26 -0
  7. data/sample/gdk_layout.rb +27 -0
  8. data/sample/glyphstring.rb +61 -0
  9. data/sample/item.rb +35 -0
  10. data/sample/label.rb +23 -0
  11. data/sample/layout.rb +102 -0
  12. data/sample/pango_cairo.rb +66 -0
  13. data/sample/parse.rb +33 -0
  14. data/sample/sample.txt +10 -0
  15. data/sample/script.rb +21 -0
  16. data/src/lib/pango.rb +60 -0
  17. data/src/makeinits.rb +48 -0
  18. data/src/rbpango.c +27 -0
  19. data/src/rbpango.h +97 -0
  20. data/src/rbpangoanalysis.c +197 -0
  21. data/src/rbpangoattribute.c +557 -0
  22. data/src/rbpangoattriterator.c +137 -0
  23. data/src/rbpangoattrlist.c +104 -0
  24. data/src/rbpangocairo.c +229 -0
  25. data/src/rbpangocolor.c +121 -0
  26. data/src/rbpangocontext.c +341 -0
  27. data/src/rbpangocoverage.c +104 -0
  28. data/src/rbpangoengine.c +65 -0
  29. data/src/rbpangofont.c +123 -0
  30. data/src/rbpangofontdescription.c +300 -0
  31. data/src/rbpangofontface.c +71 -0
  32. data/src/rbpangofontfamily.c +74 -0
  33. data/src/rbpangofontmap.c +104 -0
  34. data/src/rbpangofontmetrics.c +85 -0
  35. data/src/rbpangofontset.c +68 -0
  36. data/src/rbpangofontsetsimple.c +53 -0
  37. data/src/rbpangoglyphinfo.c +119 -0
  38. data/src/rbpangoglyphitem.c +129 -0
  39. data/src/rbpangoglyphstring.c +162 -0
  40. data/src/rbpangogravity.c +43 -0
  41. data/src/rbpangoinits.c +71 -0
  42. data/src/rbpangoitem.c +110 -0
  43. data/src/rbpangolanguage.c +88 -0
  44. data/src/rbpangolayout.c +593 -0
  45. data/src/rbpangolayoutiter.c +202 -0
  46. data/src/rbpangolayoutline.c +256 -0
  47. data/src/rbpangologattr.c +107 -0
  48. data/src/rbpangomain.c +213 -0
  49. data/src/rbpangomatrix.c +155 -0
  50. data/src/rbpangorectangle.c +178 -0
  51. data/src/rbpangorenderer.c +204 -0
  52. data/src/rbpangoscript.c +80 -0
  53. data/src/rbpangoscriptiter.c +91 -0
  54. data/src/rbpangotabarray.c +128 -0
  55. data/src/rbpangoversion.h +24 -0
  56. data/test/pango-test-utils.rb +9 -0
  57. data/test/run-test.rb +27 -0
  58. data/test/test-attribute.rb +19 -0
  59. data/test/test-language.rb +7 -0
  60. data/test/test_layout.rb +20 -0
  61. metadata +158 -0
@@ -0,0 +1,197 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /************************************************
3
+
4
+ rbpangoanalysis.c -
5
+
6
+ $Author: mutoh $
7
+ $Date: 2005/09/17 17:09:13 $
8
+
9
+ Copyright (C) 2003-2005 Masao Mutoh
10
+ ************************************************/
11
+
12
+ #include "rbpango.h"
13
+
14
+ #define _SELF(s) ((PangoAnalysis*)RVAL2BOXED(s, PANGO_TYPE_ANALYSIS))
15
+
16
+ /**********************************/
17
+ static PangoAnalysis*
18
+ ana_copy(const PangoAnalysis* val)
19
+ {
20
+ PangoAnalysis* new_val;
21
+ g_return_val_if_fail (val != NULL, NULL);
22
+ new_val = g_new(PangoAnalysis, 1);
23
+ *new_val = *val;
24
+ return new_val;
25
+ }
26
+
27
+ GType
28
+ pango_analysis_get_type(void)
29
+ {
30
+ static GType our_type = 0;
31
+
32
+ if (our_type == 0)
33
+ our_type = g_boxed_type_register_static ("PangoAnalysis",
34
+ (GBoxedCopyFunc)ana_copy,
35
+ (GBoxedFreeFunc)g_free);
36
+ return our_type;
37
+ }
38
+ /**********************************/
39
+
40
+ static VALUE
41
+ ana_initialize(self)
42
+ VALUE self;
43
+ {
44
+ PangoAnalysis ana = { NULL, NULL, NULL, 0 };
45
+ G_INITIALIZE(self, &ana);
46
+ return Qnil;
47
+ }
48
+
49
+ #if PANGO_CHECK_VERSION(1,4,0)
50
+ static VALUE
51
+ ana_set_shape_engine(self, engine)
52
+ VALUE self, engine;
53
+ {
54
+ _SELF(self)->shape_engine = PANGO_ENGINE_SHAPE(RVAL2GOBJ(engine));
55
+ return self;
56
+ }
57
+ static VALUE
58
+ ana_get_shape_engine(self)
59
+ VALUE self;
60
+ {
61
+ VALUE ret;
62
+ if (_SELF(self)->shape_engine){
63
+ const gchar* gname = G_OBJECT_TYPE_NAME(_SELF(self)->shape_engine);
64
+ gchar* name = g_strdup(gname);
65
+ name[0] = g_ascii_toupper(name[0]);
66
+ G_DEF_CLASS3(gname, name, mPango);
67
+ ret = GOBJ2RVAL(_SELF(self)->shape_engine);
68
+ } else {
69
+ ret = Qnil;
70
+ }
71
+ return ret;
72
+ }
73
+
74
+ static VALUE
75
+ ana_set_lang_engine(self, engine)
76
+ VALUE self, engine;
77
+ {
78
+ _SELF(self)->lang_engine = PANGO_ENGINE_LANG(RVAL2GOBJ(engine));
79
+ return self;
80
+ }
81
+ static VALUE
82
+ ana_get_lang_engine(self)
83
+ VALUE self;
84
+ {
85
+ VALUE ret;
86
+ if (_SELF(self)->lang_engine){
87
+ const gchar* gname = G_OBJECT_TYPE_NAME(_SELF(self)->lang_engine);
88
+ gchar* name = g_strdup(gname);
89
+ name[0] = g_ascii_toupper(name[0]);
90
+ G_DEF_CLASS3(name, name, mPango);
91
+ ret = GOBJ2RVAL(_SELF(self)->lang_engine);
92
+ } else {
93
+ ret = Qnil;
94
+ }
95
+ return ret;
96
+ }
97
+ #endif
98
+
99
+ static VALUE
100
+ ana_set_font(self, font)
101
+ VALUE self, font;
102
+ {
103
+ _SELF(self)->font = PANGO_FONT(RVAL2GOBJ(font));
104
+ return self;
105
+ }
106
+
107
+ static VALUE
108
+ ana_get_font(self)
109
+ VALUE self;
110
+ {
111
+ return GOBJ2RVAL(_SELF(self)->font);
112
+ }
113
+
114
+ static VALUE
115
+ ana_set_level(self, level)
116
+ VALUE self, level;
117
+ {
118
+ _SELF(self)->level = NUM2UINT(level);
119
+ return self;
120
+ }
121
+
122
+ static VALUE
123
+ ana_get_level(self)
124
+ VALUE self;
125
+ {
126
+ return UINT2NUM(_SELF(self)->level);
127
+ }
128
+
129
+ static VALUE
130
+ ana_set_language(self, lang)
131
+ VALUE self, lang;
132
+ {
133
+ _SELF(self)->language = RVAL2BOXED(lang, PANGO_TYPE_LANGUAGE);
134
+ return self;
135
+ }
136
+
137
+ static VALUE
138
+ ana_get_language(self)
139
+ VALUE self;
140
+ {
141
+ return BOXED2RVAL(_SELF(self)->language, PANGO_TYPE_LANGUAGE);
142
+ }
143
+
144
+ static VALUE
145
+ ana_set_extra_attrs(self, attrs)
146
+ VALUE self, attrs;
147
+ {
148
+ gint i;
149
+ gint len = RARRAY_LEN(attrs);
150
+ GSList* gattrs = NULL;
151
+
152
+ for (i = 0; i < len; i++){
153
+ gattrs = g_slist_append(gattrs, RVAL2ATTR(RARRAY_PTR(attrs)[i]));
154
+ }
155
+
156
+ _SELF(self)->extra_attrs = gattrs;
157
+ return self;
158
+ }
159
+
160
+ static VALUE
161
+ ana_get_extra_attrs(self)
162
+ VALUE self;
163
+ {
164
+ VALUE ary = rb_ary_new();
165
+ GSList* list = _SELF(self)->extra_attrs;
166
+
167
+ while (list) {
168
+ rb_ary_push(ary, ATTR2RVAL(list->data));
169
+ list = list->next;
170
+ }
171
+ return ary;
172
+ }
173
+
174
+ void
175
+ Init_pango_analysis()
176
+ {
177
+ VALUE pana = G_DEF_CLASS(PANGO_TYPE_ANALYSIS, "Analysis", mPango);
178
+
179
+ rb_define_method(pana, "initialize", ana_initialize, 0);
180
+ #if PANGO_CHECK_VERSION(1,4,0)
181
+ rb_define_method(pana, "set_shape_engine", ana_set_shape_engine, 1);
182
+ rb_define_method(pana, "shape_engine", ana_get_shape_engine, 0);
183
+ rb_define_method(pana, "set_lang_engine", ana_set_lang_engine, 1);
184
+ rb_define_method(pana, "lang_engine", ana_get_lang_engine, 0);
185
+ #endif
186
+ rb_define_method(pana, "set_font", ana_set_font, 1);
187
+ rb_define_method(pana, "font", ana_get_font, 0);
188
+ rb_define_method(pana, "set_level", ana_set_level, 1);
189
+ rb_define_method(pana, "level", ana_get_level, 0);
190
+ rb_define_method(pana, "set_language", ana_set_language, 1);
191
+ rb_define_method(pana, "language", ana_get_language, 0);
192
+
193
+ rb_define_method(pana, "set_extra_attrs", ana_set_extra_attrs, 1);
194
+ rb_define_method(pana, "extra_attrs", ana_get_extra_attrs, 0);
195
+
196
+ G_DEF_SETTERS(pana);
197
+ }
@@ -0,0 +1,557 @@
1
+ /* -*- c-file-style: "ruby"; indent-tabs-mode: nil -*- */
2
+ /************************************************
3
+
4
+ rbpangoattribute.c -
5
+
6
+ $Author: ggc $
7
+ $Date: 2007/07/13 16:07:33 $
8
+
9
+ Copyright (C) 2002-2005 Masao Mutoh
10
+ ************************************************/
11
+
12
+ #include "rbpango.h"
13
+
14
+ VALUE pattr, attrstring, pattrint, pattrfloat, pattrcolor, pattrbool;
15
+ static VALUE type_to_klass;
16
+
17
+ /***********************************************/
18
+ void
19
+ pango_add_attribute(attr_type, klass)
20
+ int attr_type;
21
+ VALUE klass;
22
+ {
23
+ rb_hash_aset(type_to_klass, INT2FIX(attr_type), klass);
24
+ }
25
+
26
+ /* This is for Attributes which has PangoAttrType. */
27
+ VALUE
28
+ pango_get_attribute_klass(attr_type)
29
+ VALUE attr_type;
30
+ {
31
+ VALUE type = Qnil;
32
+ if (TYPE(attr_type) == T_STRING){
33
+ char* strtype = RVAL2CSTR(attr_type);
34
+ if (strcmp(strtype, "Attribute") == 0){
35
+ type = pattr;
36
+ } else if (strcmp(strtype, "AttrString") == 0){
37
+ type = attrstring;
38
+ } else if (strcmp(strtype, "AttrInt") == 0){
39
+ type = pattrint;
40
+ } else if (strcmp(strtype, "AttrFloat") == 0){
41
+ type = pattrfloat;
42
+ } else if (strcmp(strtype, "AttrColor") == 0){
43
+ type = pattrcolor;
44
+ } else if (strcmp(strtype, "AttrBool") == 0){
45
+ type = pattrbool;
46
+ }
47
+ } else {
48
+ type = rb_hash_aref(type_to_klass, INT2FIX(attr_type));
49
+ }
50
+ return type;
51
+ }
52
+
53
+ VALUE
54
+ pango_make_attribute(attr)
55
+ PangoAttribute* attr;
56
+ {
57
+ if (attr == NULL) return Qnil;
58
+ return Data_Wrap_Struct(rb_hash_aref(type_to_klass, INT2FIX(attr->klass->type)), 0,
59
+ pango_attribute_destroy,
60
+ pango_attribute_copy(attr));
61
+ }
62
+
63
+ PangoAttribute*
64
+ pango_get_attribute(attr)
65
+ VALUE attr;
66
+ {
67
+ PangoAttribute *gattr;
68
+
69
+ if (NIL_P(attr)) return NULL;
70
+
71
+ if (!rb_obj_is_kind_of(attr, pattr)) {
72
+ rb_raise(rb_eTypeError, "not a Pango::Attribute...");
73
+ }
74
+ Data_Get_Struct(attr, PangoAttribute, gattr);
75
+ return gattr;
76
+ }
77
+
78
+ /***********************************************/
79
+ static VALUE
80
+ attr_s_allocate(klass)
81
+ VALUE klass;
82
+ {
83
+ /* Don't define destroy method here.
84
+ return Data_Wrap_Struct(klass, 0, pango_attribute_destroy, 0);
85
+ */
86
+ return Data_Wrap_Struct(klass, NULL, NULL, 0);
87
+ }
88
+
89
+ #ifdef HAVE_OBJECT_ALLOCATE
90
+ #define attr_s_new rb_class_new_instance
91
+ #else
92
+ static VALUE
93
+ attr_s_new(argc, argv, klass)
94
+ int argc;
95
+ VALUE* argv;
96
+ VALUE klass;
97
+ {
98
+ VALUE obj = attr_s_allocate(klass);
99
+ rb_obj_call_init(obj, argc, argv);
100
+ return obj;
101
+ }
102
+ #endif
103
+
104
+ /***********************************************/
105
+
106
+ /* This method implemented at rbpangomain.c
107
+ gboolean pango_parse_markup (const char *markup_text,
108
+ int length,
109
+ gunichar accel_marker,
110
+ PangoAttrList **attr_list,
111
+ char **text,
112
+ gunichar *accel_char,
113
+ GError **error);
114
+ */
115
+
116
+ static VALUE
117
+ attr_s_type_register(self, name)
118
+ VALUE self, name;
119
+ {
120
+ return INT2NUM(pango_attr_type_register(RVAL2CSTR(name)));
121
+ }
122
+
123
+ static VALUE
124
+ attr_equal(self, other)
125
+ VALUE self, other;
126
+ {
127
+ return CBOOL2RVAL(pango_attribute_equal(RVAL2ATTR(self), RVAL2ATTR(other)));
128
+ }
129
+
130
+ /*
131
+ * Structure accessors
132
+ */
133
+ /* PangoAttribute */
134
+ static VALUE
135
+ attr_start_index(self)
136
+ VALUE self;
137
+ {
138
+ return UINT2NUM(RVAL2ATTR(self)->start_index);
139
+ }
140
+
141
+ static VALUE
142
+ attr_set_start_index(VALUE self, VALUE value)
143
+ {
144
+ RVAL2ATTR(self)->start_index = NUM2UINT(value);
145
+ return Qnil;
146
+ }
147
+
148
+ static VALUE
149
+ attr_end_index(self)
150
+ VALUE self;
151
+ {
152
+ return UINT2NUM(RVAL2ATTR(self)->end_index);
153
+ }
154
+
155
+ static VALUE
156
+ attr_set_end_index(VALUE self, VALUE value)
157
+ {
158
+ RVAL2ATTR(self)->end_index = NUM2UINT(value);
159
+ return Qnil;
160
+ }
161
+
162
+ /* PangoAttrString */
163
+ static VALUE
164
+ attr_string_value(self)
165
+ VALUE self;
166
+ {
167
+ return CSTR2RVAL(((PangoAttrString*)RVAL2ATTR(self))->value);
168
+ }
169
+
170
+ /* PangoAttrLanguage */
171
+ static VALUE
172
+ attr_language_value(self)
173
+ VALUE self;
174
+ {
175
+ return BOXED2RVAL(((PangoAttrLanguage*)RVAL2ATTR(self))->value, PANGO_TYPE_LANGUAGE);
176
+ }
177
+
178
+ /* PangoAttrColor */
179
+ static VALUE
180
+ attr_color_value(self)
181
+ VALUE self;
182
+ {
183
+ PangoColor color = ((PangoAttrColor*)RVAL2ATTR(self))->color;
184
+ return BOXED2RVAL(&color, PANGO_TYPE_COLOR);
185
+ }
186
+
187
+ /* PangoAttrInt */
188
+ static VALUE
189
+ attr_int_value(self)
190
+ VALUE self;
191
+ {
192
+ return INT2NUM(((PangoAttrInt*)RVAL2ATTR(self))->value);
193
+ }
194
+
195
+ /* PangoAttrFloat */
196
+ static VALUE
197
+ attr_float_value(self)
198
+ VALUE self;
199
+ {
200
+ return rb_float_new(((PangoAttrFloat*)RVAL2ATTR(self))->value);
201
+ }
202
+
203
+ /* PangoAttrBool(This is Ruby/Pango's original class) */
204
+ static VALUE
205
+ attr_bool_value(self)
206
+ VALUE self;
207
+ {
208
+ return CBOOL2RVAL(((PangoAttrInt*)RVAL2ATTR(self))->value);
209
+ }
210
+
211
+ /* PangoAttrFontDesc */
212
+ static VALUE
213
+ attr_fontdesc_value(self)
214
+ VALUE self;
215
+ {
216
+ return BOXED2RVAL(((PangoAttrFontDesc*)RVAL2ATTR(self))->desc, PANGO_TYPE_FONT_DESCRIPTION);
217
+ }
218
+
219
+ /* PangoAttrShape */
220
+ static VALUE
221
+ attr_shape_ink_rect(self)
222
+ VALUE self;
223
+ {
224
+ PangoRectangle rect = ((PangoAttrShape*)RVAL2ATTR(self))->ink_rect;
225
+ return BOXED2RVAL(&rect, PANGO_TYPE_RECTANGLE);
226
+ }
227
+
228
+ static VALUE
229
+ attr_shape_logical_rect(self)
230
+ VALUE self;
231
+ {
232
+ PangoRectangle rect = ((PangoAttrShape*)RVAL2ATTR(self))->logical_rect;
233
+ return BOXED2RVAL(&rect, PANGO_TYPE_RECTANGLE);
234
+ }
235
+
236
+ static VALUE
237
+ attr_shape_value(self)
238
+ VALUE self;
239
+ {
240
+ return rb_ary_new3(2, attr_shape_ink_rect(self), attr_shape_logical_rect(self));
241
+ }
242
+
243
+ /*
244
+ * Initialize methods
245
+ */
246
+ #define MAKE_ATTRINT_INIT(klassname, funcname)\
247
+ static VALUE \
248
+ attr_ ## klassname ## _initialize(self, val)\
249
+ VALUE self, val;\
250
+ {\
251
+ DATA_PTR(self) = pango_attr_ ## funcname ## _new(NUM2INT(val));\
252
+ return Qnil;\
253
+ }
254
+
255
+ #define MAKE_ATTRENUM_INIT(klassname, funcname, type)\
256
+ static VALUE \
257
+ attr_ ## klassname ## _initialize(self, val)\
258
+ VALUE self, val;\
259
+ {\
260
+ DATA_PTR(self) = pango_attr_ ## funcname ## _new(RVAL2GENUM(val, type));\
261
+ return Qnil;\
262
+ }
263
+
264
+ static VALUE
265
+ attr_AttrLanguage_initialize(self, lang)
266
+ VALUE self, lang;
267
+ {
268
+ DATA_PTR(self) = pango_attr_language_new(
269
+ (PangoLanguage*)RVAL2BOXED(lang, PANGO_TYPE_LANGUAGE));
270
+ return Qnil;
271
+ }
272
+
273
+ static VALUE
274
+ attr_AttrFamily_initialize(self, family)
275
+ VALUE self, family;
276
+ {
277
+ DATA_PTR(self) = pango_attr_family_new(RVAL2CSTR(family));
278
+ return Qnil;
279
+ }
280
+
281
+ MAKE_ATTRENUM_INIT(AttrStyle, style, PANGO_TYPE_STYLE);
282
+ MAKE_ATTRENUM_INIT(AttrVariant, variant, PANGO_TYPE_VARIANT);
283
+ MAKE_ATTRENUM_INIT(AttrStretch, stretch, PANGO_TYPE_STRETCH);
284
+ MAKE_ATTRENUM_INIT(AttrWeight, weight, PANGO_TYPE_WEIGHT);
285
+
286
+ static VALUE
287
+ attr_AttrSize_initialize(self, size)
288
+ VALUE self, size;
289
+ {
290
+ DATA_PTR(self) = pango_attr_size_new(NUM2INT(size));
291
+ return Qnil;
292
+ }
293
+ #if PANGO_CHECK_VERSION(1,8,1)
294
+ static VALUE
295
+ attr_AttrAbsoluteSize_initialize(self, size)
296
+ VALUE self, size;
297
+ {
298
+ DATA_PTR(self) = pango_attr_size_new_absolute(NUM2INT(size));
299
+ return Qnil;
300
+ }
301
+ #endif
302
+
303
+ #if PANGO_CHECK_VERSION(1,16,0)
304
+ static VALUE
305
+ attr_AttrGravity_initialize(VALUE self, VALUE gravity)
306
+ {
307
+ DATA_PTR(self) = pango_attr_gravity_new(RVAL2GENUM(gravity, PANGO_TYPE_GRAVITY));
308
+ return Qnil;
309
+ }
310
+
311
+ static VALUE
312
+ attr_AttrGravityHint_initialize(VALUE self, VALUE gravity_hint)
313
+ {
314
+ DATA_PTR(self) = pango_attr_gravity_hint_new(RVAL2GENUM(gravity_hint, PANGO_TYPE_GRAVITY_HINT));
315
+ return Qnil;
316
+ }
317
+ #endif
318
+
319
+ static VALUE
320
+ attr_AttrFontDescription_initialize(self, fontdescription)
321
+ VALUE self, fontdescription;
322
+ {
323
+ DATA_PTR(self) = pango_attr_font_desc_new(
324
+ (PangoFontDescription*)RVAL2BOXED(fontdescription,
325
+ PANGO_TYPE_FONT_DESCRIPTION));
326
+
327
+ return Qnil;
328
+ }
329
+
330
+ static VALUE
331
+ attr_AttrForeground_initialize(self, r, g, b)
332
+ VALUE self, r, g, b;
333
+ {
334
+ DATA_PTR(self) = pango_attr_foreground_new(FIX2UINT(r), FIX2UINT(g), FIX2UINT(b));
335
+ return Qnil;
336
+ }
337
+
338
+ static VALUE
339
+ attr_AttrBackground_initialize(self, r, g, b)
340
+ VALUE self, r, g, b;
341
+ {
342
+ DATA_PTR(self) = pango_attr_background_new(FIX2UINT(r), FIX2UINT(g), FIX2UINT(b));
343
+ return Qnil;
344
+ }
345
+
346
+ static VALUE
347
+ attr_AttrStrikethrough_initialize(self, strikethrough)
348
+ VALUE self, strikethrough;
349
+ {
350
+ DATA_PTR(self) = pango_attr_strikethrough_new(RVAL2CBOOL(strikethrough));
351
+ return Qnil;
352
+ }
353
+ #if HAVE_PANGO_ATTR_STRIKETHROUGH_COLOR_NEW
354
+ static VALUE
355
+ attr_AttrStrikethroughColor_initialize(self, r, g, b)
356
+ VALUE self, r, g, b;
357
+ {
358
+ DATA_PTR(self) = pango_attr_strikethrough_color_new(FIX2UINT(r), FIX2UINT(g), FIX2UINT(b));
359
+ return Qnil;
360
+ }
361
+ #endif
362
+
363
+ MAKE_ATTRENUM_INIT(AttrUnderline, underline, PANGO_TYPE_UNDERLINE);
364
+ #if HAVE_PANGO_ATTR_UNDERLINE_COLOR_NEW
365
+ static VALUE
366
+ attr_AttrUnderlineColor_initialize(self, r, g, b)
367
+ VALUE self, r, g, b;
368
+ {
369
+ DATA_PTR(self) = pango_attr_underline_color_new(FIX2UINT(r), FIX2UINT(g), FIX2UINT(b));
370
+ return Qnil;
371
+ }
372
+ #endif
373
+
374
+ static VALUE
375
+ attr_AttrShape_initialize(argc, argv, self)
376
+ int argc;
377
+ VALUE *argv;
378
+ VALUE self;
379
+ {
380
+ VALUE ink_rect, logical_rect, data;
381
+
382
+ rb_scan_args(argc, argv, "21", &ink_rect, &logical_rect, &data);
383
+
384
+ if (NIL_P(data)){
385
+ DATA_PTR(self) = pango_attr_shape_new(
386
+ (PangoRectangle*)RVAL2BOXED(ink_rect, PANGO_TYPE_RECTANGLE),
387
+ (PangoRectangle*)RVAL2BOXED(logical_rect, PANGO_TYPE_RECTANGLE));
388
+ } else {
389
+ #if PANGO_CHECK_VERSION(1,8,0)
390
+ G_RELATIVE(self, data);
391
+ DATA_PTR(self) = pango_attr_shape_new_with_data(
392
+ (PangoRectangle*)RVAL2BOXED(ink_rect, PANGO_TYPE_RECTANGLE),
393
+ (PangoRectangle*)RVAL2BOXED(logical_rect, PANGO_TYPE_RECTANGLE),
394
+ (gpointer)data, NULL, NULL);
395
+ #else
396
+ rb_warning("not supported in Pango-1.6.x. the 3rd parameter was ignored.");
397
+ DATA_PTR(self) = pango_attr_shape_new(
398
+ (PangoRectangle*)RVAL2BOXED(ink_rect, PANGO_TYPE_RECTANGLE),
399
+ (PangoRectangle*)RVAL2BOXED(logical_rect, PANGO_TYPE_RECTANGLE));
400
+ #endif
401
+ }
402
+
403
+ return Qnil;
404
+ }
405
+
406
+ static VALUE
407
+ attr_AttrScale_initialize(self, scale)
408
+ VALUE self, scale;
409
+ {
410
+ DATA_PTR(self) = pango_attr_scale_new(NUM2DBL(scale));
411
+ return Qnil;
412
+ }
413
+
414
+ #if PANGO_CHECK_VERSION(1,4,0)
415
+ static VALUE
416
+ attr_AttrFallback_initialize(self, enable_fallback)
417
+ VALUE self, enable_fallback;
418
+ {
419
+ DATA_PTR(self) = pango_attr_fallback_new(RVAL2CBOOL(enable_fallback));
420
+ return Qnil;
421
+ }
422
+ #endif
423
+
424
+ MAKE_ATTRINT_INIT(AttrRise, rise);
425
+
426
+ #if PANGO_CHECK_VERSION(1,6,0)
427
+ MAKE_ATTRINT_INIT(AttrLetterSpacing, letter_spacing);
428
+ #endif
429
+
430
+ #define MAKE_ATTR(gtype, name, parent, num)\
431
+ tmpklass = rb_define_class_under(mPango, #name, parent);\
432
+ rb_hash_aset(type_to_klass, INT2FIX(gtype), tmpklass);\
433
+ rb_define_method(tmpklass, "initialize", attr_## name ## _initialize , num);
434
+
435
+ void
436
+ Init_pango_attribute()
437
+ {
438
+ VALUE tmpklass;
439
+ pattr = rb_define_class_under(mPango, "Attribute", rb_cData);
440
+
441
+ rb_define_singleton_method(pattr, "type_register", attr_s_type_register, 1);
442
+ rb_define_method(pattr, "==", attr_equal, 1);
443
+ rb_define_method(pattr, "start_index", attr_start_index, 0);
444
+ rb_define_method(pattr, "set_start_index", attr_set_start_index, 1);
445
+ rb_define_method(pattr, "end_index", attr_end_index, 0);
446
+ rb_define_method(pattr, "set_end_index", attr_set_end_index, 1);
447
+
448
+ G_DEF_SETTERS(pattr);
449
+
450
+ #ifndef HAVE_RB_DEFINE_ALLOC_FUNC
451
+ rb_define_singleton_method(pattr, "allocate", attr_s_allocate, 0);
452
+ #else
453
+ rb_define_alloc_func(pattr, (VALUE(*)_((VALUE)))attr_s_allocate);
454
+ #endif
455
+ #ifndef HAVE_OBJECT_ALLOCATE
456
+ rb_define_singleton_method(pattr, "new", attr_s_new, -1);
457
+ #endif
458
+
459
+ attrstring = rb_define_class_under(mPango, "AttrString", pattr);
460
+ rb_define_method(attrstring, "value", attr_string_value, 0);
461
+
462
+ pattrint = rb_define_class_under(mPango, "AttrInt", pattr);
463
+ rb_define_method(pattrint, "value", attr_int_value, 0);
464
+
465
+ pattrfloat = rb_define_class_under(mPango, "AttrFloat", pattr);
466
+ rb_define_method(pattrfloat, "value", attr_float_value, 0);
467
+
468
+ pattrcolor = rb_define_class_under(mPango, "AttrColor", pattr);
469
+ rb_define_method(pattrcolor, "value", attr_color_value, 0);
470
+
471
+ pattrbool = rb_define_class_under(mPango, "AttrBool", pattr);
472
+ rb_define_method(pattrbool, "value", attr_bool_value, 0);
473
+
474
+ rb_global_variable(&type_to_klass);
475
+ type_to_klass = rb_hash_new();
476
+
477
+ MAKE_ATTR(PANGO_ATTR_LANGUAGE, AttrLanguage, pattr, 1);
478
+ rb_define_method(tmpklass, "value", attr_language_value, 0);
479
+
480
+ MAKE_ATTR(PANGO_ATTR_FAMILY, AttrFamily, attrstring, 1);
481
+ MAKE_ATTR(PANGO_ATTR_STYLE, AttrStyle, pattrint, 1);
482
+ MAKE_ATTR(PANGO_ATTR_WEIGHT, AttrWeight, pattrint, 1);
483
+ MAKE_ATTR(PANGO_ATTR_VARIANT, AttrVariant, pattrint, 1);
484
+ MAKE_ATTR(PANGO_ATTR_STRETCH, AttrStretch, pattrint, 1);
485
+ MAKE_ATTR(PANGO_ATTR_SIZE, AttrSize, pattrint, 1);
486
+ #if PANGO_CHECK_VERSION(1,8,1)
487
+ MAKE_ATTR(PANGO_ATTR_ABSOLUTE_SIZE, AttrAbsoluteSize, pattrint, 1);
488
+ #endif
489
+ #if PANGO_CHECK_VERSION(1,16,0)
490
+ MAKE_ATTR(PANGO_ATTR_GRAVITY, AttrGravity, pattrint, 1);
491
+ MAKE_ATTR(PANGO_ATTR_GRAVITY_HINT, AttrGravityHint, pattrint, 1);
492
+ #endif
493
+ MAKE_ATTR(PANGO_ATTR_FONT_DESC, AttrFontDescription, pattr, 1);
494
+ rb_define_method(tmpklass, "value", attr_fontdesc_value, 0);
495
+ MAKE_ATTR(PANGO_ATTR_FOREGROUND, AttrForeground, pattrcolor, 3);
496
+ MAKE_ATTR(PANGO_ATTR_BACKGROUND, AttrBackground, pattrcolor, 3);
497
+ MAKE_ATTR(PANGO_ATTR_UNDERLINE, AttrUnderline, pattrint, 1);
498
+ /* PangoUnderline */
499
+ G_DEF_CLASS(PANGO_TYPE_UNDERLINE, "Underline", tmpklass);
500
+ G_DEF_CONSTANTS(tmpklass, PANGO_TYPE_UNDERLINE, "PANGO_UNDERLINE_");
501
+ #if HAVE_PANGO_ATTR_UNDERLINE_COLOR_NEW
502
+ MAKE_ATTR(PANGO_ATTR_UNDERLINE_COLOR, AttrUnderlineColor, pattrcolor, 3);
503
+ #endif
504
+
505
+ MAKE_ATTR(PANGO_ATTR_STRIKETHROUGH, AttrStrikethrough, pattrbool, 1);
506
+ #if HAVE_PANGO_ATTR_STRIKETHROUGH_COLOR_NEW
507
+ MAKE_ATTR(PANGO_ATTR_STRIKETHROUGH_COLOR, AttrStrikethroughColor, pattrcolor, 3);
508
+ #endif
509
+ MAKE_ATTR(PANGO_ATTR_RISE, AttrRise, pattrint, 1);
510
+ #if PANGO_CHECK_VERSION(1,6,0)
511
+ MAKE_ATTR(PANGO_ATTR_LETTER_SPACING, AttrLetterSpacing, pattrint, 1);
512
+ #endif
513
+ MAKE_ATTR(PANGO_ATTR_SHAPE, AttrShape, pattr, -1);
514
+ rb_define_method(tmpklass, "ink_rect", attr_shape_ink_rect, 0);
515
+ rb_define_method(tmpklass, "logical_rect", attr_shape_logical_rect, 0);
516
+ rb_define_method(tmpklass, "value", attr_shape_value, 0);
517
+ MAKE_ATTR(PANGO_ATTR_SCALE, AttrScale, pattrfloat, 1);
518
+ /* PangoScale */
519
+ rb_define_const(tmpklass, "XX_SMALL", rb_float_new(PANGO_SCALE_XX_SMALL));
520
+ rb_define_const(tmpklass, "X_SMALL", rb_float_new(PANGO_SCALE_X_SMALL));
521
+ rb_define_const(tmpklass, "SMALL", rb_float_new(PANGO_SCALE_SMALL));
522
+ rb_define_const(tmpklass, "MEDIUM", rb_float_new(PANGO_SCALE_MEDIUM));
523
+ rb_define_const(tmpklass, "LARGE", rb_float_new(PANGO_SCALE_LARGE));
524
+ rb_define_const(tmpklass, "X_LARGE", rb_float_new(PANGO_SCALE_X_LARGE));
525
+ rb_define_const(tmpklass, "XX_LARGE", rb_float_new(PANGO_SCALE_XX_LARGE));
526
+ #if PANGO_CHECK_VERSION(1,4,0)
527
+ MAKE_ATTR(PANGO_ATTR_FALLBACK, AttrFallback, pattrbool, 1);
528
+ #endif
529
+ /* PangoAttrType */
530
+ G_DEF_CLASS(PANGO_TYPE_ATTR_TYPE, "Type", pattr);
531
+ #define INT2ATTRTYPE(x) rbgobj_make_enum((x), PANGO_TYPE_ATTR_TYPE)
532
+ rb_define_const(pattr, "TYPE_INVALID", INT2ATTRTYPE(PANGO_ATTR_INVALID));
533
+ rb_define_const(pattr, "TYPE_LANGUAGE", INT2ATTRTYPE(PANGO_ATTR_LANGUAGE));
534
+ rb_define_const(pattr, "TYPE_FAMILY", INT2ATTRTYPE(PANGO_ATTR_FAMILY));
535
+ rb_define_const(pattr, "TYPE_STYLE", INT2ATTRTYPE(PANGO_ATTR_STYLE));
536
+ rb_define_const(pattr, "TYPE_WEIGHT", INT2ATTRTYPE(PANGO_ATTR_WEIGHT));
537
+ rb_define_const(pattr, "TYPE_VARIANT", INT2ATTRTYPE(PANGO_ATTR_VARIANT));
538
+ rb_define_const(pattr, "TYPE_STRETCH", INT2ATTRTYPE(PANGO_ATTR_STRETCH));
539
+ rb_define_const(pattr, "TYPE_SIZE", INT2ATTRTYPE(PANGO_ATTR_SIZE));
540
+ rb_define_const(pattr, "TYPE_FONT_DESC", INT2ATTRTYPE(PANGO_ATTR_FONT_DESC));
541
+ rb_define_const(pattr, "TYPE_FOREGROUND", INT2ATTRTYPE(PANGO_ATTR_FOREGROUND));
542
+ rb_define_const(pattr, "TYPE_BACKGROUND", INT2ATTRTYPE(PANGO_ATTR_BACKGROUND));
543
+ rb_define_const(pattr, "TYPE_UNDERLINE", INT2ATTRTYPE(PANGO_ATTR_UNDERLINE));
544
+ rb_define_const(pattr, "TYPE_STRIKETHROUGH", INT2ATTRTYPE(PANGO_ATTR_STRIKETHROUGH));
545
+ #if PANGO_CHECK_VERSION(1,8,0)
546
+ rb_define_const(pattr, "TYPE_STRIKETHROUGH_COLOR", INT2ATTRTYPE(PANGO_ATTR_STRIKETHROUGH_COLOR));
547
+ #endif
548
+ rb_define_const(pattr, "TYPE_RISE", INT2ATTRTYPE(PANGO_ATTR_RISE));
549
+ rb_define_const(pattr, "TYPE_SHAPE", INT2ATTRTYPE(PANGO_ATTR_SHAPE));
550
+ rb_define_const(pattr, "TYPE_SCALE", INT2ATTRTYPE(PANGO_ATTR_SCALE));
551
+ #if PANGO_CHECK_VERSION(1,8,0)
552
+ rb_define_const(pattr, "TYPE_FALLBACK", INT2ATTRTYPE(PANGO_ATTR_FALLBACK));
553
+ #endif
554
+ #if PANGO_CHECK_VERSION(1,6,0)
555
+ rb_define_const(pattr, "TYPE_LETTER_SPACING", INT2ATTRTYPE(PANGO_ATTR_LETTER_SPACING));
556
+ #endif
557
+ }