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
@@ -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
|
@@ -272,7 +283,7 @@ cr_freetype_font_face_initialize (VALUE self, VALUE path)
|
|
272
283
|
rb_cairo_check_status (status);
|
273
284
|
}
|
274
285
|
|
275
|
-
|
286
|
+
RTYPEDDATA_DATA (self) = face;
|
276
287
|
|
277
288
|
return Qnil;
|
278
289
|
}
|
@@ -321,7 +332,7 @@ cr_toy_font_face_initialize (int argc, VALUE *argv, VALUE self)
|
|
321
332
|
|
322
333
|
face = cairo_toy_font_face_create (family, slant, weight);
|
323
334
|
cr_font_face_check_status (face);
|
324
|
-
|
335
|
+
RTYPEDDATA_DATA (self) = face;
|
325
336
|
|
326
337
|
return Qnil;
|
327
338
|
}
|
@@ -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
|
@@ -713,7 +758,7 @@ cr_user_font_face_initialize (VALUE self)
|
|
713
758
|
rb_ivar_set (self, cr_id_text_to_glyphs, Qnil);
|
714
759
|
rb_ivar_set (self, cr_id_unicode_to_glyph, Qnil);
|
715
760
|
|
716
|
-
|
761
|
+
RTYPEDDATA_DATA (self) = face;
|
717
762
|
|
718
763
|
return Qnil;
|
719
764
|
}
|
@@ -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",
|
@@ -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
|
*
|
@@ -18,6 +18,23 @@
|
|
18
18
|
|
19
19
|
VALUE rb_cCairo_FontOptions;
|
20
20
|
|
21
|
+
static void
|
22
|
+
cr_options_free (void *ptr)
|
23
|
+
{
|
24
|
+
cairo_font_options_destroy ((cairo_font_options_t *) ptr);
|
25
|
+
}
|
26
|
+
|
27
|
+
static const rb_data_type_t cr_font_options_type = {
|
28
|
+
"Cairo::FontOptions",
|
29
|
+
{
|
30
|
+
NULL,
|
31
|
+
cr_options_free,
|
32
|
+
},
|
33
|
+
NULL,
|
34
|
+
NULL,
|
35
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
36
|
+
};
|
37
|
+
|
21
38
|
static inline void
|
22
39
|
cr_options_check_status (cairo_font_options_t *options)
|
23
40
|
{
|
@@ -32,19 +49,13 @@ rb_cairo_font_options_from_ruby_object (VALUE obj)
|
|
32
49
|
{
|
33
50
|
rb_raise (rb_eTypeError, "not a cairo font options");
|
34
51
|
}
|
35
|
-
|
52
|
+
TypedData_Get_Struct (obj,
|
53
|
+
cairo_font_options_t,
|
54
|
+
&cr_font_options_type,
|
55
|
+
options);
|
36
56
|
return options;
|
37
57
|
}
|
38
58
|
|
39
|
-
static void
|
40
|
-
cr_options_free (void *ptr)
|
41
|
-
{
|
42
|
-
if (ptr)
|
43
|
-
{
|
44
|
-
cairo_font_options_destroy ((cairo_font_options_t *) ptr);
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
59
|
VALUE
|
49
60
|
rb_cairo_font_options_to_ruby_object (cairo_font_options_t *options)
|
50
61
|
{
|
@@ -53,8 +64,9 @@ rb_cairo_font_options_to_ruby_object (cairo_font_options_t *options)
|
|
53
64
|
cairo_font_options_t *copied_options;
|
54
65
|
copied_options = cairo_font_options_copy (options);
|
55
66
|
cr_options_check_status (copied_options);
|
56
|
-
return
|
57
|
-
|
67
|
+
return TypedData_Wrap_Struct (rb_cCairo_FontOptions,
|
68
|
+
&cr_font_options_type,
|
69
|
+
copied_options);
|
58
70
|
}
|
59
71
|
else
|
60
72
|
{
|
@@ -65,7 +77,7 @@ rb_cairo_font_options_to_ruby_object (cairo_font_options_t *options)
|
|
65
77
|
static VALUE
|
66
78
|
cr_options_allocate (VALUE klass)
|
67
79
|
{
|
68
|
-
return
|
80
|
+
return TypedData_Wrap_Struct (klass, &cr_font_options_type, NULL);
|
69
81
|
}
|
70
82
|
|
71
83
|
static VALUE
|
@@ -75,7 +87,7 @@ cr_options_create (VALUE self)
|
|
75
87
|
|
76
88
|
options = cairo_font_options_create ();
|
77
89
|
cr_options_check_status (options);
|
78
|
-
|
90
|
+
RTYPEDDATA_DATA (self) = options;
|
79
91
|
return Qnil;
|
80
92
|
}
|
81
93
|
|
data/ext/cairo/rb_cairo_glyph.c
CHANGED
@@ -5,6 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-16 08:16:39 $
|
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
|
*
|
@@ -20,6 +21,17 @@ VALUE rb_cCairo_Glyph;
|
|
20
21
|
|
21
22
|
#define _SELF(self) (RVAL2CRGLYPH(self))
|
22
23
|
|
24
|
+
static const rb_data_type_t cr_glyph_type = {
|
25
|
+
"Cairo::Glyph",
|
26
|
+
{
|
27
|
+
NULL,
|
28
|
+
ruby_xfree,
|
29
|
+
},
|
30
|
+
NULL,
|
31
|
+
NULL,
|
32
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
33
|
+
};
|
34
|
+
|
23
35
|
cairo_glyph_t *
|
24
36
|
rb_cairo_glyph_from_ruby_object (VALUE obj)
|
25
37
|
{
|
@@ -28,19 +40,10 @@ rb_cairo_glyph_from_ruby_object (VALUE obj)
|
|
28
40
|
{
|
29
41
|
rb_raise (rb_eTypeError, "not a cairo glyph");
|
30
42
|
}
|
31
|
-
|
43
|
+
TypedData_Get_Struct (obj, cairo_glyph_t, &cr_glyph_type, glyph);
|
32
44
|
return glyph;
|
33
45
|
}
|
34
46
|
|
35
|
-
static void
|
36
|
-
cr_glyph_free (void *ptr)
|
37
|
-
{
|
38
|
-
if (ptr)
|
39
|
-
{
|
40
|
-
xfree (ptr);
|
41
|
-
}
|
42
|
-
}
|
43
|
-
|
44
47
|
VALUE
|
45
48
|
rb_cairo_glyph_to_ruby_object (cairo_glyph_t *glyph)
|
46
49
|
{
|
@@ -50,7 +53,7 @@ rb_cairo_glyph_to_ruby_object (cairo_glyph_t *glyph)
|
|
50
53
|
|
51
54
|
new_glyph = ALLOC (cairo_glyph_t);
|
52
55
|
*new_glyph = *glyph;
|
53
|
-
return
|
56
|
+
return TypedData_Wrap_Struct (rb_cCairo_Glyph, &cr_glyph_type, new_glyph);
|
54
57
|
}
|
55
58
|
else
|
56
59
|
{
|
@@ -61,7 +64,7 @@ rb_cairo_glyph_to_ruby_object (cairo_glyph_t *glyph)
|
|
61
64
|
static VALUE
|
62
65
|
cr_glyph_allocate (VALUE klass)
|
63
66
|
{
|
64
|
-
return
|
67
|
+
return TypedData_Wrap_Struct (klass, &cr_glyph_type, NULL);
|
65
68
|
}
|
66
69
|
|
67
70
|
static VALUE
|
@@ -74,7 +77,7 @@ cr_glyph_initialize (VALUE self, VALUE index, VALUE x, VALUE y)
|
|
74
77
|
glyph->x = NUM2DBL (x);
|
75
78
|
glyph->y = NUM2DBL (y);
|
76
79
|
|
77
|
-
|
80
|
+
RTYPEDDATA_DATA (self) = glyph;
|
78
81
|
return Qnil;
|
79
82
|
}
|
80
83
|
|
data/ext/cairo/rb_cairo_matrix.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-08-14 12:37:50 $
|
7
7
|
*
|
8
|
-
* Copyright 2006-
|
8
|
+
* Copyright 2006-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
|
*
|
@@ -23,6 +23,17 @@ static ID cr_id_equal;
|
|
23
23
|
|
24
24
|
#define _SELF (RVAL2CRMATRIX(self))
|
25
25
|
|
26
|
+
static const rb_data_type_t cr_matrix_type = {
|
27
|
+
"Cairo::Matrix",
|
28
|
+
{
|
29
|
+
NULL,
|
30
|
+
ruby_xfree,
|
31
|
+
},
|
32
|
+
NULL,
|
33
|
+
NULL,
|
34
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
35
|
+
};
|
36
|
+
|
26
37
|
cairo_matrix_t *
|
27
38
|
rb_cairo_matrix_from_ruby_object (VALUE obj)
|
28
39
|
{
|
@@ -31,19 +42,10 @@ rb_cairo_matrix_from_ruby_object (VALUE obj)
|
|
31
42
|
{
|
32
43
|
rb_raise (rb_eTypeError, "not a cairo matrix");
|
33
44
|
}
|
34
|
-
|
45
|
+
TypedData_Get_Struct (obj, cairo_matrix_t, &cr_matrix_type, matrix);
|
35
46
|
return matrix;
|
36
47
|
}
|
37
48
|
|
38
|
-
static void
|
39
|
-
cr_matrix_free (void *ptr)
|
40
|
-
{
|
41
|
-
if (ptr)
|
42
|
-
{
|
43
|
-
xfree ((cairo_matrix_t *) ptr);
|
44
|
-
}
|
45
|
-
}
|
46
|
-
|
47
49
|
VALUE
|
48
50
|
rb_cairo_matrix_to_ruby_object (cairo_matrix_t *matrix)
|
49
51
|
{
|
@@ -51,8 +53,9 @@ rb_cairo_matrix_to_ruby_object (cairo_matrix_t *matrix)
|
|
51
53
|
{
|
52
54
|
cairo_matrix_t *new_matrix = ALLOC (cairo_matrix_t);
|
53
55
|
*new_matrix = *matrix;
|
54
|
-
return
|
55
|
-
|
56
|
+
return TypedData_Wrap_Struct (rb_cCairo_Matrix,
|
57
|
+
&cr_matrix_type,
|
58
|
+
new_matrix);
|
56
59
|
}
|
57
60
|
else
|
58
61
|
{
|
@@ -63,7 +66,7 @@ rb_cairo_matrix_to_ruby_object (cairo_matrix_t *matrix)
|
|
63
66
|
static VALUE
|
64
67
|
cr_matrix_allocate (VALUE klass)
|
65
68
|
{
|
66
|
-
return
|
69
|
+
return TypedData_Wrap_Struct (klass, &cr_matrix_type, NULL);
|
67
70
|
}
|
68
71
|
|
69
72
|
static VALUE
|
@@ -78,7 +81,7 @@ cr_matrix_initialize (VALUE self,
|
|
78
81
|
NUM2DBL (xx), NUM2DBL (yx),
|
79
82
|
NUM2DBL (xy), NUM2DBL (yy),
|
80
83
|
NUM2DBL (x0), NUM2DBL (y0));
|
81
|
-
|
84
|
+
RTYPEDDATA_DATA (self) = matrix;
|
82
85
|
return Qnil;
|
83
86
|
}
|
84
87
|
|
data/ext/cairo/rb_cairo_path.c
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-04-04 03:52:31 $
|
7
7
|
*
|
8
|
-
* Copyright 2005 Kouhei
|
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
|
*
|
@@ -223,54 +223,34 @@ cr_path_close_path_initialize (VALUE self)
|
|
223
223
|
static void
|
224
224
|
cr_path_free (void *ptr)
|
225
225
|
{
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
}
|
226
|
+
cairo_path_t *path = ptr;
|
227
|
+
ruby_xfree (path->data);
|
228
|
+
ruby_xfree (path);
|
230
229
|
}
|
231
230
|
|
231
|
+
static const rb_data_type_t cr_path_type = {
|
232
|
+
"Cairo::Path",
|
233
|
+
{
|
234
|
+
NULL,
|
235
|
+
cr_path_free,
|
236
|
+
},
|
237
|
+
NULL,
|
238
|
+
NULL,
|
239
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
240
|
+
};
|
241
|
+
|
232
242
|
cairo_path_t *
|
233
243
|
rb_cairo_path_from_ruby_object (VALUE obj)
|
234
244
|
{
|
235
|
-
|
236
|
-
cairo_t *cr;
|
237
|
-
cairo_path_t *path, *copied_path;
|
245
|
+
cairo_path_t *path;
|
238
246
|
|
239
247
|
if (!rb_cairo__is_kind_of (obj, rb_cCairo_Path))
|
240
248
|
{
|
241
249
|
rb_raise (rb_eTypeError, "not a cairo path");
|
242
250
|
}
|
243
|
-
|
244
|
-
|
245
|
-
context = rb_ivar_get (obj, id_at_context);
|
246
|
-
if (NIL_P (context))
|
247
|
-
return path;
|
248
|
-
|
249
|
-
cr = RVAL2CRCONTEXT (context);
|
250
|
-
if (cairo_status (cr) != CAIRO_STATUS_SUCCESS)
|
251
|
-
return path;
|
251
|
+
TypedData_Get_Struct (obj, cairo_path_t, &cr_path_type, path);
|
252
252
|
|
253
|
-
|
254
|
-
rb_ivar_set (obj, id_current_path, CRPATH2RVAL (copied_path));
|
255
|
-
return copied_path;
|
256
|
-
}
|
257
|
-
|
258
|
-
static void
|
259
|
-
cr_path_ensure_internal_context (VALUE rb_path, cairo_path_t *path)
|
260
|
-
{
|
261
|
-
cairo_surface_t *surface;
|
262
|
-
cairo_t *cr;
|
263
|
-
|
264
|
-
if (!NIL_P (rb_ivar_get (rb_path, id_at_context)))
|
265
|
-
return;
|
266
|
-
|
267
|
-
surface = cairo_image_surface_create (CAIRO_FORMAT_A1, 1, 1);
|
268
|
-
cr = cairo_create (surface);
|
269
|
-
if (path->num_data > 0)
|
270
|
-
cairo_append_path (cr, path);
|
271
|
-
rb_cairo_check_status (cairo_status (cr));
|
272
|
-
rb_ivar_set (rb_path, id_at_context, CRCONTEXT2RVAL (cr));
|
273
|
-
cairo_destroy (cr);
|
253
|
+
return path;
|
274
254
|
}
|
275
255
|
|
276
256
|
VALUE
|
@@ -279,8 +259,15 @@ rb_cairo_path_to_ruby_object (cairo_path_t *path)
|
|
279
259
|
if (path)
|
280
260
|
{
|
281
261
|
VALUE rb_path;
|
282
|
-
|
283
|
-
|
262
|
+
cairo_path_t *copied_path;
|
263
|
+
copied_path = RB_ALLOC (cairo_path_t);
|
264
|
+
copied_path->data = RB_ALLOC_N (cairo_path_data_t, path->num_data);
|
265
|
+
memcpy(copied_path->data,
|
266
|
+
path->data,
|
267
|
+
sizeof (cairo_path_data_t) * path->num_data);
|
268
|
+
rb_path = TypedData_Wrap_Struct (rb_cCairo_Path,
|
269
|
+
&cr_path_type,
|
270
|
+
copied_path);
|
284
271
|
return rb_path;
|
285
272
|
}
|
286
273
|
else
|
@@ -292,7 +279,7 @@ rb_cairo_path_to_ruby_object (cairo_path_t *path)
|
|
292
279
|
static VALUE
|
293
280
|
cr_path_allocate (VALUE klass)
|
294
281
|
{
|
295
|
-
return
|
282
|
+
return TypedData_Wrap_Struct (klass, &cr_path_type, NULL);
|
296
283
|
}
|
297
284
|
|
298
285
|
static VALUE
|
@@ -300,13 +287,11 @@ cr_path_initialize (VALUE self)
|
|
300
287
|
{
|
301
288
|
cairo_path_t *path;
|
302
289
|
|
303
|
-
path =
|
290
|
+
path = RB_ALLOC (cairo_path_t);
|
304
291
|
path->status = CAIRO_STATUS_SUCCESS;
|
305
292
|
path->data = NULL;
|
306
293
|
path->num_data = 0;
|
307
|
-
|
308
|
-
DATA_PTR (self) = path;
|
309
|
-
cr_path_ensure_internal_context (self, path);
|
294
|
+
RTYPEDDATA_DATA (self) = path;
|
310
295
|
|
311
296
|
return Qnil;
|
312
297
|
}
|
@@ -5,7 +5,7 @@
|
|
5
5
|
* $Author: kou $
|
6
6
|
* $Date: 2008-06-12 10:59:54 $
|
7
7
|
*
|
8
|
-
* Copyright 2012-
|
8
|
+
* Copyright 2012-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
|
*
|
@@ -133,6 +133,23 @@ cr_pattern_raster_source_supported_p (VALUE klass)
|
|
133
133
|
#endif
|
134
134
|
}
|
135
135
|
|
136
|
+
static void
|
137
|
+
cr_pattern_free (void *ptr)
|
138
|
+
{
|
139
|
+
cairo_pattern_destroy ((cairo_pattern_t *) ptr);
|
140
|
+
}
|
141
|
+
|
142
|
+
static const rb_data_type_t cr_pattern_type = {
|
143
|
+
"Cairo::Pattern",
|
144
|
+
{
|
145
|
+
NULL,
|
146
|
+
cr_pattern_free,
|
147
|
+
},
|
148
|
+
NULL,
|
149
|
+
NULL,
|
150
|
+
RUBY_TYPED_FREE_IMMEDIATELY,
|
151
|
+
};
|
152
|
+
|
136
153
|
cairo_pattern_t *
|
137
154
|
rb_cairo_pattern_from_ruby_object (VALUE obj)
|
138
155
|
{
|
@@ -141,19 +158,10 @@ rb_cairo_pattern_from_ruby_object (VALUE obj)
|
|
141
158
|
{
|
142
159
|
rb_raise (rb_eTypeError, "not a cairo pattern");
|
143
160
|
}
|
144
|
-
|
161
|
+
TypedData_Get_Struct (obj, cairo_pattern_t, &cr_pattern_type, pattern);
|
145
162
|
return pattern;
|
146
163
|
}
|
147
164
|
|
148
|
-
static void
|
149
|
-
cr_pattern_free (void *ptr)
|
150
|
-
{
|
151
|
-
if (ptr)
|
152
|
-
{
|
153
|
-
cairo_pattern_destroy ((cairo_pattern_t *) ptr);
|
154
|
-
}
|
155
|
-
}
|
156
|
-
|
157
165
|
VALUE
|
158
166
|
rb_cairo_pattern_to_ruby_object (cairo_pattern_t *pattern)
|
159
167
|
{
|
@@ -162,7 +170,7 @@ rb_cairo_pattern_to_ruby_object (cairo_pattern_t *pattern)
|
|
162
170
|
VALUE klass;
|
163
171
|
klass = cr_pattern_get_klass (pattern);
|
164
172
|
cairo_pattern_reference (pattern);
|
165
|
-
return
|
173
|
+
return TypedData_Wrap_Struct (klass, &cr_pattern_type, pattern);
|
166
174
|
}
|
167
175
|
else
|
168
176
|
{
|
@@ -173,7 +181,7 @@ rb_cairo_pattern_to_ruby_object (cairo_pattern_t *pattern)
|
|
173
181
|
static VALUE
|
174
182
|
cr_pattern_allocate (VALUE klass)
|
175
183
|
{
|
176
|
-
return
|
184
|
+
return TypedData_Wrap_Struct (klass, &cr_pattern_type, NULL);
|
177
185
|
}
|
178
186
|
|
179
187
|
static VALUE
|
@@ -251,7 +259,7 @@ cr_solid_pattern_initialize (int argc, VALUE *argv, VALUE self)
|
|
251
259
|
}
|
252
260
|
|
253
261
|
cr_pattern_check_status (pattern);
|
254
|
-
|
262
|
+
RTYPEDDATA_DATA (self) = pattern;
|
255
263
|
return Qnil;
|
256
264
|
}
|
257
265
|
|
@@ -262,7 +270,7 @@ cr_surface_pattern_initialize (VALUE self, VALUE surface)
|
|
262
270
|
|
263
271
|
pattern = cairo_pattern_create_for_surface (RVAL2CRSURFACE (surface));
|
264
272
|
cr_pattern_check_status (pattern);
|
265
|
-
|
273
|
+
RTYPEDDATA_DATA (self) = pattern;
|
266
274
|
return Qnil;
|
267
275
|
}
|
268
276
|
|
@@ -275,7 +283,7 @@ cr_linear_pattern_initialize (VALUE self, VALUE x0, VALUE y0,
|
|
275
283
|
pattern = cairo_pattern_create_linear (NUM2DBL (x0), NUM2DBL (y0),
|
276
284
|
NUM2DBL (x1), NUM2DBL (y1));
|
277
285
|
cr_pattern_check_status (pattern);
|
278
|
-
|
286
|
+
RTYPEDDATA_DATA (self) = pattern;
|
279
287
|
return Qnil;
|
280
288
|
}
|
281
289
|
|
@@ -290,7 +298,7 @@ cr_radial_pattern_initialize (VALUE self, VALUE cx0, VALUE cy0, VALUE radius0,
|
|
290
298
|
NUM2DBL (cx1), NUM2DBL (cy1),
|
291
299
|
NUM2DBL (radius1));
|
292
300
|
cr_pattern_check_status (pattern);
|
293
|
-
|
301
|
+
RTYPEDDATA_DATA (self) = pattern;
|
294
302
|
return Qnil;
|
295
303
|
}
|
296
304
|
|
@@ -518,7 +526,7 @@ cr_mesh_pattern_initialize (VALUE self)
|
|
518
526
|
|
519
527
|
pattern = cairo_pattern_create_mesh ();
|
520
528
|
cr_pattern_check_status (pattern);
|
521
|
-
|
529
|
+
RTYPEDDATA_DATA (self) = pattern;
|
522
530
|
return Qnil;
|
523
531
|
}
|
524
532
|
|
@@ -916,7 +924,7 @@ cr_raster_source_pattern_initialize (int argc, VALUE *argv, VALUE self)
|
|
916
924
|
content, width, height);
|
917
925
|
cr_pattern_check_status (pattern);
|
918
926
|
|
919
|
-
|
927
|
+
RTYPEDDATA_DATA (self) = pattern;
|
920
928
|
rb_iv_set (self, "@acquire", Qnil);
|
921
929
|
rb_iv_set (self, "@release", Qnil);
|
922
930
|
rb_iv_set (self, "@snapshot", Qnil);
|