cairo 1.17.5 → 1.17.8
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/NEWS +63 -0
- data/ext/cairo/rb_cairo.c +1 -1
- data/ext/cairo/rb_cairo.h +2 -2
- data/ext/cairo/rb_cairo_constants.c +12 -2
- data/ext/cairo/rb_cairo_context.c +59 -21
- data/ext/cairo/rb_cairo_device.c +24 -15
- data/ext/cairo/rb_cairo_exception.c +20 -2
- data/ext/cairo/rb_cairo_font_extents.c +21 -4
- data/ext/cairo/rb_cairo_font_face.c +85 -24
- data/ext/cairo/rb_cairo_font_options.c +27 -15
- data/ext/cairo/rb_cairo_glyph.c +16 -13
- data/ext/cairo/rb_cairo_matrix.c +18 -15
- data/ext/cairo/rb_cairo_path.c +30 -45
- data/ext/cairo/rb_cairo_pattern.c +27 -19
- data/ext/cairo/rb_cairo_quartz_surface.c +7 -2
- data/ext/cairo/rb_cairo_rectangle.c +15 -4
- data/ext/cairo/rb_cairo_region.c +22 -14
- data/ext/cairo/rb_cairo_scaled_font.c +24 -15
- data/ext/cairo/rb_cairo_surface.c +82 -32
- data/ext/cairo/rb_cairo_text_cluster.c +21 -15
- data/ext/cairo/rb_cairo_text_extents.c +21 -4
- 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 +6 -6
@@ -17,6 +17,8 @@
|
|
17
17
|
#endif
|
18
18
|
|
19
19
|
#ifdef CAIRO_HAS_QUARTZ_SURFACE
|
20
|
+
static ID cr_id_image_surface;
|
21
|
+
|
20
22
|
# ifndef HAVE_TYPE_ENUM_RUBY_VALUE_TYPE
|
21
23
|
enum ruby_value_type {
|
22
24
|
RUBY_T_DATA = T_DATA
|
@@ -132,7 +134,7 @@ cr_quartz_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
132
134
|
}
|
133
135
|
|
134
136
|
rb_cairo_surface_check_status (surface);
|
135
|
-
|
137
|
+
RTYPEDDATA_DATA (self) = surface;
|
136
138
|
if (rb_block_given_p ())
|
137
139
|
rb_cairo__surface_yield_and_finish (self);
|
138
140
|
return Qnil;
|
@@ -167,7 +169,8 @@ cr_quartz_image_surface_initialize (VALUE self, VALUE image_surface)
|
|
167
169
|
|
168
170
|
surface = cairo_quartz_image_surface_create (RVAL2CRSURFACE (image_surface));
|
169
171
|
rb_cairo_surface_check_status (surface);
|
170
|
-
|
172
|
+
RTYPEDDATA_DATA (self) = surface;
|
173
|
+
rb_ivar_set (self, cr_id_image_surface, image_surface);
|
171
174
|
if (rb_block_given_p ())
|
172
175
|
rb_cairo__surface_yield_and_finish (self);
|
173
176
|
return Qnil;
|
@@ -199,6 +202,8 @@ Init_cairo_quartz_surface (void)
|
|
199
202
|
|
200
203
|
/* Quartz image surface */
|
201
204
|
#ifdef RB_CAIRO_HAS_QUARTZ_IMAGE_SURFACE
|
205
|
+
cr_id_image_surface = rb_intern ("image_surface");
|
206
|
+
|
202
207
|
rb_define_method (rb_cCairo_QuartzImageSurface, "initialize",
|
203
208
|
cr_quartz_image_surface_initialize, 1);
|
204
209
|
rb_define_method (rb_cCairo_QuartzImageSurface, "image",
|
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* Ruby Cairo Binding
|
4
4
|
*
|
5
|
-
* Copyright 2005-
|
5
|
+
* Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
|
6
6
|
*
|
7
7
|
* This file is made available under the same terms as Ruby
|
8
8
|
*
|
@@ -12,13 +12,24 @@
|
|
12
12
|
|
13
13
|
VALUE rb_cCairo_Rectangle;
|
14
14
|
|
15
|
-
#define _SELF ((cairo_rectangle_int_t *)
|
15
|
+
#define _SELF ((cairo_rectangle_int_t *)RTYPEDDATA_DATA (self))
|
16
16
|
|
17
17
|
#if CAIRO_CHECK_VERSION(1, 10, 0)
|
18
|
+
static const rb_data_type_t cr_rectangle_type = {
|
19
|
+
"Cairo::Rectangle",
|
20
|
+
{
|
21
|
+
NULL,
|
22
|
+
ruby_xfree,
|
23
|
+
},
|
24
|
+
NULL,
|
25
|
+
NULL,
|
26
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
27
|
+
};
|
28
|
+
|
18
29
|
static VALUE
|
19
30
|
cr_rectangle_allocate (VALUE klass)
|
20
31
|
{
|
21
|
-
return
|
32
|
+
return TypedData_Wrap_Struct (klass, &cr_rectangle_type, NULL);
|
22
33
|
}
|
23
34
|
|
24
35
|
static VALUE
|
@@ -28,7 +39,7 @@ cr_rectangle_initialize (VALUE self, VALUE x, VALUE y,
|
|
28
39
|
cairo_rectangle_int_t *rectangle;
|
29
40
|
|
30
41
|
rectangle = ALLOC (cairo_rectangle_int_t);
|
31
|
-
|
42
|
+
RTYPEDDATA_DATA (self) = rectangle;
|
32
43
|
|
33
44
|
rectangle->x = NUM2INT (x);
|
34
45
|
rectangle->y = NUM2INT (y);
|
data/ext/cairo/rb_cairo_region.c
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* Ruby Cairo Binding
|
4
4
|
*
|
5
|
-
* Copyright 2010 Kouhei
|
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
|
*
|
@@ -18,6 +18,23 @@ VALUE rb_cCairo_Region = Qnil;
|
|
18
18
|
|
19
19
|
#define _SELF (RVAL2CRREGION(self))
|
20
20
|
|
21
|
+
static void
|
22
|
+
cr_region_free (void *ptr)
|
23
|
+
{
|
24
|
+
cairo_region_destroy ((cairo_region_t *) ptr);
|
25
|
+
}
|
26
|
+
|
27
|
+
static const rb_data_type_t cr_region_type = {
|
28
|
+
"Cairo::Region",
|
29
|
+
{
|
30
|
+
NULL,
|
31
|
+
cr_region_free,
|
32
|
+
},
|
33
|
+
NULL,
|
34
|
+
NULL,
|
35
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
36
|
+
};
|
37
|
+
|
21
38
|
static inline void
|
22
39
|
cr_region_check_status (cairo_region_t *region)
|
23
40
|
{
|
@@ -32,26 +49,17 @@ rb_cairo_region_from_ruby_object (VALUE obj)
|
|
32
49
|
{
|
33
50
|
rb_raise (rb_eTypeError, "not a cairo region");
|
34
51
|
}
|
35
|
-
|
52
|
+
TypedData_Get_Struct (obj, cairo_region_t, &cr_region_type, region);
|
36
53
|
return region;
|
37
54
|
}
|
38
55
|
|
39
|
-
static void
|
40
|
-
cr_region_free (void *ptr)
|
41
|
-
{
|
42
|
-
if (ptr)
|
43
|
-
{
|
44
|
-
cairo_region_destroy ((cairo_region_t *) ptr);
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
56
|
VALUE
|
49
57
|
rb_cairo_region_to_ruby_object (cairo_region_t *region)
|
50
58
|
{
|
51
59
|
if (region)
|
52
60
|
{
|
53
61
|
cairo_region_reference (region);
|
54
|
-
return
|
62
|
+
return TypedData_Wrap_Struct (rb_cCairo_Region, &cr_region_type, region);
|
55
63
|
}
|
56
64
|
else
|
57
65
|
{
|
@@ -62,7 +70,7 @@ rb_cairo_region_to_ruby_object (cairo_region_t *region)
|
|
62
70
|
static VALUE
|
63
71
|
cr_region_allocate (VALUE klass)
|
64
72
|
{
|
65
|
-
return
|
73
|
+
return TypedData_Wrap_Struct (klass, &cr_region_type, NULL);
|
66
74
|
}
|
67
75
|
|
68
76
|
static VALUE
|
@@ -98,7 +106,7 @@ cr_region_initialize (int argc, VALUE *argv, VALUE self)
|
|
98
106
|
region = cairo_region_create_rectangles (rectangles, argc);
|
99
107
|
}
|
100
108
|
cr_region_check_status (region);
|
101
|
-
|
109
|
+
RTYPEDDATA_DATA (self) = region;
|
102
110
|
return Qnil;
|
103
111
|
}
|
104
112
|
|
@@ -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
|
*
|
10
10
|
* This file is made available under the same terms as Ruby
|
11
11
|
*
|
@@ -19,6 +19,23 @@ VALUE rb_cCairo_ScaledFont;
|
|
19
19
|
|
20
20
|
#define _SELF(self) (RVAL2CRSCALEDFONT(self))
|
21
21
|
|
22
|
+
static void
|
23
|
+
cr_scaled_font_free (void *ptr)
|
24
|
+
{
|
25
|
+
cairo_scaled_font_destroy ((cairo_scaled_font_t *) ptr);
|
26
|
+
}
|
27
|
+
|
28
|
+
static const rb_data_type_t cr_scaled_font_type = {
|
29
|
+
"Cairo::ScaledFont",
|
30
|
+
{
|
31
|
+
NULL,
|
32
|
+
cr_scaled_font_free,
|
33
|
+
},
|
34
|
+
NULL,
|
35
|
+
NULL,
|
36
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
37
|
+
};
|
38
|
+
|
22
39
|
static inline void
|
23
40
|
cr_scaled_font_check_status (cairo_scaled_font_t *font)
|
24
41
|
{
|
@@ -33,27 +50,19 @@ rb_cairo_scaled_font_from_ruby_object (VALUE obj)
|
|
33
50
|
{
|
34
51
|
rb_raise (rb_eTypeError, "not a cairo scaled font");
|
35
52
|
}
|
36
|
-
|
53
|
+
TypedData_Get_Struct (obj, cairo_scaled_font_t, &cr_scaled_font_type, font);
|
37
54
|
return font;
|
38
55
|
}
|
39
56
|
|
40
|
-
static void
|
41
|
-
cr_scaled_font_free (void *ptr)
|
42
|
-
{
|
43
|
-
if (ptr)
|
44
|
-
{
|
45
|
-
cairo_scaled_font_destroy ((cairo_scaled_font_t *) ptr);
|
46
|
-
}
|
47
|
-
}
|
48
|
-
|
49
57
|
VALUE
|
50
58
|
rb_cairo_scaled_font_to_ruby_object (cairo_scaled_font_t *font)
|
51
59
|
{
|
52
60
|
if (font)
|
53
61
|
{
|
54
62
|
cairo_scaled_font_reference (font);
|
55
|
-
return
|
56
|
-
|
63
|
+
return TypedData_Wrap_Struct (rb_cCairo_ScaledFont,
|
64
|
+
&cr_scaled_font_type,
|
65
|
+
font);
|
57
66
|
}
|
58
67
|
else
|
59
68
|
{
|
@@ -64,7 +73,7 @@ rb_cairo_scaled_font_to_ruby_object (cairo_scaled_font_t *font)
|
|
64
73
|
static VALUE
|
65
74
|
cr_scaled_font_allocate (VALUE klass)
|
66
75
|
{
|
67
|
-
return
|
76
|
+
return TypedData_Wrap_Struct (klass, &cr_scaled_font_type, NULL);
|
68
77
|
}
|
69
78
|
|
70
79
|
static VALUE
|
@@ -78,7 +87,7 @@ cr_scaled_font_initialize (VALUE self, VALUE face, VALUE matrix,
|
|
78
87
|
RVAL2CRMATRIX (ctm),
|
79
88
|
RVAL2CRFONTOPTIONS (options));
|
80
89
|
cr_scaled_font_check_status (font);
|
81
|
-
|
90
|
+
RTYPEDDATA_DATA (self) = font;
|
82
91
|
return Qnil;
|
83
92
|
}
|
84
93
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
/*
|
3
3
|
* Ruby Cairo Binding
|
4
4
|
*
|
5
|
-
* Copyright 2005-
|
5
|
+
* Copyright 2005-2022 Sutou Kouhei <kou@cozmixng.org>
|
6
6
|
* Copyright 2014 Patrick Hanevold <patrick.hanevold@gmail.com>
|
7
7
|
* Copyright 2005 Øyvind Kolås <pippin@freedesktop.org>
|
8
8
|
* Copyright 2004-2005 MenTaLguY <mental@rydia.com>
|
@@ -103,6 +103,18 @@ static cairo_user_data_key_t cr_finished_key;
|
|
103
103
|
|
104
104
|
#define _SELF (RVAL2CRSURFACE(self))
|
105
105
|
|
106
|
+
static void cr_surface_free (void *ptr);
|
107
|
+
static const rb_data_type_t cr_surface_type = {
|
108
|
+
"Cairo::Surface",
|
109
|
+
{
|
110
|
+
NULL,
|
111
|
+
cr_surface_free,
|
112
|
+
},
|
113
|
+
NULL,
|
114
|
+
NULL,
|
115
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
116
|
+
};
|
117
|
+
|
106
118
|
static VALUE
|
107
119
|
cr_paper_parse (VALUE paper_description)
|
108
120
|
{
|
@@ -232,6 +244,28 @@ rb_cairo_surface_adjust_memory_usage (cairo_surface_t *surface,
|
|
232
244
|
#endif
|
233
245
|
}
|
234
246
|
|
247
|
+
static cairo_surface_t *
|
248
|
+
rb_cairo_surface_from_ruby_object_without_null_check (VALUE obj)
|
249
|
+
{
|
250
|
+
cairo_surface_t *surface;
|
251
|
+
if (!rb_cairo__is_kind_of (obj, rb_cCairo_Surface))
|
252
|
+
{
|
253
|
+
rb_raise (rb_eTypeError, "not a cairo surface");
|
254
|
+
}
|
255
|
+
TypedData_Get_Struct (obj, cairo_surface_t, &cr_surface_type, surface);
|
256
|
+
return surface;
|
257
|
+
}
|
258
|
+
|
259
|
+
cairo_surface_t *
|
260
|
+
rb_cairo_surface_from_ruby_object (VALUE obj)
|
261
|
+
{
|
262
|
+
cairo_surface_t *surface =
|
263
|
+
rb_cairo_surface_from_ruby_object_without_null_check (obj);
|
264
|
+
if (!surface)
|
265
|
+
rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER);
|
266
|
+
return surface;
|
267
|
+
}
|
268
|
+
|
235
269
|
static void
|
236
270
|
cr_surface_destroy_raw (cairo_surface_t *surface)
|
237
271
|
{
|
@@ -246,7 +280,7 @@ cr_surface_destroy (VALUE self)
|
|
246
280
|
|
247
281
|
surface = _SELF;
|
248
282
|
cr_surface_destroy_raw (surface);
|
249
|
-
|
283
|
+
RTYPEDDATA_DATA (self) = NULL;
|
250
284
|
|
251
285
|
return self;
|
252
286
|
}
|
@@ -254,7 +288,7 @@ cr_surface_destroy (VALUE self)
|
|
254
288
|
static VALUE
|
255
289
|
cr_surface_destroy_with_destroy_check (VALUE self)
|
256
290
|
{
|
257
|
-
if (
|
291
|
+
if (rb_cairo_surface_from_ruby_object_without_null_check (self))
|
258
292
|
cr_surface_destroy (self);
|
259
293
|
return Qnil;
|
260
294
|
}
|
@@ -407,21 +441,6 @@ cr_surface_xml_supported_p (VALUE klass)
|
|
407
441
|
#endif
|
408
442
|
}
|
409
443
|
|
410
|
-
/* constructor/de-constructor */
|
411
|
-
cairo_surface_t *
|
412
|
-
rb_cairo_surface_from_ruby_object (VALUE obj)
|
413
|
-
{
|
414
|
-
cairo_surface_t *surface;
|
415
|
-
if (!rb_cairo__is_kind_of (obj, rb_cCairo_Surface))
|
416
|
-
{
|
417
|
-
rb_raise (rb_eTypeError, "not a cairo surface");
|
418
|
-
}
|
419
|
-
Data_Get_Struct (obj, cairo_surface_t, surface);
|
420
|
-
if (!surface)
|
421
|
-
rb_cairo_check_status (CAIRO_STATUS_NULL_POINTER);
|
422
|
-
return surface;
|
423
|
-
}
|
424
|
-
|
425
444
|
static rb_cairo__object_holder_t *
|
426
445
|
cr_object_holder_new (VALUE object)
|
427
446
|
{
|
@@ -454,7 +473,7 @@ rb_cairo_surface_to_ruby_object (cairo_surface_t *surface)
|
|
454
473
|
klass = cr_surface_get_klass (surface);
|
455
474
|
cairo_surface_reference (surface);
|
456
475
|
rb_cairo_surface_adjust_memory_usage (surface, CR_TRUE);
|
457
|
-
return
|
476
|
+
return TypedData_Wrap_Struct (klass, &cr_surface_type, surface);
|
458
477
|
}
|
459
478
|
else
|
460
479
|
{
|
@@ -477,7 +496,7 @@ rb_cairo_surface_to_ruby_object_with_destroy (cairo_surface_t *surface)
|
|
477
496
|
static VALUE
|
478
497
|
cr_surface_allocate (VALUE klass)
|
479
498
|
{
|
480
|
-
return
|
499
|
+
return TypedData_Wrap_Struct (klass, &cr_surface_type, NULL);
|
481
500
|
}
|
482
501
|
|
483
502
|
static VALUE
|
@@ -515,6 +534,7 @@ cr_surface_finish (VALUE self)
|
|
515
534
|
cairo_surface_finish (surface);
|
516
535
|
cairo_surface_set_user_data (surface, &cr_finished_key, (void *)CR_TRUE, NULL);
|
517
536
|
cairo_surface_set_user_data (surface, &cr_object_holder_key, NULL, NULL);
|
537
|
+
RTYPEDDATA_DATA (self) = NULL;
|
518
538
|
|
519
539
|
if (closure && !NIL_P (closure->error))
|
520
540
|
rb_exc_raise (closure->error);
|
@@ -531,7 +551,7 @@ rb_cairo__surface_yield_and_finish (VALUE self)
|
|
531
551
|
|
532
552
|
rb_result = rb_yield (self);
|
533
553
|
|
534
|
-
surface =
|
554
|
+
surface = rb_cairo_surface_from_ruby_object_without_null_check (self);
|
535
555
|
if (!surface)
|
536
556
|
return rb_result;
|
537
557
|
if (cairo_surface_status (surface) != CAIRO_STATUS_SUCCESS)
|
@@ -730,6 +750,11 @@ cr_surface_write_to_png (VALUE self, VALUE filename)
|
|
730
750
|
static VALUE
|
731
751
|
cr_surface_write_to_png_generic (VALUE self, VALUE target)
|
732
752
|
{
|
753
|
+
if (rb_respond_to (target, rb_cairo__io_id_to_path) &&
|
754
|
+
!rb_respond_to (target, rb_cairo__io_id_to_io))
|
755
|
+
{
|
756
|
+
target = rb_funcall (target, rb_cairo__io_id_to_path, 0);
|
757
|
+
}
|
733
758
|
if (rb_respond_to (target, rb_cairo__io_id_write))
|
734
759
|
return cr_surface_write_to_png_stream (self, target);
|
735
760
|
else
|
@@ -995,7 +1020,7 @@ cr_image_surface_create_from_png_generic (VALUE klass, VALUE target)
|
|
995
1020
|
|
996
1021
|
rb_cairo_surface_check_status (surface);
|
997
1022
|
rb_surface = cr_surface_allocate (klass);
|
998
|
-
|
1023
|
+
RTYPEDDATA_DATA (rb_surface) = surface;
|
999
1024
|
return rb_surface;
|
1000
1025
|
}
|
1001
1026
|
#endif
|
@@ -1052,7 +1077,7 @@ cr_image_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1052
1077
|
rb_cairo__inspect (rb_ary_new3 (4, arg1, arg2, arg3, arg4)));
|
1053
1078
|
|
1054
1079
|
rb_cairo_surface_check_status (surface);
|
1055
|
-
|
1080
|
+
RTYPEDDATA_DATA (self) = surface;
|
1056
1081
|
rb_cairo_surface_adjust_memory_usage (surface, CR_TRUE);
|
1057
1082
|
if (rb_block_given_p ())
|
1058
1083
|
rb_cairo__surface_yield_and_finish (self);
|
@@ -1173,7 +1198,7 @@ cr_ ## type ## _surface_initialize (int argc, VALUE *argv, VALUE self) \
|
|
1173
1198
|
} \
|
1174
1199
|
\
|
1175
1200
|
rb_cairo_surface_check_status (surface); \
|
1176
|
-
|
1201
|
+
RTYPEDDATA_DATA (self) = surface; \
|
1177
1202
|
if (rb_block_given_p ()) \
|
1178
1203
|
rb_cairo__surface_yield_and_finish (self); \
|
1179
1204
|
return Qnil; \
|
@@ -1328,6 +1353,26 @@ cr_pdf_surface_set_thumbnail_size (VALUE self,
|
|
1328
1353
|
return Qnil;
|
1329
1354
|
}
|
1330
1355
|
# endif
|
1356
|
+
|
1357
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
1358
|
+
static VALUE
|
1359
|
+
cr_pdf_surface_set_custom_metadata (VALUE self,
|
1360
|
+
VALUE rb_name,
|
1361
|
+
VALUE rb_value)
|
1362
|
+
{
|
1363
|
+
cairo_surface_t *surface;
|
1364
|
+
const char *name;
|
1365
|
+
const char *value;
|
1366
|
+
|
1367
|
+
surface = _SELF;
|
1368
|
+
name = RVAL2CSTR (rb_name);
|
1369
|
+
value = RVAL2CSTR (rb_value);
|
1370
|
+
cairo_pdf_surface_set_custom_metadata (surface, name, value);
|
1371
|
+
rb_cairo_surface_check_status (surface);
|
1372
|
+
|
1373
|
+
return Qnil;
|
1374
|
+
}
|
1375
|
+
# endif
|
1331
1376
|
#endif
|
1332
1377
|
|
1333
1378
|
#ifdef CAIRO_HAS_PS_SURFACE
|
@@ -1494,7 +1539,7 @@ cr_win32_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1494
1539
|
if (!surface)
|
1495
1540
|
rb_cairo_check_status (CAIRO_STATUS_INVALID_FORMAT);
|
1496
1541
|
rb_cairo_surface_check_status (surface);
|
1497
|
-
|
1542
|
+
RTYPEDDATA_DATA (self) = surface;
|
1498
1543
|
if (rb_block_given_p ())
|
1499
1544
|
rb_cairo__surface_yield_and_finish (self);
|
1500
1545
|
return Qnil;
|
@@ -1570,7 +1615,7 @@ cr_win32_printing_surface_initialize (VALUE self, VALUE hdc)
|
|
1570
1615
|
|
1571
1616
|
surface = cairo_win32_printing_surface_create (NUM2PTR (hdc));
|
1572
1617
|
rb_cairo_surface_check_status (surface);
|
1573
|
-
|
1618
|
+
RTYPEDDATA_DATA (self) = surface;
|
1574
1619
|
if (rb_block_given_p ())
|
1575
1620
|
rb_cairo__surface_yield_and_finish (self);
|
1576
1621
|
return Qnil;
|
@@ -1625,7 +1670,7 @@ cr_script_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1625
1670
|
surface = cairo_script_surface_create (device, content, width, height);
|
1626
1671
|
|
1627
1672
|
rb_cairo_surface_check_status (surface);
|
1628
|
-
|
1673
|
+
RTYPEDDATA_DATA (self) = surface;
|
1629
1674
|
if (rb_block_given_p ())
|
1630
1675
|
rb_cairo__surface_yield_and_finish (self);
|
1631
1676
|
return Qnil;
|
@@ -1680,7 +1725,7 @@ cr_recording_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1680
1725
|
|
1681
1726
|
surface = cairo_recording_surface_create (content, &extents);
|
1682
1727
|
rb_cairo_surface_check_status (surface);
|
1683
|
-
|
1728
|
+
RTYPEDDATA_DATA (self) = surface;
|
1684
1729
|
if (rb_block_given_p ())
|
1685
1730
|
rb_cairo__surface_yield_and_finish (self);
|
1686
1731
|
return Qnil;
|
@@ -1757,7 +1802,7 @@ cr_gl_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1757
1802
|
surface = cairo_gl_surface_create (device, content, width, height);
|
1758
1803
|
|
1759
1804
|
rb_cairo_surface_check_status (surface);
|
1760
|
-
|
1805
|
+
RTYPEDDATA_DATA (self) = surface;
|
1761
1806
|
if (rb_block_given_p ())
|
1762
1807
|
rb_cairo__surface_yield_and_finish (self);
|
1763
1808
|
return Qnil;
|
@@ -1804,7 +1849,7 @@ cr_gl_texture_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1804
1849
|
height);
|
1805
1850
|
|
1806
1851
|
rb_cairo_surface_check_status (surface);
|
1807
|
-
|
1852
|
+
RTYPEDDATA_DATA (self) = surface;
|
1808
1853
|
if (rb_block_given_p ())
|
1809
1854
|
rb_cairo__surface_yield_and_finish (self);
|
1810
1855
|
return Qnil;
|
@@ -1854,7 +1899,7 @@ cr_tee_surface_initialize (VALUE self, VALUE master)
|
|
1854
1899
|
|
1855
1900
|
surface = cairo_tee_surface_create (RVAL2CRSURFACE (master));
|
1856
1901
|
rb_cairo_surface_check_status (surface);
|
1857
|
-
|
1902
|
+
RTYPEDDATA_DATA (self) = surface;
|
1858
1903
|
rb_iv_set (self, "surfaces", rb_ary_new3 (1, master));
|
1859
1904
|
if (rb_block_given_p ())
|
1860
1905
|
rb_cairo__surface_yield_and_finish (self);
|
@@ -1976,7 +2021,7 @@ cr_xml_surface_initialize (int argc, VALUE *argv, VALUE self)
|
|
1976
2021
|
surface = cairo_xml_surface_create (device, content, width, height);
|
1977
2022
|
|
1978
2023
|
rb_cairo_surface_check_status (surface);
|
1979
|
-
|
2024
|
+
RTYPEDDATA_DATA (self) = surface;
|
1980
2025
|
if (rb_block_given_p ())
|
1981
2026
|
rb_cairo__surface_yield_and_finish (self);
|
1982
2027
|
return Qnil;
|
@@ -2177,6 +2222,11 @@ Init_cairo_surface (void)
|
|
2177
2222
|
}
|
2178
2223
|
# endif
|
2179
2224
|
|
2225
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
2226
|
+
rb_define_method (rb_cCairo_PDFSurface, "set_custom_metadata",
|
2227
|
+
cr_pdf_surface_set_custom_metadata, 2);
|
2228
|
+
# endif
|
2229
|
+
|
2180
2230
|
RB_CAIRO_DEF_SETTERS (rb_cCairo_PDFSurface);
|
2181
2231
|
#endif
|
2182
2232
|
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-16 08:16:40 $
|
7
7
|
*
|
8
|
-
* Copyright 2008 Kouhei
|
8
|
+
* Copyright 2008-2022 Sutou Kouhei <kou@cozmixng.org>
|
9
9
|
*
|
10
10
|
* This file is made available under the same terms as Ruby
|
11
11
|
*
|
@@ -20,6 +20,17 @@ VALUE rb_cCairo_TextCluster = Qnil;
|
|
20
20
|
#if CAIRO_CHECK_VERSION(1, 7, 2)
|
21
21
|
#define _SELF(self) (RVAL2CRTEXTCLUSTER(self))
|
22
22
|
|
23
|
+
static const rb_data_type_t cr_text_cluster_type = {
|
24
|
+
"Cairo::TextCluster",
|
25
|
+
{
|
26
|
+
NULL,
|
27
|
+
ruby_xfree,
|
28
|
+
},
|
29
|
+
NULL,
|
30
|
+
NULL,
|
31
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
32
|
+
};
|
33
|
+
|
23
34
|
cairo_text_cluster_t *
|
24
35
|
rb_cairo_text_cluster_from_ruby_object (VALUE obj)
|
25
36
|
{
|
@@ -29,19 +40,13 @@ rb_cairo_text_cluster_from_ruby_object (VALUE obj)
|
|
29
40
|
rb_raise (rb_eTypeError,
|
30
41
|
"not a cairo cluster: %s", rb_cairo__inspect (obj));
|
31
42
|
}
|
32
|
-
|
43
|
+
TypedData_Get_Struct (obj,
|
44
|
+
cairo_text_cluster_t,
|
45
|
+
&cr_text_cluster_type,
|
46
|
+
cluster);
|
33
47
|
return cluster;
|
34
48
|
}
|
35
49
|
|
36
|
-
static void
|
37
|
-
cr_text_cluster_free (void *ptr)
|
38
|
-
{
|
39
|
-
if (ptr)
|
40
|
-
{
|
41
|
-
xfree (ptr);
|
42
|
-
}
|
43
|
-
}
|
44
|
-
|
45
50
|
VALUE
|
46
51
|
rb_cairo_text_cluster_to_ruby_object (cairo_text_cluster_t *cluster)
|
47
52
|
{
|
@@ -51,8 +56,9 @@ rb_cairo_text_cluster_to_ruby_object (cairo_text_cluster_t *cluster)
|
|
51
56
|
|
52
57
|
new_cluster = ALLOC (cairo_text_cluster_t);
|
53
58
|
*new_cluster = *cluster;
|
54
|
-
return
|
55
|
-
|
59
|
+
return TypedData_Wrap_Struct (rb_cCairo_TextCluster,
|
60
|
+
&cr_text_cluster_type,
|
61
|
+
new_cluster);
|
56
62
|
}
|
57
63
|
else
|
58
64
|
{
|
@@ -63,7 +69,7 @@ rb_cairo_text_cluster_to_ruby_object (cairo_text_cluster_t *cluster)
|
|
63
69
|
static VALUE
|
64
70
|
cr_text_cluster_allocate (VALUE klass)
|
65
71
|
{
|
66
|
-
return
|
72
|
+
return TypedData_Wrap_Struct (klass, &cr_text_cluster_type, NULL);
|
67
73
|
}
|
68
74
|
|
69
75
|
static VALUE
|
@@ -75,7 +81,7 @@ cr_text_cluster_initialize (VALUE self, VALUE num_bytes, VALUE num_glyphs)
|
|
75
81
|
cluster->num_bytes = NUM2INT (num_bytes);
|
76
82
|
cluster->num_glyphs = NUM2INT (num_glyphs);
|
77
83
|
|
78
|
-
|
84
|
+
RTYPEDDATA_DATA (self) = cluster;
|
79
85
|
return Qnil;
|
80
86
|
}
|
81
87
|
|
@@ -5,6 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-17 05:41:28 $
|
7
7
|
*
|
8
|
+
* Copyright 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_TextExtents;
|
|
19
20
|
|
20
21
|
#define _SELF(self) (RVAL2CRTEXTEXTENTS(self))
|
21
22
|
|
23
|
+
static const rb_data_type_t cr_text_extents_type = {
|
24
|
+
"Cairo::TextExtents",
|
25
|
+
{
|
26
|
+
NULL,
|
27
|
+
ruby_xfree,
|
28
|
+
},
|
29
|
+
NULL,
|
30
|
+
NULL,
|
31
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
32
|
+
};
|
33
|
+
|
22
34
|
cairo_text_extents_t *
|
23
35
|
rb_cairo_text_extents_from_ruby_object (VALUE obj)
|
24
36
|
{
|
@@ -27,7 +39,10 @@ rb_cairo_text_extents_from_ruby_object (VALUE obj)
|
|
27
39
|
{
|
28
40
|
rb_raise (rb_eTypeError, "not a cairo text_extents");
|
29
41
|
}
|
30
|
-
|
42
|
+
TypedData_Get_Struct (obj,
|
43
|
+
cairo_text_extents_t,
|
44
|
+
&cr_text_extents_type,
|
45
|
+
extents);
|
31
46
|
return extents;
|
32
47
|
}
|
33
48
|
|
@@ -38,7 +53,9 @@ rb_cairo_text_extents_to_ruby_object (cairo_text_extents_t *extents)
|
|
38
53
|
{
|
39
54
|
cairo_text_extents_t *new_extents = ALLOC (cairo_text_extents_t);
|
40
55
|
*new_extents = *extents;
|
41
|
-
return
|
56
|
+
return TypedData_Wrap_Struct (rb_cCairo_TextExtents,
|
57
|
+
&cr_text_extents_type,
|
58
|
+
new_extents);
|
42
59
|
}
|
43
60
|
else
|
44
61
|
{
|
@@ -49,7 +66,7 @@ rb_cairo_text_extents_to_ruby_object (cairo_text_extents_t *extents)
|
|
49
66
|
static VALUE
|
50
67
|
cr_text_extents_allocate (VALUE klass)
|
51
68
|
{
|
52
|
-
return
|
69
|
+
return TypedData_Wrap_Struct (klass, &cr_text_extents_type, NULL);
|
53
70
|
}
|
54
71
|
|
55
72
|
static VALUE
|
@@ -65,7 +82,7 @@ cr_text_extents_initialize (VALUE self)
|
|
65
82
|
extents->x_advance = 1.0;
|
66
83
|
extents->y_advance = 0.0;
|
67
84
|
|
68
|
-
|
85
|
+
RTYPEDDATA_DATA (self) = extents;
|
69
86
|
|
70
87
|
return Qnil;
|
71
88
|
}
|
data/test/test_context.rb
CHANGED
@@ -129,4 +129,18 @@ class ContextTest < Test::Unit::TestCase
|
|
129
129
|
context.raw_address > 0
|
130
130
|
end
|
131
131
|
end
|
132
|
+
|
133
|
+
def test_hairline
|
134
|
+
only_cairo_version(1, 17, 6)
|
135
|
+
|
136
|
+
Cairo::Context.create(@surface) do |context|
|
137
|
+
assert do
|
138
|
+
not context.hairline?
|
139
|
+
end
|
140
|
+
context.hairline = true
|
141
|
+
assert do
|
142
|
+
context.hairline?
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
132
146
|
end
|