cairo 1.17.4 → 1.17.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS +49 -0
- data/ext/cairo/rb_cairo.c +1 -1
- data/ext/cairo/rb_cairo.h +1 -1
- data/ext/cairo/rb_cairo_constants.c +12 -2
- data/ext/cairo/rb_cairo_context.c +54 -16
- data/ext/cairo/rb_cairo_device.c +22 -13
- data/ext/cairo/rb_cairo_exception.c +20 -2
- data/ext/cairo/rb_cairo_font_extents.c +20 -3
- data/ext/cairo/rb_cairo_font_face.c +82 -21
- data/ext/cairo/rb_cairo_font_options.c +27 -15
- data/ext/cairo/rb_cairo_glyph.c +15 -12
- data/ext/cairo/rb_cairo_io.c +2 -2
- data/ext/cairo/rb_cairo_matrix.c +17 -14
- data/ext/cairo/rb_cairo_path.c +29 -44
- data/ext/cairo/rb_cairo_pattern.c +21 -13
- data/ext/cairo/rb_cairo_quartz_surface.c +5 -0
- data/ext/cairo/rb_cairo_rectangle.c +13 -2
- data/ext/cairo/rb_cairo_region.c +21 -13
- data/ext/cairo/rb_cairo_scaled_font.c +23 -14
- data/ext/cairo/rb_cairo_surface.c +65 -20
- data/ext/cairo/rb_cairo_text_cluster.c +20 -14
- data/ext/cairo/rb_cairo_text_extents.c +20 -3
- data/test/test_context.rb +14 -0
- data/test/test_font_face.rb +165 -70
- data/test/test_quartz_image_surface.rb +5 -3
- data/test/test_svg_surface.rb +5 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f5ac730747ea5dada591e534a7c0653a0d1ad3fa3962dfdd01173e0074ff835c
|
4
|
+
data.tar.gz: 2fbccb304f8b4dbd3a89df42c9f1779b45a84b2f4c9be5ab591992eb9d7c3d31
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 389eeca0e8c453e3c1b2ebe10053a1713c1c1ae93b22e46100b5bc1c39d566f00f60a1c676ae288e06fa9fdea6f24db8e107d53355bd52bc0e067e5b8b4fe073
|
7
|
+
data.tar.gz: d107b587d530433a0288f73a5b8d85710e2923213347f88e09de92562645dbcd9e501f8f9ab1bd74bb9ae13559ee94999e94c7555cd96a345b9d1d75965b961c
|
data/NEWS
CHANGED
@@ -1,3 +1,52 @@
|
|
1
|
+
Release 1.17.7 (2022-07-31) Sutou Kouhei <kou@cozmixng.org>
|
2
|
+
===========================================================
|
3
|
+
|
4
|
+
Fixes
|
5
|
+
-----
|
6
|
+
|
7
|
+
* Fixed a bug that Cairo::UserFontFace#on_render_color_glyph isn't
|
8
|
+
called.
|
9
|
+
|
10
|
+
Release 1.17.6 (2022-07-30) Sutou Kouhei <kou@cozmixng.org>
|
11
|
+
===========================================================
|
12
|
+
|
13
|
+
Improvements
|
14
|
+
------------
|
15
|
+
|
16
|
+
* Added support for cairo 1.17.6:
|
17
|
+
|
18
|
+
* Added Cairo::PDFVersion::VERSION_1_6.
|
19
|
+
|
20
|
+
* Added Cairo::PDFVersion::VERSION_1_7.
|
21
|
+
|
22
|
+
* Added Cairo::PDFSurface#set_metadata.
|
23
|
+
|
24
|
+
* Added Cairo::DirectWriteError.
|
25
|
+
|
26
|
+
* Added Cairo::Context#set_hairline.
|
27
|
+
|
28
|
+
* Added Cairo::Context#hairline?.
|
29
|
+
|
30
|
+
* Added Cairo::UserFont#on_render_color_glyph.
|
31
|
+
|
32
|
+
* Updated tests for cairo 1.17.6.
|
33
|
+
[GitHub#75][Reported by Mamoru TASAKA]
|
34
|
+
|
35
|
+
Fixes
|
36
|
+
-----
|
37
|
+
|
38
|
+
* Fixed a wrong conversion bug for the rest size argument in read
|
39
|
+
callback.
|
40
|
+
|
41
|
+
* Fixed a wrong conversion bug in Cairo::Options#hash.
|
42
|
+
|
43
|
+
* Fixed a GC related crash bug in Cairo::Surface#finish.
|
44
|
+
|
45
|
+
Thanks
|
46
|
+
------
|
47
|
+
|
48
|
+
* Mamoru TASAKA
|
49
|
+
|
1
50
|
Release 1.17.4 (2021-01-17) Sutou Kouhei <kou@cozmixng.org>
|
2
51
|
===========================================================
|
3
52
|
|
data/ext/cairo/rb_cairo.c
CHANGED
data/ext/cairo/rb_cairo.h
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-09-19 12:56:27 $
|
7
7
|
*
|
8
|
-
* Copyright 2005-
|
8
|
+
* Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
|
9
9
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
10
10
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
11
11
|
*
|
@@ -113,7 +113,11 @@ VALUE rb_mCairo_SVGUnit = Qnil;
|
|
113
113
|
#define CAIRO_PS_LEVEL_MAX CAIRO_PS_LEVEL_3
|
114
114
|
|
115
115
|
#define CAIRO_PDF_VERSION_MIN CAIRO_PDF_VERSION_1_4
|
116
|
-
#
|
116
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
117
|
+
# define CAIRO_PDF_VERSION_MAX CAIRO_PDF_VERSION_1_7
|
118
|
+
#else
|
119
|
+
# define CAIRO_PDF_VERSION_MAX CAIRO_PDF_VERSION_1_5
|
120
|
+
#endif
|
117
121
|
|
118
122
|
#define CAIRO_TEXT_CLUSTER_FLAG_MIN 0
|
119
123
|
#define CAIRO_TEXT_CLUSTER_FLAG_MAX CAIRO_TEXT_CLUSTER_FLAG_BACKWARD
|
@@ -644,6 +648,12 @@ Init_cairo_constants (void)
|
|
644
648
|
INT2FIX (CAIRO_PDF_VERSION_1_4));
|
645
649
|
rb_define_const (rb_mCairo_PDFVersion, "VERSION_1_5",
|
646
650
|
INT2FIX (CAIRO_PDF_VERSION_1_5));
|
651
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
652
|
+
rb_define_const (rb_mCairo_PDFVersion, "VERSION_1_6",
|
653
|
+
INT2FIX (CAIRO_PDF_VERSION_1_6));
|
654
|
+
rb_define_const (rb_mCairo_PDFVersion, "VERSION_1_7",
|
655
|
+
INT2FIX (CAIRO_PDF_VERSION_1_7));
|
656
|
+
# endif
|
647
657
|
|
648
658
|
rb_define_singleton_method (rb_mCairo_PDFVersion, "list",
|
649
659
|
cr_pdf_get_versions, 0);
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-09-26 13:52:08 $
|
7
7
|
*
|
8
|
-
* Copyright 2005-
|
8
|
+
* Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
|
9
9
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
10
10
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
11
11
|
*
|
@@ -40,6 +40,23 @@ cr_check_status (cairo_t *context)
|
|
40
40
|
rb_cairo_check_status (cairo_status (context));
|
41
41
|
}
|
42
42
|
|
43
|
+
static void
|
44
|
+
cr_context_free (void *ptr)
|
45
|
+
{
|
46
|
+
cairo_destroy ((cairo_t *) ptr);
|
47
|
+
}
|
48
|
+
|
49
|
+
static const rb_data_type_t cr_context_type = {
|
50
|
+
"Cairo::Context",
|
51
|
+
{
|
52
|
+
NULL,
|
53
|
+
cr_context_free,
|
54
|
+
},
|
55
|
+
NULL,
|
56
|
+
NULL,
|
57
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
58
|
+
};
|
59
|
+
|
43
60
|
/* Functions for manipulating state objects */
|
44
61
|
cairo_t *
|
45
62
|
rb_cairo_context_from_ruby_object (VALUE obj)
|
@@ -49,7 +66,7 @@ rb_cairo_context_from_ruby_object (VALUE obj)
|
|
49
66
|
{
|
50
67
|
rb_raise (rb_eTypeError, "not a cairo graphics context");
|
51
68
|
}
|
52
|
-
|
69
|
+
TypedData_Get_Struct (obj, cairo_t, &cr_context_type, context);
|
53
70
|
if (!context)
|
54
71
|
rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER);
|
55
72
|
return context;
|
@@ -67,22 +84,13 @@ cr_object_holder_free (void *ptr)
|
|
67
84
|
rb_cairo__object_holder_free (rb_cCairo_Context, ptr);
|
68
85
|
}
|
69
86
|
|
70
|
-
static void
|
71
|
-
cr_context_free (void *ptr)
|
72
|
-
{
|
73
|
-
if (ptr)
|
74
|
-
{
|
75
|
-
cairo_destroy ((cairo_t *) ptr);
|
76
|
-
}
|
77
|
-
}
|
78
|
-
|
79
87
|
VALUE
|
80
88
|
rb_cairo_context_to_ruby_object (cairo_t *cr)
|
81
89
|
{
|
82
90
|
if (cr)
|
83
91
|
{
|
84
92
|
cairo_reference (cr);
|
85
|
-
return
|
93
|
+
return TypedData_Wrap_Struct (rb_cCairo_Context, &cr_context_type, cr);
|
86
94
|
}
|
87
95
|
else
|
88
96
|
{
|
@@ -93,7 +101,7 @@ rb_cairo_context_to_ruby_object (cairo_t *cr)
|
|
93
101
|
static VALUE
|
94
102
|
cr_allocate (VALUE klass)
|
95
103
|
{
|
96
|
-
return
|
104
|
+
return TypedData_Wrap_Struct (klass, &cr_context_type, NULL);
|
97
105
|
}
|
98
106
|
|
99
107
|
static void
|
@@ -523,6 +531,16 @@ cr_set_line_width (VALUE self, VALUE width)
|
|
523
531
|
return self;
|
524
532
|
}
|
525
533
|
|
534
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
535
|
+
static VALUE
|
536
|
+
cr_set_hairline (VALUE self, VALUE hairline)
|
537
|
+
{
|
538
|
+
cairo_set_hairline (_SELF, RTEST (hairline));
|
539
|
+
cr_check_status (_SELF);
|
540
|
+
return self;
|
541
|
+
}
|
542
|
+
#endif
|
543
|
+
|
526
544
|
static VALUE
|
527
545
|
cr_set_line_cap (VALUE self, VALUE cap)
|
528
546
|
{
|
@@ -1490,6 +1508,14 @@ cr_get_line_width (VALUE self)
|
|
1490
1508
|
return rb_float_new (cairo_get_line_width (_SELF));
|
1491
1509
|
}
|
1492
1510
|
|
1511
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
1512
|
+
static VALUE
|
1513
|
+
cr_get_hairline (VALUE self)
|
1514
|
+
{
|
1515
|
+
return CBOOL2RVAL (cairo_get_hairline (_SELF));
|
1516
|
+
}
|
1517
|
+
#endif
|
1518
|
+
|
1493
1519
|
static VALUE
|
1494
1520
|
cr_get_line_cap (VALUE self)
|
1495
1521
|
{
|
@@ -1577,20 +1603,26 @@ static VALUE
|
|
1577
1603
|
cr_copy_path (VALUE self)
|
1578
1604
|
{
|
1579
1605
|
cairo_path_t *path;
|
1606
|
+
VALUE rb_path;
|
1580
1607
|
|
1581
1608
|
path = cairo_copy_path (_SELF);
|
1582
1609
|
rb_cairo_check_status (path->status);
|
1583
|
-
|
1610
|
+
rb_path = CRPATH2RVAL (path);
|
1611
|
+
cairo_path_destroy (path);
|
1612
|
+
return rb_path;
|
1584
1613
|
}
|
1585
1614
|
|
1586
1615
|
static VALUE
|
1587
1616
|
cr_copy_path_flat (VALUE self)
|
1588
1617
|
{
|
1589
1618
|
cairo_path_t *path;
|
1619
|
+
VALUE rb_path;
|
1590
1620
|
|
1591
|
-
path =
|
1621
|
+
path = cairo_copy_path_flat (_SELF);
|
1592
1622
|
rb_cairo_check_status (path->status);
|
1593
|
-
|
1623
|
+
rb_path = CRPATH2RVAL (path);
|
1624
|
+
cairo_path_destroy (path);
|
1625
|
+
return rb_path;
|
1594
1626
|
}
|
1595
1627
|
|
1596
1628
|
static VALUE
|
@@ -1751,6 +1783,9 @@ Init_cairo_context (void)
|
|
1751
1783
|
rb_define_method (rb_cCairo_Context, "set_antialias", cr_set_antialias, 1);
|
1752
1784
|
rb_define_method (rb_cCairo_Context, "set_fill_rule", cr_set_fill_rule, 1);
|
1753
1785
|
rb_define_method (rb_cCairo_Context, "set_line_width", cr_set_line_width, 1);
|
1786
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
1787
|
+
rb_define_method (rb_cCairo_Context, "set_hairline", cr_set_hairline, 1);
|
1788
|
+
#endif
|
1754
1789
|
rb_define_method (rb_cCairo_Context, "set_line_cap", cr_set_line_cap, 1);
|
1755
1790
|
rb_define_method (rb_cCairo_Context, "set_line_join", cr_set_line_join, 1);
|
1756
1791
|
rb_define_method (rb_cCairo_Context, "set_dash", cr_set_dash, -1);
|
@@ -1862,6 +1897,9 @@ Init_cairo_context (void)
|
|
1862
1897
|
cr_get_current_point, 0);
|
1863
1898
|
rb_define_method (rb_cCairo_Context, "fill_rule", cr_get_fill_rule, 0);
|
1864
1899
|
rb_define_method (rb_cCairo_Context, "line_width", cr_get_line_width, 0);
|
1900
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
1901
|
+
rb_define_method (rb_cCairo_Context, "hairline?", cr_get_hairline, 0);
|
1902
|
+
#endif
|
1865
1903
|
rb_define_method (rb_cCairo_Context, "line_cap", cr_get_line_cap, 0);
|
1866
1904
|
rb_define_method (rb_cCairo_Context, "line_join", cr_get_line_join, 0);
|
1867
1905
|
rb_define_method (rb_cCairo_Context, "miter_limit", cr_get_miter_limit, 0);
|
data/ext/cairo/rb_cairo_device.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* Ruby Cairo Binding
|
4
4
|
*
|
5
|
-
* Copyright 2010-
|
5
|
+
* Copyright 2010-2022 Sutou Kouhei <kou@cozmixng.org>
|
6
6
|
*
|
7
7
|
* This file is made available under the same terms as Ruby
|
8
8
|
*
|
@@ -117,6 +117,24 @@ cr_device_xml_supported_p (VALUE klass)
|
|
117
117
|
}
|
118
118
|
|
119
119
|
/* constructor/de-constructor */
|
120
|
+
static void
|
121
|
+
cr_device_free (void *ptr)
|
122
|
+
{
|
123
|
+
cairo_device_t *device = ptr;
|
124
|
+
cairo_device_destroy (device);
|
125
|
+
}
|
126
|
+
|
127
|
+
static const rb_data_type_t cr_device_type = {
|
128
|
+
"Cairo::Device",
|
129
|
+
{
|
130
|
+
NULL,
|
131
|
+
cr_device_free,
|
132
|
+
},
|
133
|
+
NULL,
|
134
|
+
NULL,
|
135
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
136
|
+
};
|
137
|
+
|
120
138
|
cairo_device_t *
|
121
139
|
rb_cairo_device_from_ruby_object (VALUE obj)
|
122
140
|
{
|
@@ -125,7 +143,7 @@ rb_cairo_device_from_ruby_object (VALUE obj)
|
|
125
143
|
{
|
126
144
|
rb_raise (rb_eTypeError, "not a cairo device");
|
127
145
|
}
|
128
|
-
|
146
|
+
TypedData_Get_Struct (obj, cairo_device_t, &cr_device_type, device);
|
129
147
|
if (!device)
|
130
148
|
rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER);
|
131
149
|
return device;
|
@@ -145,15 +163,6 @@ cr_object_holder_free (void *ptr)
|
|
145
163
|
}
|
146
164
|
#endif
|
147
165
|
|
148
|
-
static void
|
149
|
-
cr_device_free (void *ptr)
|
150
|
-
{
|
151
|
-
cairo_device_t *device = ptr;
|
152
|
-
|
153
|
-
if (device)
|
154
|
-
cairo_device_destroy (device);
|
155
|
-
}
|
156
|
-
|
157
166
|
VALUE
|
158
167
|
rb_cairo_device_to_ruby_object (cairo_device_t *device)
|
159
168
|
{
|
@@ -162,7 +171,7 @@ rb_cairo_device_to_ruby_object (cairo_device_t *device)
|
|
162
171
|
VALUE klass;
|
163
172
|
klass = cr_device_get_klass (device);
|
164
173
|
cairo_device_reference (device);
|
165
|
-
return
|
174
|
+
return TypedData_Wrap_Struct (klass, &cr_device_type, device);
|
166
175
|
}
|
167
176
|
else
|
168
177
|
{
|
@@ -185,7 +194,7 @@ rb_cairo_device_to_ruby_object_with_destroy (cairo_device_t *device)
|
|
185
194
|
static VALUE
|
186
195
|
cr_device_allocate (VALUE klass)
|
187
196
|
{
|
188
|
-
return
|
197
|
+
return TypedData_Wrap_Struct (klass, &cr_device_type, NULL);
|
189
198
|
}
|
190
199
|
|
191
200
|
static VALUE
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-16 12:52:16 $
|
7
7
|
*
|
8
|
-
* Copyright 2010-
|
8
|
+
* Copyright 2010-2022 Sutou Kouhei <kou@cozmixng.org>
|
9
9
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
10
10
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
11
11
|
*
|
@@ -71,6 +71,9 @@ static VALUE rb_eCairo_FreeTypeError;
|
|
71
71
|
static VALUE rb_eCairo_Win32GDIError;
|
72
72
|
static VALUE rb_eCairo_TagError;
|
73
73
|
#endif
|
74
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
75
|
+
static VALUE rb_eCairo_DirectWriteError;
|
76
|
+
#endif
|
74
77
|
|
75
78
|
void
|
76
79
|
rb_cairo_check_status (cairo_status_t status)
|
@@ -221,6 +224,11 @@ rb_cairo_check_status (cairo_status_t status)
|
|
221
224
|
rb_raise (rb_eCairo_TagError, "%s", string);
|
222
225
|
break;
|
223
226
|
#endif
|
227
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
228
|
+
case CAIRO_STATUS_DWRITE_ERROR:
|
229
|
+
rb_raise (rb_eCairo_DirectWriteError, "%s", string);
|
230
|
+
break;
|
231
|
+
#endif
|
224
232
|
#if CAIRO_CHECK_VERSION(1, 10, 0)
|
225
233
|
case CAIRO_STATUS_LAST_STATUS:
|
226
234
|
#else
|
@@ -328,12 +336,16 @@ rb_cairo__exception_to_status (VALUE exception)
|
|
328
336
|
else if (rb_cairo__is_kind_of (exception, rb_eCairo_TagError))
|
329
337
|
return CAIRO_STATUS_TAG_ERROR;
|
330
338
|
#endif
|
339
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
340
|
+
else if (rb_cairo__is_kind_of (exception, rb_eCairo_DirectWriteError))
|
341
|
+
return CAIRO_STATUS_DWRITE_ERROR;
|
342
|
+
#endif
|
331
343
|
|
332
344
|
return -1;
|
333
345
|
}
|
334
346
|
|
335
347
|
void
|
336
|
-
Init_cairo_exception ()
|
348
|
+
Init_cairo_exception (void)
|
337
349
|
{
|
338
350
|
VALUE rb_eCairo_Error;
|
339
351
|
rb_eCairo_Error =
|
@@ -488,4 +500,10 @@ Init_cairo_exception ()
|
|
488
500
|
rb_define_class_under (rb_mCairo, "TagError",
|
489
501
|
rb_eCairo_Error);
|
490
502
|
#endif
|
503
|
+
|
504
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
505
|
+
rb_eCairo_DirectWriteError =
|
506
|
+
rb_define_class_under (rb_mCairo, "DirectWriteError",
|
507
|
+
rb_eCairo_Error);
|
508
|
+
#endif
|
491
509
|
}
|
@@ -5,6 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-17 05:12:37 $
|
7
7
|
*
|
8
|
+
* Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
|
8
9
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
9
10
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
10
11
|
*
|
@@ -19,6 +20,17 @@ VALUE rb_cCairo_FontExtents;
|
|
19
20
|
|
20
21
|
#define _SELF(self) (RVAL2CRFONTEXTENTS(self))
|
21
22
|
|
23
|
+
static const rb_data_type_t cr_font_extents_type = {
|
24
|
+
"Cairo::FontExtents",
|
25
|
+
{
|
26
|
+
NULL,
|
27
|
+
ruby_xfree,
|
28
|
+
},
|
29
|
+
NULL,
|
30
|
+
NULL,
|
31
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
32
|
+
};
|
33
|
+
|
22
34
|
cairo_font_extents_t *
|
23
35
|
rb_cairo_font_extents_from_ruby_object (VALUE obj)
|
24
36
|
{
|
@@ -27,7 +39,10 @@ rb_cairo_font_extents_from_ruby_object (VALUE obj)
|
|
27
39
|
{
|
28
40
|
rb_raise (rb_eTypeError, "not a cairo font extents");
|
29
41
|
}
|
30
|
-
|
42
|
+
TypedData_Get_Struct (obj,
|
43
|
+
cairo_font_extents_t,
|
44
|
+
&cr_font_extents_type,
|
45
|
+
extents);
|
31
46
|
return extents;
|
32
47
|
}
|
33
48
|
|
@@ -38,7 +53,9 @@ rb_cairo_font_extents_to_ruby_object (cairo_font_extents_t *extents)
|
|
38
53
|
{
|
39
54
|
cairo_font_extents_t *new_extents = ALLOC (cairo_font_extents_t);
|
40
55
|
*new_extents = *extents;
|
41
|
-
return
|
56
|
+
return TypedData_Wrap_Struct (rb_cCairo_FontExtents,
|
57
|
+
&cr_font_extents_type,
|
58
|
+
new_extents);
|
42
59
|
}
|
43
60
|
else
|
44
61
|
{
|
@@ -49,7 +66,7 @@ rb_cairo_font_extents_to_ruby_object (cairo_font_extents_t *extents)
|
|
49
66
|
static VALUE
|
50
67
|
cr_font_extents_allocate (VALUE klass)
|
51
68
|
{
|
52
|
-
return
|
69
|
+
return TypedData_Wrap_Struct (klass, &cr_font_extents_type, NULL);
|
53
70
|
}
|
54
71
|
|
55
72
|
static VALUE
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-09-26 14:13:58 $
|
7
7
|
*
|
8
|
-
* Copyright 2003-
|
8
|
+
* Copyright 2003-2022 Sutou Kouhei <kou@cozmixng.org>
|
9
9
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
10
10
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
11
11
|
*
|
@@ -39,6 +39,9 @@ static ID cr_id_new;
|
|
39
39
|
|
40
40
|
static ID cr_id_init;
|
41
41
|
static ID cr_id_render_glyph;
|
42
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
43
|
+
static ID cr_id_render_color_glyph;
|
44
|
+
#endif
|
42
45
|
static ID cr_id_text_to_glyphs;
|
43
46
|
static ID cr_id_unicode_to_glyph;
|
44
47
|
|
@@ -52,6 +55,24 @@ static ID cr_id_at_need_cluster_flags;
|
|
52
55
|
|
53
56
|
#define _SELF (RVAL2CRFONTFACE(self))
|
54
57
|
|
58
|
+
static void
|
59
|
+
cr_font_face_free (void *ptr)
|
60
|
+
{
|
61
|
+
cairo_font_face_t *face = ptr;
|
62
|
+
cairo_font_face_destroy (face);
|
63
|
+
}
|
64
|
+
|
65
|
+
static const rb_data_type_t cr_font_face_type = {
|
66
|
+
"Cairo::FontFace",
|
67
|
+
{
|
68
|
+
NULL,
|
69
|
+
cr_font_face_free,
|
70
|
+
},
|
71
|
+
NULL,
|
72
|
+
NULL,
|
73
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
74
|
+
};
|
75
|
+
|
55
76
|
static inline void
|
56
77
|
cr_font_face_check_status (cairo_font_face_t *face)
|
57
78
|
{
|
@@ -69,23 +90,13 @@ rb_cairo_font_face_from_ruby_object (VALUE obj)
|
|
69
90
|
"not a cairo font face: %s",
|
70
91
|
rb_cairo__inspect (obj));
|
71
92
|
}
|
72
|
-
|
93
|
+
TypedData_Get_Struct (obj, cairo_font_face_t, &cr_font_face_type, face);
|
73
94
|
if (!face)
|
74
95
|
rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER);
|
75
96
|
cr_font_face_check_status (face);
|
76
97
|
return face;
|
77
98
|
}
|
78
99
|
|
79
|
-
static void
|
80
|
-
cr_font_face_free (void *ptr)
|
81
|
-
{
|
82
|
-
if (ptr)
|
83
|
-
{
|
84
|
-
cairo_font_face_t *face = ptr;
|
85
|
-
cairo_font_face_destroy (face);
|
86
|
-
}
|
87
|
-
}
|
88
|
-
|
89
100
|
VALUE
|
90
101
|
rb_cairo_font_face_to_ruby_object (cairo_font_face_t *face)
|
91
102
|
{
|
@@ -113,7 +124,7 @@ rb_cairo_font_face_to_ruby_object (cairo_font_face_t *face)
|
|
113
124
|
break;
|
114
125
|
}
|
115
126
|
cairo_font_face_reference (face);
|
116
|
-
return
|
127
|
+
return TypedData_Wrap_Struct (klass, &cr_font_face_type, face);
|
117
128
|
}
|
118
129
|
else
|
119
130
|
{
|
@@ -124,7 +135,7 @@ rb_cairo_font_face_to_ruby_object (cairo_font_face_t *face)
|
|
124
135
|
static VALUE
|
125
136
|
cr_font_face_allocate (VALUE klass)
|
126
137
|
{
|
127
|
-
return
|
138
|
+
return TypedData_Wrap_Struct (klass, &cr_font_face_type, NULL);
|
128
139
|
}
|
129
140
|
|
130
141
|
static VALUE
|
@@ -463,10 +474,11 @@ cr_user_font_face_render_glyph_func_after (VALUE user_data)
|
|
463
474
|
}
|
464
475
|
|
465
476
|
static cairo_status_t
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
|
477
|
+
cr_user_font_face_render_glyph_func_internal (cairo_scaled_font_t *scaled_font,
|
478
|
+
unsigned long glyph,
|
479
|
+
cairo_t *cr,
|
480
|
+
cairo_text_extents_t *extents,
|
481
|
+
ID id_registered_method_name)
|
470
482
|
{
|
471
483
|
cairo_status_t status = CAIRO_STATUS_SUCCESS;
|
472
484
|
cairo_font_face_t *face;
|
@@ -476,11 +488,12 @@ cr_user_font_face_render_glyph_func (cairo_scaled_font_t *scaled_font,
|
|
476
488
|
|
477
489
|
face = cairo_scaled_font_get_font_face (scaled_font);
|
478
490
|
self = (VALUE)cairo_font_face_get_user_data (face, &ruby_object_key);
|
479
|
-
receiver = rb_ivar_get (self,
|
480
|
-
if (NIL_P (receiver) &&
|
491
|
+
receiver = rb_ivar_get (self, id_registered_method_name);
|
492
|
+
if (NIL_P (receiver) &&
|
493
|
+
rb_obj_respond_to (self, id_registered_method_name, Qtrue))
|
481
494
|
{
|
482
495
|
receiver = self;
|
483
|
-
id_method_name =
|
496
|
+
id_method_name = id_registered_method_name;
|
484
497
|
}
|
485
498
|
|
486
499
|
if (!NIL_P (receiver))
|
@@ -507,6 +520,34 @@ cr_user_font_face_render_glyph_func (cairo_scaled_font_t *scaled_font,
|
|
507
520
|
return status;
|
508
521
|
}
|
509
522
|
|
523
|
+
static cairo_status_t
|
524
|
+
cr_user_font_face_render_glyph_func (cairo_scaled_font_t *scaled_font,
|
525
|
+
unsigned long glyph,
|
526
|
+
cairo_t *cr,
|
527
|
+
cairo_text_extents_t *extents)
|
528
|
+
{
|
529
|
+
return cr_user_font_face_render_glyph_func_internal (scaled_font,
|
530
|
+
glyph,
|
531
|
+
cr,
|
532
|
+
extents,
|
533
|
+
cr_id_render_glyph);
|
534
|
+
}
|
535
|
+
|
536
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
537
|
+
static cairo_status_t
|
538
|
+
cr_user_font_face_render_color_glyph_func (cairo_scaled_font_t *scaled_font,
|
539
|
+
unsigned long glyph,
|
540
|
+
cairo_t *cr,
|
541
|
+
cairo_text_extents_t *extents)
|
542
|
+
{
|
543
|
+
return cr_user_font_face_render_glyph_func_internal (scaled_font,
|
544
|
+
glyph,
|
545
|
+
cr,
|
546
|
+
extents,
|
547
|
+
cr_id_render_color_glyph);
|
548
|
+
}
|
549
|
+
#endif
|
550
|
+
|
510
551
|
typedef struct _cr_text_to_glyphs_after_hook_data {
|
511
552
|
VALUE text_to_glyphs_data;
|
512
553
|
cairo_glyph_t **glyphs;
|
@@ -703,6 +744,10 @@ cr_user_font_face_initialize (VALUE self)
|
|
703
744
|
(face, cr_user_font_face_init_func);
|
704
745
|
cairo_user_font_face_set_render_glyph_func
|
705
746
|
(face, cr_user_font_face_render_glyph_func);
|
747
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
748
|
+
cairo_user_font_face_set_render_color_glyph_func
|
749
|
+
(face, cr_user_font_face_render_color_glyph_func);
|
750
|
+
#endif
|
706
751
|
cairo_user_font_face_set_text_to_glyphs_func
|
707
752
|
(face, cr_user_font_face_text_to_glyphs_func);
|
708
753
|
cairo_user_font_face_set_unicode_to_glyph_func
|
@@ -732,6 +777,15 @@ cr_user_font_face_on_render_glyph (VALUE self)
|
|
732
777
|
return self;
|
733
778
|
}
|
734
779
|
|
780
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
781
|
+
static VALUE
|
782
|
+
cr_user_font_face_on_render_color_glyph (VALUE self)
|
783
|
+
{
|
784
|
+
rb_ivar_set (self, cr_id_render_color_glyph, rb_block_proc ());
|
785
|
+
return self;
|
786
|
+
}
|
787
|
+
#endif
|
788
|
+
|
735
789
|
static VALUE
|
736
790
|
cr_user_font_face_on_text_to_glyphs (VALUE self)
|
737
791
|
{
|
@@ -804,6 +858,9 @@ Init_cairo_font (void)
|
|
804
858
|
|
805
859
|
cr_id_init = rb_intern ("init");
|
806
860
|
cr_id_render_glyph = rb_intern ("render_glyph");
|
861
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
862
|
+
cr_id_render_color_glyph = rb_intern ("render_color_glyph");
|
863
|
+
#endif
|
807
864
|
cr_id_text_to_glyphs = rb_intern ("text_to_glyphs");
|
808
865
|
cr_id_unicode_to_glyph = rb_intern ("unicode_to_glyph");
|
809
866
|
|
@@ -867,6 +924,10 @@ Init_cairo_font (void)
|
|
867
924
|
cr_user_font_face_on_init, 0);
|
868
925
|
rb_define_method (rb_cCairo_UserFontFace, "on_render_glyph",
|
869
926
|
cr_user_font_face_on_render_glyph, 0);
|
927
|
+
#if CAIRO_CHECK_VERSION(1, 17, 6)
|
928
|
+
rb_define_method (rb_cCairo_UserFontFace, "on_render_color_glyph",
|
929
|
+
cr_user_font_face_on_render_color_glyph, 0);
|
930
|
+
#endif
|
870
931
|
rb_define_method (rb_cCairo_UserFontFace, "on_text_to_glyphs",
|
871
932
|
cr_user_font_face_on_text_to_glyphs, 0);
|
872
933
|
rb_define_method (rb_cCairo_UserFontFace, "on_unicode_to_glyph",
|