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
@@ -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
|
{
|
@@ -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
|
+
DATA_PTR (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)
|
@@ -1328,6 +1348,26 @@ cr_pdf_surface_set_thumbnail_size (VALUE self,
|
|
1328
1348
|
return Qnil;
|
1329
1349
|
}
|
1330
1350
|
# endif
|
1351
|
+
|
1352
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
1353
|
+
static VALUE
|
1354
|
+
cr_pdf_surface_set_custom_metadata (VALUE self,
|
1355
|
+
VALUE rb_name,
|
1356
|
+
VALUE rb_value)
|
1357
|
+
{
|
1358
|
+
cairo_surface_t *surface;
|
1359
|
+
const char *name;
|
1360
|
+
const char *value;
|
1361
|
+
|
1362
|
+
surface = _SELF;
|
1363
|
+
name = RVAL2CSTR (rb_name);
|
1364
|
+
value = RVAL2CSTR (rb_value);
|
1365
|
+
cairo_pdf_surface_set_custom_metadata (surface, name, value);
|
1366
|
+
rb_cairo_surface_check_status (surface);
|
1367
|
+
|
1368
|
+
return Qnil;
|
1369
|
+
}
|
1370
|
+
# endif
|
1331
1371
|
#endif
|
1332
1372
|
|
1333
1373
|
#ifdef CAIRO_HAS_PS_SURFACE
|
@@ -2177,6 +2217,11 @@ Init_cairo_surface (void)
|
|
2177
2217
|
}
|
2178
2218
|
# endif
|
2179
2219
|
|
2220
|
+
# if CAIRO_CHECK_VERSION(1, 17, 6)
|
2221
|
+
rb_define_method (rb_cCairo_PDFSurface, "set_custom_metadata",
|
2222
|
+
cr_pdf_surface_set_custom_metadata, 2);
|
2223
|
+
# endif
|
2224
|
+
|
2180
2225
|
RB_CAIRO_DEF_SETTERS (rb_cCairo_PDFSurface);
|
2181
2226
|
#endif
|
2182
2227
|
|
@@ -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
|
@@ -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
|
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
|
data/test/test_font_face.rb
CHANGED
@@ -119,6 +119,13 @@ class FontFaceTest < Test::Unit::TestCase
|
|
119
119
|
render_glyph_args << args
|
120
120
|
end
|
121
121
|
|
122
|
+
render_color_glyph_args = []
|
123
|
+
if face.respond_to?(:on_render_color_glyph)
|
124
|
+
face.on_render_color_glyph do |*args|
|
125
|
+
render_color_glyph_args << args
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
122
129
|
text_to_glyphs_args = []
|
123
130
|
face.on_text_to_glyphs do |*args|
|
124
131
|
text_to_glyphs_args << args
|
@@ -137,36 +144,56 @@ class FontFaceTest < Test::Unit::TestCase
|
|
137
144
|
Cairo::Matrix.identity,
|
138
145
|
Cairo::Matrix.identity,
|
139
146
|
Cairo::FontOptions.new)
|
140
|
-
result = scaled_font.text_to_glyphs(0, 0, "
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
147
|
+
result = scaled_font.text_to_glyphs(0, 0, "abc")
|
148
|
+
expected = {
|
149
|
+
init_args: [
|
150
|
+
[Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents],
|
151
|
+
],
|
152
|
+
render_glyph_args: [
|
153
|
+
[Cairo::ScaledFont, codepoint("a"), Cairo::Context, Cairo::TextExtents],
|
154
|
+
[Cairo::ScaledFont, codepoint("b"), Cairo::Context, Cairo::TextExtents],
|
155
|
+
[Cairo::ScaledFont, codepoint("c"), Cairo::Context, Cairo::TextExtents],
|
156
|
+
],
|
157
|
+
render_color_glyph_args: [],
|
158
|
+
text_to_glyphs_args: [
|
159
|
+
[Cairo::ScaledFont, "abc", Cairo::UserFontFace::TextToGlyphsData],
|
160
|
+
],
|
161
|
+
unicode_to_glyph_args: [
|
162
|
+
[Cairo::ScaledFont, codepoint("a")],
|
163
|
+
[Cairo::ScaledFont, codepoint("b")],
|
164
|
+
[Cairo::ScaledFont, codepoint("c")],
|
165
|
+
],
|
166
|
+
result: [[], [], Cairo::TextClusterFlag::BACKWARD],
|
167
|
+
}
|
168
|
+
actual = {
|
169
|
+
init_args: classify_cairo_object(init_args),
|
170
|
+
render_glyph_args: classify_cairo_object(render_glyph_args),
|
171
|
+
render_color_glyph_args: classify_cairo_object(render_color_glyph_args),
|
172
|
+
text_to_glyphs_args: classify_cairo_object(text_to_glyphs_args),
|
173
|
+
unicode_to_glyph_args: classify_cairo_object(unicode_to_glyph_args),
|
174
|
+
result: result,
|
175
|
+
}
|
176
|
+
if Cairo.satisfied_version?(1, 17, 6)
|
177
|
+
expected[:render_glyph_args],
|
178
|
+
expected[:render_color_glyph_args] =
|
179
|
+
expected[:render_color_glyph_args],
|
180
|
+
expected[:render_glyph_args]
|
181
|
+
end
|
182
|
+
assert_equal(expected, actual)
|
160
183
|
end
|
161
184
|
|
162
185
|
if Cairo.satisfied_version?(1, 7, 2)
|
163
186
|
class CustomUserFontFace < Cairo::UserFontFace
|
164
|
-
attr_reader :init_args
|
165
|
-
attr_reader :
|
187
|
+
attr_reader :init_args
|
188
|
+
attr_reader :render_glyph_args
|
189
|
+
attr_reader :render_color_glyph_args
|
190
|
+
attr_reader :text_to_glyphs_args
|
191
|
+
attr_reader :unicode_to_glyph_args
|
166
192
|
def initialize
|
167
193
|
super
|
168
194
|
@init_args = []
|
169
195
|
@render_glyph_args = []
|
196
|
+
@render_color_glyph_args = []
|
170
197
|
@text_to_glyphs_args = []
|
171
198
|
@unicode_to_glyph_args = []
|
172
199
|
end
|
@@ -179,6 +206,10 @@ class FontFaceTest < Test::Unit::TestCase
|
|
179
206
|
@render_glyph_args << args
|
180
207
|
end
|
181
208
|
|
209
|
+
def render_color_glyph(*args)
|
210
|
+
@render_color_glyph_args << args
|
211
|
+
end
|
212
|
+
|
182
213
|
def text_to_glyphs(*args)
|
183
214
|
@text_to_glyphs_args << args
|
184
215
|
scaled_font, utf8, data = args
|
@@ -202,26 +233,54 @@ class FontFaceTest < Test::Unit::TestCase
|
|
202
233
|
Cairo::Matrix.identity,
|
203
234
|
Cairo::Matrix.identity,
|
204
235
|
Cairo::FontOptions.new)
|
205
|
-
result = scaled_font.text_to_glyphs(0, 0, "
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
236
|
+
result = scaled_font.text_to_glyphs(0, 0, "abc")
|
237
|
+
expected = {
|
238
|
+
init_args: [
|
239
|
+
[Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents]
|
240
|
+
],
|
241
|
+
text_to_glyphs_args: [
|
242
|
+
[Cairo::ScaledFont, "abc", Cairo::UserFontFace::TextToGlyphsData],
|
243
|
+
],
|
244
|
+
unicode_to_glyph_args: [
|
245
|
+
[Cairo::ScaledFont, codepoint("a")],
|
246
|
+
[Cairo::ScaledFont, codepoint("b")],
|
247
|
+
[Cairo::ScaledFont, codepoint("c")],
|
248
|
+
],
|
249
|
+
result: [
|
250
|
+
[],
|
251
|
+
[],
|
252
|
+
Cairo::TextClusterFlag::BACKWARD,
|
253
|
+
],
|
254
|
+
}
|
255
|
+
actual = {
|
256
|
+
init_args: classify_cairo_object(face.init_args),
|
257
|
+
text_to_glyphs_args:
|
258
|
+
classify_cairo_object(face.text_to_glyphs_args),
|
259
|
+
unicode_to_glyph_args:
|
260
|
+
classify_cairo_object(face.unicode_to_glyph_args),
|
261
|
+
result: result,
|
262
|
+
}
|
263
|
+
if Cairo.satisfied_version?(1, 17, 6)
|
264
|
+
expected[:render_color_glyph_args] = [
|
265
|
+
[Cairo::ScaledFont, codepoint("a"), Cairo::Context, Cairo::TextExtents],
|
266
|
+
[Cairo::ScaledFont, codepoint("b"), Cairo::Context, Cairo::TextExtents],
|
267
|
+
[Cairo::ScaledFont, codepoint("c"), Cairo::Context, Cairo::TextExtents],
|
268
|
+
]
|
269
|
+
actual[:render_color_glyph_args] =
|
270
|
+
classify_cairo_object(face.render_color_glyph_args)
|
271
|
+
expected[:render_glyph_args] = []
|
272
|
+
actual[:render_glyph_args] =
|
273
|
+
classify_cairo_object(face.render_glyph_args)
|
274
|
+
else
|
275
|
+
expected[:render_glyph_args] = [
|
276
|
+
[Cairo::ScaledFont, codepoint("a"), Cairo::Context, Cairo::TextExtents],
|
277
|
+
[Cairo::ScaledFont, codepoint("b"), Cairo::Context, Cairo::TextExtents],
|
278
|
+
[Cairo::ScaledFont, codepoint("c"), Cairo::Context, Cairo::TextExtents],
|
279
|
+
]
|
280
|
+
actual[:render_glyph_args] =
|
281
|
+
classify_cairo_object(face.render_glyph_args)
|
282
|
+
end
|
283
|
+
assert_equal(expected, actual)
|
225
284
|
end
|
226
285
|
|
227
286
|
def test_user_font_face_class_and_callback
|
@@ -239,6 +298,13 @@ class FontFaceTest < Test::Unit::TestCase
|
|
239
298
|
render_glyph_args << args
|
240
299
|
end
|
241
300
|
|
301
|
+
render_color_glyph_args = []
|
302
|
+
if face.respond_to?(:on_render_color_glyph)
|
303
|
+
face.on_render_color_glyph do |*args|
|
304
|
+
render_color_glyph_args << args
|
305
|
+
end
|
306
|
+
end
|
307
|
+
|
242
308
|
text_to_glyphs_args = []
|
243
309
|
face.on_text_to_glyphs do |*args|
|
244
310
|
text_to_glyphs_args << args
|
@@ -257,34 +323,63 @@ class FontFaceTest < Test::Unit::TestCase
|
|
257
323
|
Cairo::Matrix.identity,
|
258
324
|
Cairo::Matrix.identity,
|
259
325
|
Cairo::FontOptions.new)
|
260
|
-
result = scaled_font.text_to_glyphs(0, 0, "
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
|
280
|
-
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
326
|
+
result = scaled_font.text_to_glyphs(0, 0, "abc")
|
327
|
+
expected = {
|
328
|
+
callback_init_args: [
|
329
|
+
[
|
330
|
+
Cairo::ScaledFont, Cairo::Context, Cairo::FontExtents,
|
331
|
+
],
|
332
|
+
],
|
333
|
+
callback_render_glyph_args: [
|
334
|
+
[Cairo::ScaledFont, codepoint("a"), Cairo::Context, Cairo::TextExtents],
|
335
|
+
[Cairo::ScaledFont, codepoint("b"), Cairo::Context, Cairo::TextExtents],
|
336
|
+
[Cairo::ScaledFont, codepoint("c"), Cairo::Context, Cairo::TextExtents],
|
337
|
+
],
|
338
|
+
callback_render_color_glyph_args: [],
|
339
|
+
callback_text_to_glyphs_args: [
|
340
|
+
[Cairo::ScaledFont, "abc", Cairo::UserFontFace::TextToGlyphsData],
|
341
|
+
],
|
342
|
+
callback_unicode_to_glyph_args: [
|
343
|
+
[Cairo::ScaledFont, codepoint("a")],
|
344
|
+
[Cairo::ScaledFont, codepoint("b")],
|
345
|
+
[Cairo::ScaledFont, codepoint("c")],
|
346
|
+
],
|
347
|
+
object_init_args: [],
|
348
|
+
object_render_glyph_args: [],
|
349
|
+
object_render_color_glyph_args: [],
|
350
|
+
object_text_to_glyphs_args: [],
|
351
|
+
object_unicode_to_glyph_args: [],
|
352
|
+
result: [[], [], Cairo::TextClusterFlag::BACKWARD],
|
353
|
+
}
|
354
|
+
actual = {
|
355
|
+
callback_init_args: classify_cairo_object(init_args),
|
356
|
+
callback_render_glyph_args:
|
357
|
+
classify_cairo_object(render_glyph_args),
|
358
|
+
callback_render_color_glyph_args:
|
359
|
+
classify_cairo_object(render_color_glyph_args),
|
360
|
+
callback_text_to_glyphs_args:
|
361
|
+
classify_cairo_object(text_to_glyphs_args),
|
362
|
+
callback_unicode_to_glyph_args:
|
363
|
+
classify_cairo_object(unicode_to_glyph_args),
|
364
|
+
object_init_args:
|
365
|
+
classify_cairo_object(face.init_args),
|
366
|
+
object_render_glyph_args:
|
367
|
+
classify_cairo_object(face.render_glyph_args),
|
368
|
+
object_render_color_glyph_args:
|
369
|
+
classify_cairo_object(face.render_color_glyph_args),
|
370
|
+
object_text_to_glyphs_args:
|
371
|
+
classify_cairo_object(face.text_to_glyphs_args),
|
372
|
+
object_unicode_to_glyph_args:
|
373
|
+
classify_cairo_object(face.unicode_to_glyph_args),
|
374
|
+
result: result,
|
375
|
+
}
|
376
|
+
if Cairo.satisfied_version?(1, 17, 6)
|
377
|
+
expected[:callback_render_glyph_args],
|
378
|
+
expected[:callback_render_color_glyph_args] =
|
379
|
+
expected[:callback_render_color_glyph_args],
|
380
|
+
expected[:callback_render_glyph_args]
|
381
|
+
end
|
382
|
+
assert_equal(expected, actual)
|
288
383
|
end
|
289
384
|
|
290
385
|
def classify_cairo_object(object)
|
@@ -6,8 +6,10 @@ class QuartzImageSurfaceTest < Test::Unit::TestCase
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def test_quartz_image_surface
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
Cairo::ImageSurface.create(100, 100) do |surface|
|
10
|
+
Cairo::QuartzImageSurface.create(surface) do |quartz_surface|
|
11
|
+
assert_kind_of(Cairo::QuartzImageSurface, quartz_surface)
|
12
|
+
end
|
13
|
+
end
|
12
14
|
end
|
13
15
|
end
|
data/test/test_svg_surface.rb
CHANGED
@@ -10,7 +10,11 @@ class SVGSurfaceTest < Test::Unit::TestCase
|
|
10
10
|
only_cairo_version(1, 15, 10)
|
11
11
|
output = StringIO.new
|
12
12
|
surface = Cairo::SVGSurface.new(output, 10, 20)
|
13
|
-
|
13
|
+
if Cairo.satisfied_version?(1, 17, 6)
|
14
|
+
assert_equal(Cairo::SVGUnit::USER, surface.document_unit)
|
15
|
+
else
|
16
|
+
assert_equal(Cairo::SVGUnit::PT, surface.document_unit)
|
17
|
+
end
|
14
18
|
surface.document_unit = Cairo::SVGUnit::CM
|
15
19
|
assert_equal(Cairo::SVGUnit::CM, surface.document_unit)
|
16
20
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cairo
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.17.
|
4
|
+
version: 1.17.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kouhei Sutou
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: native-package-installer
|
@@ -235,7 +235,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
235
235
|
version: '0'
|
236
236
|
requirements:
|
237
237
|
- cairo >= 1.2.0
|
238
|
-
rubygems_version: 3.
|
238
|
+
rubygems_version: 3.4.0.dev
|
239
239
|
signing_key:
|
240
240
|
specification_version: 4
|
241
241
|
summary: Ruby bindings for cairo
|