rmagick 4.2.2 → 5.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/Dockerfile +14 -0
- data/.devcontainer/ImageMagick6/devcontainer.json +11 -0
- data/.devcontainer/devcontainer.json +11 -0
- data/.devcontainer/setup-repo.sh +10 -0
- data/.devcontainer/setup-user.sh +45 -0
- data/.editorconfig +1 -1
- data/.github/workflows/ci.yml +59 -24
- data/.gitignore +3 -0
- data/.rubocop_todo.yml +0 -1
- data/.yardopts +1 -1
- data/CHANGELOG.md +131 -0
- data/README.md +12 -17
- data/Rakefile +53 -81
- data/before_install_linux.sh +4 -4
- data/before_install_osx.sh +7 -6
- data/ext/RMagick/extconf.rb +94 -45
- data/ext/RMagick/{rmagick.c → rmagick.cpp} +19 -22
- data/ext/RMagick/rmagick.h +90 -60
- data/ext/RMagick/rmagick_gvl.h +224 -0
- data/ext/RMagick/{rmdraw.c → rmdraw.cpp} +160 -146
- data/ext/RMagick/{rmenum.c → rmenum.cpp} +69 -50
- data/ext/RMagick/{rmfill.c → rmfill.cpp} +81 -20
- data/ext/RMagick/{rmilist.c → rmilist.cpp} +184 -93
- data/ext/RMagick/{rmimage.c → rmimage.cpp} +1276 -731
- data/ext/RMagick/{rminfo.c → rminfo.cpp} +119 -131
- data/ext/RMagick/{rmkinfo.c → rmkinfo.cpp} +41 -16
- data/ext/RMagick/rmmain.cpp +1957 -0
- data/ext/RMagick/{rmmontage.c → rmmontage.cpp} +49 -28
- data/ext/RMagick/{rmpixel.c → rmpixel.cpp} +109 -84
- data/ext/RMagick/{rmstruct.c → rmstruct.cpp} +12 -12
- data/ext/RMagick/{rmutil.c → rmutil.cpp} +52 -91
- data/lib/rmagick/version.rb +3 -1
- data/lib/rmagick.rb +2 -0
- data/lib/rmagick_internal.rb +9 -48
- data/lib/rvg/rvg.rb +2 -2
- data/rmagick.gemspec +8 -7
- metadata +54 -23
- data/.codeclimate.yml +0 -63
- data/deprecated/RMagick.rb +0 -6
- data/ext/RMagick/rmmain.c +0 -1951
@@ -5,25 +5,51 @@
|
|
5
5
|
*
|
6
6
|
* Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or
|
7
7
|
*
|
8
|
-
* @file rmdraw.
|
9
|
-
* @version $Id: rmdraw.
|
8
|
+
* @file rmdraw.cpp
|
9
|
+
* @version $Id: rmdraw.cpp,v 1.83 2009/12/20 02:33:33 baror Exp $
|
10
10
|
* @author Tim Hunter
|
11
11
|
******************************************************************************/
|
12
12
|
|
13
13
|
#include "rmagick.h"
|
14
14
|
#include "float.h"
|
15
15
|
|
16
|
-
|
17
|
-
static void
|
16
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
17
|
+
static void Draw_compact(void *drawptr);
|
18
|
+
#endif
|
19
|
+
static void Draw_mark(void *);
|
20
|
+
static void Draw_destroy(void *);
|
21
|
+
static size_t Draw_memsize(const void *);
|
18
22
|
static VALUE new_DrawOptions(void);
|
23
|
+
static VALUE get_type_metrics(int, VALUE *, VALUE, gvl_function_t);
|
24
|
+
|
25
|
+
const rb_data_type_t rm_draw_data_type = {
|
26
|
+
"Magick::Draw",
|
27
|
+
{
|
28
|
+
Draw_mark,
|
29
|
+
Draw_destroy,
|
30
|
+
Draw_memsize,
|
31
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
32
|
+
Draw_compact,
|
33
|
+
#endif
|
34
|
+
},
|
35
|
+
0, 0,
|
36
|
+
RUBY_TYPED_FROZEN_SHAREABLE,
|
37
|
+
};
|
38
|
+
|
19
39
|
|
20
|
-
|
40
|
+
DEFINE_GVL_STUB4(BlobToImage, const ImageInfo *, const void *, const size_t, ExceptionInfo *);
|
41
|
+
DEFINE_GVL_STUB4(ImageToBlob, const ImageInfo *, Image *, size_t *, ExceptionInfo *);
|
21
42
|
#if defined(IMAGEMAGICK_7)
|
22
|
-
|
43
|
+
DEFINE_GVL_STUB3(AnnotateImage, Image *, const DrawInfo *, ExceptionInfo *);
|
44
|
+
DEFINE_GVL_STUB3(DrawImage, Image *, const DrawInfo *, ExceptionInfo *);
|
45
|
+
DEFINE_GVL_STUB4(GetMultilineTypeMetrics, Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
|
46
|
+
DEFINE_GVL_STUB4(GetTypeMetrics, Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
|
23
47
|
#else
|
24
|
-
|
48
|
+
DEFINE_GVL_STUB2(AnnotateImage, Image *, const DrawInfo *);
|
49
|
+
DEFINE_GVL_STUB2(DrawImage, Image *, const DrawInfo *);
|
50
|
+
DEFINE_GVL_STUB3(GetMultilineTypeMetrics, Image *, const DrawInfo *, TypeMetric *);
|
51
|
+
DEFINE_GVL_STUB3(GetTypeMetrics, Image *, const DrawInfo *, TypeMetric *);
|
25
52
|
#endif
|
26
|
-
static VALUE get_type_metrics(int, VALUE *, VALUE, get_type_metrics_func_t);
|
27
53
|
|
28
54
|
|
29
55
|
/**
|
@@ -38,7 +64,7 @@ Draw_affine_eq(VALUE self, VALUE matrix)
|
|
38
64
|
Draw *draw;
|
39
65
|
|
40
66
|
rb_check_frozen(self);
|
41
|
-
|
67
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
42
68
|
Export_AffineMatrix(&draw->info->affine, matrix);
|
43
69
|
return matrix;
|
44
70
|
}
|
@@ -56,7 +82,7 @@ Draw_align_eq(VALUE self, VALUE align)
|
|
56
82
|
Draw *draw;
|
57
83
|
|
58
84
|
rb_check_frozen(self);
|
59
|
-
|
85
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
60
86
|
VALUE_TO_ENUM(align, draw->info->align, AlignType);
|
61
87
|
return align;
|
62
88
|
}
|
@@ -74,7 +100,7 @@ Draw_decorate_eq(VALUE self, VALUE decorate)
|
|
74
100
|
Draw *draw;
|
75
101
|
|
76
102
|
rb_check_frozen(self);
|
77
|
-
|
103
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
78
104
|
VALUE_TO_ENUM(decorate, draw->info->decorate, DecorationType);
|
79
105
|
return decorate;
|
80
106
|
}
|
@@ -92,7 +118,7 @@ Draw_density_eq(VALUE self, VALUE density)
|
|
92
118
|
Draw *draw;
|
93
119
|
|
94
120
|
rb_check_frozen(self);
|
95
|
-
|
121
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
96
122
|
magick_clone_string(&draw->info->density, StringValueCStr(density));
|
97
123
|
|
98
124
|
return density;
|
@@ -111,7 +137,7 @@ Draw_encoding_eq(VALUE self, VALUE encoding)
|
|
111
137
|
Draw *draw;
|
112
138
|
|
113
139
|
rb_check_frozen(self);
|
114
|
-
|
140
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
115
141
|
magick_clone_string(&draw->info->encoding, StringValueCStr(encoding));
|
116
142
|
|
117
143
|
return encoding;
|
@@ -130,7 +156,7 @@ Draw_fill_eq(VALUE self, VALUE fill)
|
|
130
156
|
Draw *draw;
|
131
157
|
|
132
158
|
rb_check_frozen(self);
|
133
|
-
|
159
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
134
160
|
Color_to_PixelColor(&draw->info->fill, fill);
|
135
161
|
return fill;
|
136
162
|
}
|
@@ -151,7 +177,7 @@ Draw_fill_pattern_eq(VALUE self, VALUE pattern)
|
|
151
177
|
Draw *draw;
|
152
178
|
|
153
179
|
rb_check_frozen(self);
|
154
|
-
|
180
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
155
181
|
|
156
182
|
if (draw->info->fill_pattern != NULL)
|
157
183
|
{
|
@@ -186,7 +212,7 @@ Draw_font_eq(VALUE self, VALUE font)
|
|
186
212
|
Draw *draw;
|
187
213
|
|
188
214
|
rb_check_frozen(self);
|
189
|
-
|
215
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
190
216
|
magick_clone_string(&draw->info->font, StringValueCStr(font));
|
191
217
|
|
192
218
|
return font;
|
@@ -205,7 +231,7 @@ Draw_font_family_eq(VALUE self, VALUE family)
|
|
205
231
|
Draw *draw;
|
206
232
|
|
207
233
|
rb_check_frozen(self);
|
208
|
-
|
234
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
209
235
|
magick_clone_string(&draw->info->family, StringValueCStr(family));
|
210
236
|
|
211
237
|
return family;
|
@@ -224,7 +250,7 @@ Draw_font_stretch_eq(VALUE self, VALUE stretch)
|
|
224
250
|
Draw *draw;
|
225
251
|
|
226
252
|
rb_check_frozen(self);
|
227
|
-
|
253
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
228
254
|
VALUE_TO_ENUM(stretch, draw->info->stretch, StretchType);
|
229
255
|
return stretch;
|
230
256
|
}
|
@@ -242,7 +268,7 @@ Draw_font_style_eq(VALUE self, VALUE style)
|
|
242
268
|
Draw *draw;
|
243
269
|
|
244
270
|
rb_check_frozen(self);
|
245
|
-
|
271
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
246
272
|
VALUE_TO_ENUM(style, draw->info->style, StyleType);
|
247
273
|
return style;
|
248
274
|
}
|
@@ -262,14 +288,14 @@ Draw_font_weight_eq(VALUE self, VALUE weight)
|
|
262
288
|
size_t w;
|
263
289
|
|
264
290
|
rb_check_frozen(self);
|
265
|
-
|
291
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
266
292
|
|
267
293
|
if (FIXNUM_P(weight))
|
268
294
|
{
|
269
295
|
w = FIX2INT(weight);
|
270
296
|
if (w < 100 || w > 900)
|
271
297
|
{
|
272
|
-
rb_raise(rb_eArgError, "invalid font weight (%"RMIuSIZE" given)", w);
|
298
|
+
rb_raise(rb_eArgError, "invalid font weight (%" RMIuSIZE " given)", w);
|
273
299
|
}
|
274
300
|
draw->info->weight = w;
|
275
301
|
}
|
@@ -328,7 +354,7 @@ Draw_gravity_eq(VALUE self, VALUE grav)
|
|
328
354
|
Draw *draw;
|
329
355
|
|
330
356
|
rb_check_frozen(self);
|
331
|
-
|
357
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
332
358
|
VALUE_TO_ENUM(grav, draw->info->gravity, GravityType);
|
333
359
|
|
334
360
|
return grav;
|
@@ -347,7 +373,7 @@ Draw_kerning_eq(VALUE self, VALUE kerning)
|
|
347
373
|
Draw *draw;
|
348
374
|
|
349
375
|
rb_check_frozen(self);
|
350
|
-
|
376
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
351
377
|
draw->info->kerning = NUM2DBL(kerning);
|
352
378
|
return kerning;
|
353
379
|
}
|
@@ -365,7 +391,7 @@ Draw_interline_spacing_eq(VALUE self, VALUE spacing)
|
|
365
391
|
Draw *draw;
|
366
392
|
|
367
393
|
rb_check_frozen(self);
|
368
|
-
|
394
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
369
395
|
draw->info->interline_spacing = NUM2DBL(spacing);
|
370
396
|
return spacing;
|
371
397
|
}
|
@@ -383,7 +409,7 @@ Draw_interword_spacing_eq(VALUE self, VALUE spacing)
|
|
383
409
|
Draw *draw;
|
384
410
|
|
385
411
|
rb_check_frozen(self);
|
386
|
-
|
412
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
387
413
|
draw->info->interword_spacing = NUM2DBL(spacing);
|
388
414
|
return spacing;
|
389
415
|
}
|
@@ -415,7 +441,8 @@ image_to_str(Image *image)
|
|
415
441
|
|
416
442
|
info = CloneImageInfo(NULL);
|
417
443
|
exception = AcquireExceptionInfo();
|
418
|
-
|
444
|
+
GVL_STRUCT_TYPE(ImageToBlob) args = { info, image, &length, exception };
|
445
|
+
blob = (unsigned char *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ImageToBlob), &args);
|
419
446
|
DestroyImageInfo(info);
|
420
447
|
CHECK_EXCEPTION();
|
421
448
|
DestroyExceptionInfo(exception);
|
@@ -453,7 +480,8 @@ Image *str_to_image(VALUE str)
|
|
453
480
|
|
454
481
|
info = CloneImageInfo(NULL);
|
455
482
|
exception = AcquireExceptionInfo();
|
456
|
-
|
483
|
+
GVL_STRUCT_TYPE(BlobToImage) args = { info, RSTRING_PTR(str), (size_t)RSTRING_LEN(str), exception };
|
484
|
+
image = (Image *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(BlobToImage), &args);
|
457
485
|
DestroyImageInfo(info);
|
458
486
|
CHECK_EXCEPTION();
|
459
487
|
DestroyExceptionInfo(exception);
|
@@ -482,7 +510,7 @@ Draw_marshal_dump(VALUE self)
|
|
482
510
|
Draw *draw;
|
483
511
|
VALUE ddraw;
|
484
512
|
|
485
|
-
|
513
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
486
514
|
|
487
515
|
// Raise an exception if the Draw has a non-NULL gradient or element_reference field
|
488
516
|
if (draw->info->element_reference.type != UndefinedReference
|
@@ -493,31 +521,17 @@ Draw_marshal_dump(VALUE self)
|
|
493
521
|
|
494
522
|
ddraw = rb_hash_new();
|
495
523
|
|
496
|
-
// rb_hash_aset(ddraw, CSTR2SYM("primitive"), MAGICK_STRING_TO_OBJ(draw->info->primitive)); internal
|
497
|
-
// rb_hash_aset(ddraw, CSTR2SYM("geometry"), MAGICK_STRING_TO_OBJ(draw->info->geometry)); set by "text" primitive
|
498
|
-
// rb_hash_aset(ddraw, CSTR2SYM("viewbox"), Import_RectangleInfo(&draw->info->viewbox)); internal
|
499
524
|
rb_hash_aset(ddraw, CSTR2SYM("affine"), Import_AffineMatrix(&draw->info->affine));
|
500
525
|
rb_hash_aset(ddraw, CSTR2SYM("gravity"), INT2FIX(draw->info->gravity));
|
501
526
|
rb_hash_aset(ddraw, CSTR2SYM("fill"), Pixel_from_PixelColor(&draw->info->fill));
|
502
527
|
rb_hash_aset(ddraw, CSTR2SYM("stroke"), Pixel_from_PixelColor(&draw->info->stroke));
|
503
528
|
rb_hash_aset(ddraw, CSTR2SYM("stroke_width"), rb_float_new(draw->info->stroke_width));
|
504
|
-
// rb_hash_aset(ddraw, CSTR2SYM("gradient"), Qnil); // not used yet
|
505
529
|
rb_hash_aset(ddraw, CSTR2SYM("fill_pattern"), image_to_str(draw->info->fill_pattern));
|
506
|
-
rb_hash_aset(ddraw, CSTR2SYM("tile"), Qnil); // deprecated
|
507
530
|
rb_hash_aset(ddraw, CSTR2SYM("stroke_pattern"), image_to_str(draw->info->stroke_pattern));
|
508
531
|
rb_hash_aset(ddraw, CSTR2SYM("stroke_antialias"), draw->info->stroke_antialias ? Qtrue : Qfalse);
|
509
532
|
rb_hash_aset(ddraw, CSTR2SYM("text_antialias"), draw->info->text_antialias ? Qtrue : Qfalse);
|
510
|
-
// rb_hash_aset(ddraw, CSTR2SYM("fill_rule"), INT2FIX(draw->info->fill_rule)); internal
|
511
|
-
// rb_hash_aset(ddraw, CSTR2SYM("linecap"), INT2FIX(draw->info->linecap));
|
512
|
-
// rb_hash_aset(ddraw, CSTR2SYM("linejoin"), INT2FIX(draw->info->linejoin));
|
513
|
-
// rb_hash_aset(ddraw, CSTR2SYM("miterlimit"), ULONG2NUM(draw->info->miterlimit));
|
514
|
-
// rb_hash_aset(ddraw, CSTR2SYM("dash_offset"), rb_float_new(draw->info->dash_offset));
|
515
533
|
rb_hash_aset(ddraw, CSTR2SYM("decorate"), INT2FIX(draw->info->decorate));
|
516
|
-
// rb_hash_aset(ddraw, CSTR2SYM("compose"), INT2FIX(draw->info->compose)); set via "image" primitive
|
517
|
-
// rb_hash_aset(ddraw, CSTR2SYM("text"), MAGICK_STRING_TO_OBJ(draw->info->text)); set via "text" primitive
|
518
|
-
// rb_hash_aset(ddraw, CSTR2SYM("face"), Qnil); internal
|
519
534
|
rb_hash_aset(ddraw, CSTR2SYM("font"), MAGICK_STRING_TO_OBJ(draw->info->font));
|
520
|
-
// rb_hash_aset(ddraw, CSTR2SYM("metrics"), Qnil); internal
|
521
535
|
rb_hash_aset(ddraw, CSTR2SYM("family"), MAGICK_STRING_TO_OBJ(draw->info->family));
|
522
536
|
rb_hash_aset(ddraw, CSTR2SYM("style"), INT2FIX(draw->info->style));
|
523
537
|
rb_hash_aset(ddraw, CSTR2SYM("stretch"), INT2FIX(draw->info->stretch));
|
@@ -527,26 +541,17 @@ Draw_marshal_dump(VALUE self)
|
|
527
541
|
rb_hash_aset(ddraw, CSTR2SYM("density"), MAGICK_STRING_TO_OBJ(draw->info->density));
|
528
542
|
rb_hash_aset(ddraw, CSTR2SYM("align"), INT2FIX(draw->info->align));
|
529
543
|
rb_hash_aset(ddraw, CSTR2SYM("undercolor"), Pixel_from_PixelColor(&draw->info->undercolor));
|
530
|
-
// rb_hash_aset(ddraw, CSTR2SYM("border_color"), Pixel_from_PixelColor(&draw->info->border_color)); Montage and Polaroid
|
531
|
-
// rb_hash_aset(ddraw, CSTR2SYM("server_name"), MAGICK_STRING_TO_OBJ(draw->info->server_name));
|
532
|
-
// rb_hash_aset(ddraw, CSTR2SYM("dash_pattern"), dash_pattern_to_array(draw->info->dash_pattern)); internal
|
533
|
-
// rb_hash_aset(ddraw, CSTR2SYM("clip_mask"), MAGICK_STRING_TO_OBJ(draw->info->clip_mask)); internal
|
534
|
-
// rb_hash_aset(ddraw, CSTR2SYM("bounds"), Import_SegmentInfo(&draw->info->bounds)); internal
|
535
544
|
rb_hash_aset(ddraw, CSTR2SYM("clip_units"), INT2FIX(draw->info->clip_units));
|
536
545
|
#if defined(IMAGEMAGICK_7)
|
537
546
|
rb_hash_aset(ddraw, CSTR2SYM("alpha"), QUANTUM2NUM(draw->info->alpha));
|
538
547
|
#else
|
539
548
|
rb_hash_aset(ddraw, CSTR2SYM("opacity"), QUANTUM2NUM(draw->info->opacity));
|
540
549
|
#endif
|
541
|
-
// rb_hash_aset(ddraw, CSTR2SYM("render"), draw->info->render ? Qtrue : Qfalse); internal
|
542
|
-
// rb_hash_aset(ddraw, CSTR2SYM("element_reference"), Qnil); // not used yet
|
543
|
-
// rb_hash_aset(ddraw, CSTR2SYM("debug"), draw->info->debug ? Qtrue : Qfalse);
|
544
550
|
rb_hash_aset(ddraw, CSTR2SYM("kerning"), rb_float_new(draw->info->kerning));
|
545
551
|
rb_hash_aset(ddraw, CSTR2SYM("interword_spacing"), rb_float_new(draw->info->interword_spacing));
|
546
552
|
|
547
553
|
// Non-DrawInfo fields
|
548
554
|
rb_hash_aset(ddraw, CSTR2SYM("primitives"), draw->primitives);
|
549
|
-
// rb_hash_aset(ddraw, CSTR2SYM("shadow_color"), Pixel_from_PixelColor(&draw->shadow_color)); Polaroid-only
|
550
555
|
|
551
556
|
return ddraw;
|
552
557
|
}
|
@@ -564,21 +569,18 @@ Draw_marshal_load(VALUE self, VALUE ddraw)
|
|
564
569
|
Draw *draw;
|
565
570
|
VALUE val;
|
566
571
|
|
567
|
-
|
568
|
-
|
572
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
573
|
+
|
569
574
|
if (draw->info == NULL)
|
570
575
|
{
|
571
576
|
ImageInfo *image_info;
|
572
577
|
|
573
578
|
image_info = CloneImageInfo(NULL);
|
574
579
|
draw->info = CloneDrawInfo(image_info, (DrawInfo *) NULL);
|
575
|
-
DestroyImageInfo(image_info);
|
580
|
+
DestroyImageInfo(image_info);
|
576
581
|
}
|
577
582
|
OBJ_TO_MAGICK_STRING(draw->info->geometry, rb_hash_aref(ddraw, CSTR2SYM("geometry")));
|
578
583
|
|
579
|
-
//val = rb_hash_aref(ddraw, CSTR2SYM("viewbox"));
|
580
|
-
//Export_RectangleInfo(&draw->info->viewbox, val);
|
581
|
-
|
582
584
|
val = rb_hash_aref(ddraw, CSTR2SYM("affine"));
|
583
585
|
Export_AffineMatrix(&draw->info->affine, val);
|
584
586
|
|
@@ -593,8 +595,8 @@ Draw_marshal_load(VALUE self, VALUE ddraw)
|
|
593
595
|
draw->info->stroke_width = NUM2DBL(rb_hash_aref(ddraw, CSTR2SYM("stroke_width")));
|
594
596
|
draw->info->fill_pattern = str_to_image(rb_hash_aref(ddraw, CSTR2SYM("fill_pattern")));
|
595
597
|
draw->info->stroke_pattern = str_to_image(rb_hash_aref(ddraw, CSTR2SYM("stroke_pattern")));
|
596
|
-
draw->info->stroke_antialias = RTEST(rb_hash_aref(ddraw, CSTR2SYM("stroke_antialias")));
|
597
|
-
draw->info->text_antialias = RTEST(rb_hash_aref(ddraw, CSTR2SYM("text_antialias")));
|
598
|
+
draw->info->stroke_antialias = (MagickBooleanType)RTEST(rb_hash_aref(ddraw, CSTR2SYM("stroke_antialias")));
|
599
|
+
draw->info->text_antialias = (MagickBooleanType)RTEST(rb_hash_aref(ddraw, CSTR2SYM("text_antialias")));
|
598
600
|
draw->info->decorate = (DecorationType) FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("decorate")));
|
599
601
|
OBJ_TO_MAGICK_STRING(draw->info->font, rb_hash_aref(ddraw, CSTR2SYM("font")));
|
600
602
|
OBJ_TO_MAGICK_STRING(draw->info->family, rb_hash_aref(ddraw, CSTR2SYM("family")));
|
@@ -610,7 +612,7 @@ Draw_marshal_load(VALUE self, VALUE ddraw)
|
|
610
612
|
val = rb_hash_aref(ddraw, CSTR2SYM("undercolor"));
|
611
613
|
Color_to_PixelColor(&draw->info->undercolor, val);
|
612
614
|
|
613
|
-
draw->info->clip_units = FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("clip_units")));
|
615
|
+
draw->info->clip_units = (ClipPathUnits)FIX2INT(rb_hash_aref(ddraw, CSTR2SYM("clip_units")));
|
614
616
|
#if defined(IMAGEMAGICK_7)
|
615
617
|
draw->info->alpha = NUM2QUANTUM(rb_hash_aref(ddraw, CSTR2SYM("alpha")));
|
616
618
|
#else
|
@@ -639,7 +641,7 @@ Draw_pointsize_eq(VALUE self, VALUE pointsize)
|
|
639
641
|
Draw *draw;
|
640
642
|
|
641
643
|
rb_check_frozen(self);
|
642
|
-
|
644
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
643
645
|
draw->info->pointsize = NUM2DBL(pointsize);
|
644
646
|
return pointsize;
|
645
647
|
}
|
@@ -659,7 +661,7 @@ Draw_rotation_eq(VALUE self, VALUE deg)
|
|
659
661
|
AffineMatrix affine, current;
|
660
662
|
|
661
663
|
rb_check_frozen(self);
|
662
|
-
|
664
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
663
665
|
|
664
666
|
degrees = NUM2DBL(deg);
|
665
667
|
if (fabs(degrees) > DBL_EPSILON)
|
@@ -695,7 +697,7 @@ Draw_stroke_eq(VALUE self, VALUE stroke)
|
|
695
697
|
Draw *draw;
|
696
698
|
|
697
699
|
rb_check_frozen(self);
|
698
|
-
|
700
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
699
701
|
Color_to_PixelColor(&draw->info->stroke, stroke);
|
700
702
|
return stroke;
|
701
703
|
}
|
@@ -715,7 +717,7 @@ Draw_stroke_pattern_eq(VALUE self, VALUE pattern)
|
|
715
717
|
Draw *draw;
|
716
718
|
|
717
719
|
rb_check_frozen(self);
|
718
|
-
|
720
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
719
721
|
|
720
722
|
if (draw->info->stroke_pattern != NULL)
|
721
723
|
{
|
@@ -751,7 +753,7 @@ Draw_stroke_width_eq(VALUE self, VALUE stroke_width)
|
|
751
753
|
Draw *draw;
|
752
754
|
|
753
755
|
rb_check_frozen(self);
|
754
|
-
|
756
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
755
757
|
draw->info->stroke_width = NUM2DBL(stroke_width);
|
756
758
|
return stroke_width;
|
757
759
|
}
|
@@ -769,7 +771,7 @@ Draw_text_antialias_eq(VALUE self, VALUE text_antialias)
|
|
769
771
|
Draw *draw;
|
770
772
|
|
771
773
|
rb_check_frozen(self);
|
772
|
-
|
774
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
773
775
|
draw->info->text_antialias = (MagickBooleanType) RTEST(text_antialias);
|
774
776
|
return text_antialias;
|
775
777
|
}
|
@@ -800,7 +802,7 @@ Draw_undercolor_eq(VALUE self, VALUE undercolor)
|
|
800
802
|
Draw *draw;
|
801
803
|
|
802
804
|
rb_check_frozen(self);
|
803
|
-
|
805
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
804
806
|
Color_to_PixelColor(&draw->info->undercolor, undercolor);
|
805
807
|
return undercolor;
|
806
808
|
}
|
@@ -843,7 +845,7 @@ VALUE Draw_annotate(
|
|
843
845
|
|
844
846
|
// Save the affine matrix in case it is modified by
|
845
847
|
// Draw#rotation=
|
846
|
-
|
848
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
847
849
|
keep = draw->info->affine;
|
848
850
|
|
849
851
|
image_arg = rm_cur_image(image_arg);
|
@@ -853,15 +855,7 @@ VALUE Draw_annotate(
|
|
853
855
|
// allowing the app a chance to modify the object's attributes
|
854
856
|
if (rb_block_given_p())
|
855
857
|
{
|
856
|
-
|
857
|
-
{
|
858
|
-
// Run the block in self's context
|
859
|
-
rb_obj_instance_eval(0, NULL, self);
|
860
|
-
}
|
861
|
-
else
|
862
|
-
{
|
863
|
-
rb_yield(self);
|
864
|
-
}
|
858
|
+
rb_yield(self);
|
865
859
|
}
|
866
860
|
|
867
861
|
// Translate & store in Draw structure
|
@@ -909,10 +903,11 @@ VALUE Draw_annotate(
|
|
909
903
|
magick_clone_string(&draw->info->geometry, geometry_str);
|
910
904
|
|
911
905
|
#if defined(IMAGEMAGICK_7)
|
912
|
-
AnnotateImage
|
906
|
+
GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info, exception };
|
913
907
|
#else
|
914
|
-
AnnotateImage
|
908
|
+
GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info };
|
915
909
|
#endif
|
910
|
+
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(AnnotateImage), &args);
|
916
911
|
|
917
912
|
magick_free(draw->info->text);
|
918
913
|
draw->info->text = NULL;
|
@@ -962,7 +957,7 @@ Draw_clone(VALUE self)
|
|
962
957
|
* @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
|
963
958
|
* imagelist, uses the current image.
|
964
959
|
*
|
965
|
-
* @overload composite(x, y, width, height, image,
|
960
|
+
* @overload composite(x, y, width, height, image, composite_op = Magick::OverCompositeOp)
|
966
961
|
* - The "image" argument can be either an ImageList object or an Image
|
967
962
|
* argument.
|
968
963
|
* @param x [Float] x position
|
@@ -971,8 +966,8 @@ Draw_clone(VALUE self)
|
|
971
966
|
* @param height [Float] the height
|
972
967
|
* @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
|
973
968
|
* imagelist, uses the current image.
|
974
|
-
* @param
|
975
|
-
*
|
969
|
+
* @param composite_op [Magick::CompositeOperator] the operator
|
970
|
+
*
|
976
971
|
* @return [Magick::Draw] self
|
977
972
|
*/
|
978
973
|
VALUE
|
@@ -981,7 +976,7 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
|
|
981
976
|
Draw *draw;
|
982
977
|
const char *op;
|
983
978
|
double x, y, width, height;
|
984
|
-
CompositeOperator
|
979
|
+
CompositeOperator composite_op;
|
985
980
|
VALUE image;
|
986
981
|
Image *comp_img;
|
987
982
|
struct TmpFile_Name *tmpfile_name;
|
@@ -1003,19 +998,19 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
|
|
1003
998
|
width = NUM2DBL(argv[2]);
|
1004
999
|
height = NUM2DBL(argv[3]);
|
1005
1000
|
|
1006
|
-
|
1001
|
+
composite_op = OverCompositeOp;
|
1007
1002
|
if (argc == 6)
|
1008
1003
|
{
|
1009
|
-
VALUE_TO_ENUM(argv[5],
|
1004
|
+
VALUE_TO_ENUM(argv[5], composite_op, CompositeOperator);
|
1010
1005
|
}
|
1011
1006
|
|
1012
|
-
op = CommandOptionToMnemonic(MagickComposeOptions,
|
1007
|
+
op = CommandOptionToMnemonic(MagickComposeOptions, composite_op);
|
1013
1008
|
if (rm_strcasecmp("Unrecognized", op) == 0)
|
1014
1009
|
{
|
1015
|
-
rb_raise(rb_eArgError, "unknown composite operator (%d)",
|
1010
|
+
rb_raise(rb_eArgError, "unknown composite operator (%d)", composite_op);
|
1016
1011
|
}
|
1017
1012
|
|
1018
|
-
|
1013
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1019
1014
|
|
1020
1015
|
// Create a temp copy of the composite image
|
1021
1016
|
rm_write_temp_image(comp_img, name, sizeof(name));
|
@@ -1023,7 +1018,7 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
|
|
1023
1018
|
// Add the temp filename to the filename array.
|
1024
1019
|
// Use Magick storage since we need to keep the list around
|
1025
1020
|
// until destroy_Draw is called.
|
1026
|
-
tmpfile_name = magick_malloc(sizeof(struct TmpFile_Name) + rm_strnlen_s(name, sizeof(name)));
|
1021
|
+
tmpfile_name = (struct TmpFile_Name *)magick_malloc(sizeof(struct TmpFile_Name) + rm_strnlen_s(name, sizeof(name)));
|
1027
1022
|
strcpy(tmpfile_name->name, name);
|
1028
1023
|
tmpfile_name->next = draw->tmpfile_ary;
|
1029
1024
|
draw->tmpfile_ary = tmpfile_name;
|
@@ -1060,7 +1055,7 @@ Draw_draw(VALUE self, VALUE image_arg)
|
|
1060
1055
|
image_arg = rm_cur_image(image_arg);
|
1061
1056
|
image = rm_check_frozen(image_arg);
|
1062
1057
|
|
1063
|
-
|
1058
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1064
1059
|
if (draw->primitives == 0)
|
1065
1060
|
{
|
1066
1061
|
rb_raise(rb_eArgError, "nothing to draw");
|
@@ -1071,10 +1066,11 @@ Draw_draw(VALUE self, VALUE image_arg)
|
|
1071
1066
|
|
1072
1067
|
#if defined(IMAGEMAGICK_7)
|
1073
1068
|
exception = AcquireExceptionInfo();
|
1074
|
-
DrawImage
|
1069
|
+
GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info, exception };
|
1075
1070
|
#else
|
1076
|
-
DrawImage
|
1071
|
+
GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info };
|
1077
1072
|
#endif
|
1073
|
+
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(DrawImage), &args);
|
1078
1074
|
|
1079
1075
|
magick_free(draw->info->primitive);
|
1080
1076
|
draw->info->primitive = NULL;
|
@@ -1105,7 +1101,7 @@ Draw_dup(VALUE self)
|
|
1105
1101
|
|
1106
1102
|
draw = ALLOC(Draw);
|
1107
1103
|
memset(draw, 0, sizeof(Draw));
|
1108
|
-
dup =
|
1104
|
+
dup = TypedData_Wrap_Struct(CLASS_OF(self), &rm_draw_data_type, draw);
|
1109
1105
|
RB_GC_GUARD(dup);
|
1110
1106
|
|
1111
1107
|
return rb_funcall(dup, rm_ID_initialize_copy, 1, self);
|
@@ -1135,7 +1131,7 @@ Draw_get_type_metrics(
|
|
1135
1131
|
VALUE *argv,
|
1136
1132
|
VALUE self)
|
1137
1133
|
{
|
1138
|
-
return get_type_metrics(argc, argv, self, GetTypeMetrics);
|
1134
|
+
return get_type_metrics(argc, argv, self, GVL_FUNC(GetTypeMetrics));
|
1139
1135
|
}
|
1140
1136
|
|
1141
1137
|
|
@@ -1162,7 +1158,7 @@ Draw_get_multiline_type_metrics(
|
|
1162
1158
|
VALUE *argv,
|
1163
1159
|
VALUE self)
|
1164
1160
|
{
|
1165
|
-
return get_type_metrics(argc, argv, self, GetMultilineTypeMetrics);
|
1161
|
+
return get_type_metrics(argc, argv, self, GVL_FUNC(GetMultilineTypeMetrics));
|
1166
1162
|
}
|
1167
1163
|
|
1168
1164
|
|
@@ -1176,8 +1172,8 @@ VALUE Draw_init_copy(VALUE self, VALUE orig)
|
|
1176
1172
|
{
|
1177
1173
|
Draw *copy, *original;
|
1178
1174
|
|
1179
|
-
|
1180
|
-
|
1175
|
+
TypedData_Get_Struct(orig, Draw, &rm_draw_data_type, original);
|
1176
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, copy);
|
1181
1177
|
|
1182
1178
|
copy->info = CloneDrawInfo(NULL, original->info);
|
1183
1179
|
if (!copy->info)
|
@@ -1205,10 +1201,10 @@ Draw_initialize(VALUE self)
|
|
1205
1201
|
Draw *draw, *draw_options;
|
1206
1202
|
VALUE options;
|
1207
1203
|
|
1208
|
-
|
1204
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1209
1205
|
|
1210
1206
|
options = new_DrawOptions();
|
1211
|
-
|
1207
|
+
TypedData_Get_Struct(options, Draw, &rm_draw_data_type, draw_options);
|
1212
1208
|
draw->info = draw_options->info;
|
1213
1209
|
draw_options->info = NULL;
|
1214
1210
|
|
@@ -1229,7 +1225,7 @@ Draw_inspect(VALUE self)
|
|
1229
1225
|
{
|
1230
1226
|
Draw *draw;
|
1231
1227
|
|
1232
|
-
|
1228
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1233
1229
|
return draw->primitives ? draw->primitives : rb_str_new2("(no primitives defined)");
|
1234
1230
|
}
|
1235
1231
|
|
@@ -1239,14 +1235,14 @@ Draw_inspect(VALUE self)
|
|
1239
1235
|
*
|
1240
1236
|
* @return [Magick::Draw] a new Draw object
|
1241
1237
|
*/
|
1242
|
-
VALUE Draw_alloc(VALUE
|
1238
|
+
VALUE Draw_alloc(VALUE klass)
|
1243
1239
|
{
|
1244
1240
|
Draw *draw;
|
1245
1241
|
VALUE draw_obj;
|
1246
1242
|
|
1247
1243
|
draw = ALLOC(Draw);
|
1248
1244
|
memset(draw, 0, sizeof(Draw));
|
1249
|
-
draw_obj =
|
1245
|
+
draw_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw);
|
1250
1246
|
|
1251
1247
|
RB_GC_GUARD(draw_obj);
|
1252
1248
|
|
@@ -1266,7 +1262,7 @@ Draw_primitive(VALUE self, VALUE primitive)
|
|
1266
1262
|
Draw *draw;
|
1267
1263
|
|
1268
1264
|
rb_check_frozen(self);
|
1269
|
-
|
1265
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1270
1266
|
|
1271
1267
|
if (draw->primitives == (VALUE)0)
|
1272
1268
|
{
|
@@ -1274,13 +1270,32 @@ Draw_primitive(VALUE self, VALUE primitive)
|
|
1274
1270
|
}
|
1275
1271
|
else
|
1276
1272
|
{
|
1277
|
-
draw->primitives =
|
1273
|
+
draw->primitives = rb_str_plus(draw->primitives, rb_str_new2("\n"));
|
1278
1274
|
draw->primitives = rb_str_concat(draw->primitives, primitive);
|
1279
1275
|
}
|
1280
1276
|
|
1281
1277
|
return self;
|
1282
1278
|
}
|
1283
1279
|
|
1280
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
1281
|
+
/**
|
1282
|
+
* Compact the objects.
|
1283
|
+
*
|
1284
|
+
* No Ruby usage (internal function)
|
1285
|
+
*
|
1286
|
+
* @param drawptr pointer to a Draw object
|
1287
|
+
*/
|
1288
|
+
static void
|
1289
|
+
Draw_compact(void *drawptr)
|
1290
|
+
{
|
1291
|
+
Draw *draw = (Draw *)drawptr;
|
1292
|
+
|
1293
|
+
if (draw->primitives != (VALUE)0)
|
1294
|
+
{
|
1295
|
+
draw->primitives = rb_gc_location(draw->primitives);
|
1296
|
+
}
|
1297
|
+
}
|
1298
|
+
#endif
|
1284
1299
|
|
1285
1300
|
/**
|
1286
1301
|
* Mark referenced objects.
|
@@ -1290,13 +1305,17 @@ Draw_primitive(VALUE self, VALUE primitive)
|
|
1290
1305
|
* @param drawptr pointer to a Draw object
|
1291
1306
|
*/
|
1292
1307
|
static void
|
1293
|
-
|
1308
|
+
Draw_mark(void *drawptr)
|
1294
1309
|
{
|
1295
1310
|
Draw *draw = (Draw *)drawptr;
|
1296
1311
|
|
1297
1312
|
if (draw->primitives != (VALUE)0)
|
1298
1313
|
{
|
1314
|
+
#ifdef HAVE_RB_GC_MARK_MOVABLE
|
1315
|
+
rb_gc_mark_movable(draw->primitives);
|
1316
|
+
#else
|
1299
1317
|
rb_gc_mark(draw->primitives);
|
1318
|
+
#endif
|
1300
1319
|
}
|
1301
1320
|
}
|
1302
1321
|
|
@@ -1309,7 +1328,7 @@ mark_Draw(void *drawptr)
|
|
1309
1328
|
* @param drawptr pointer to a Draw object
|
1310
1329
|
*/
|
1311
1330
|
static void
|
1312
|
-
|
1331
|
+
Draw_destroy(void *drawptr)
|
1313
1332
|
{
|
1314
1333
|
Draw *draw = (Draw *)drawptr;
|
1315
1334
|
|
@@ -1333,6 +1352,18 @@ destroy_Draw(void *drawptr)
|
|
1333
1352
|
xfree(drawptr);
|
1334
1353
|
}
|
1335
1354
|
|
1355
|
+
/**
|
1356
|
+
* Get Draw object size.
|
1357
|
+
*
|
1358
|
+
* No Ruby usage (internal function)
|
1359
|
+
*
|
1360
|
+
* @param infoptr pointer to the Draw object
|
1361
|
+
*/
|
1362
|
+
static size_t
|
1363
|
+
Draw_memsize(const void *drawptr)
|
1364
|
+
{
|
1365
|
+
return sizeof(Draw);
|
1366
|
+
}
|
1336
1367
|
|
1337
1368
|
/**
|
1338
1369
|
* Allocate & initialize a DrawOptions object.
|
@@ -1357,14 +1388,14 @@ new_DrawOptions(void)
|
|
1357
1388
|
* @return [Magick::Image::DrawOptions] a new DrawOptions object
|
1358
1389
|
*/
|
1359
1390
|
VALUE
|
1360
|
-
DrawOptions_alloc(VALUE
|
1391
|
+
DrawOptions_alloc(VALUE klass)
|
1361
1392
|
{
|
1362
1393
|
Draw *draw_options;
|
1363
1394
|
VALUE draw_options_obj;
|
1364
1395
|
|
1365
1396
|
draw_options = ALLOC(Draw);
|
1366
1397
|
memset(draw_options, 0, sizeof(Draw));
|
1367
|
-
draw_options_obj =
|
1398
|
+
draw_options_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw_options);
|
1368
1399
|
|
1369
1400
|
RB_GC_GUARD(draw_options_obj);
|
1370
1401
|
|
@@ -1382,26 +1413,16 @@ DrawOptions_initialize(VALUE self)
|
|
1382
1413
|
{
|
1383
1414
|
Draw *draw_options;
|
1384
1415
|
|
1385
|
-
|
1416
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw_options);
|
1386
1417
|
draw_options->info = AcquireDrawInfo();
|
1387
1418
|
if (!draw_options->info)
|
1388
1419
|
{
|
1389
1420
|
rb_raise(rb_eNoMemError, "not enough memory to continue");
|
1390
1421
|
}
|
1391
1422
|
|
1392
|
-
GetDrawInfo(NULL, draw_options->info);
|
1393
|
-
|
1394
1423
|
if (rb_block_given_p())
|
1395
1424
|
{
|
1396
|
-
|
1397
|
-
{
|
1398
|
-
// Run the block in self's context
|
1399
|
-
rb_obj_instance_eval(0, NULL, self);
|
1400
|
-
}
|
1401
|
-
else
|
1402
|
-
{
|
1403
|
-
rb_yield(self);
|
1404
|
-
}
|
1425
|
+
rb_yield(self);
|
1405
1426
|
}
|
1406
1427
|
|
1407
1428
|
return self;
|
@@ -1412,12 +1433,12 @@ DrawOptions_initialize(VALUE self)
|
|
1412
1433
|
* Allocate a new Magick::Image::PolaroidOptions object.
|
1413
1434
|
*
|
1414
1435
|
* - Internally a PolaroidOptions object is the same as a Draw object. The
|
1415
|
-
* methods are implemented by Draw methods in rmdraw.
|
1436
|
+
* methods are implemented by Draw methods in rmdraw.cpp.
|
1416
1437
|
*
|
1417
1438
|
* @return [Magick::Image::PolaroidOptions] a new PolaroidOptions object
|
1418
1439
|
*/
|
1419
1440
|
VALUE
|
1420
|
-
PolaroidOptions_alloc(VALUE
|
1441
|
+
PolaroidOptions_alloc(VALUE klass)
|
1421
1442
|
{
|
1422
1443
|
VALUE polaroid_obj;
|
1423
1444
|
ImageInfo *image_info;
|
@@ -1431,7 +1452,7 @@ PolaroidOptions_alloc(VALUE class)
|
|
1431
1452
|
draw->info = CloneDrawInfo(image_info, (DrawInfo *) NULL);
|
1432
1453
|
(void) DestroyImageInfo(image_info);
|
1433
1454
|
|
1434
|
-
polaroid_obj =
|
1455
|
+
polaroid_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw);
|
1435
1456
|
|
1436
1457
|
RB_GC_GUARD(polaroid_obj);
|
1437
1458
|
|
@@ -1453,7 +1474,7 @@ PolaroidOptions_initialize(VALUE self)
|
|
1453
1474
|
ExceptionInfo *exception;
|
1454
1475
|
|
1455
1476
|
// Default shadow color
|
1456
|
-
|
1477
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1457
1478
|
|
1458
1479
|
exception = AcquireExceptionInfo();
|
1459
1480
|
QueryColorCompliance("gray75", AllCompliance, &draw->shadow_color, exception);
|
@@ -1464,15 +1485,7 @@ PolaroidOptions_initialize(VALUE self)
|
|
1464
1485
|
|
1465
1486
|
if (rb_block_given_p())
|
1466
1487
|
{
|
1467
|
-
|
1468
|
-
{
|
1469
|
-
// Run the block in self's context
|
1470
|
-
rb_obj_instance_eval(0, NULL, self);
|
1471
|
-
}
|
1472
|
-
else
|
1473
|
-
{
|
1474
|
-
rb_yield(self);
|
1475
|
-
}
|
1488
|
+
rb_yield(self);
|
1476
1489
|
}
|
1477
1490
|
|
1478
1491
|
return self;
|
@@ -1505,7 +1518,7 @@ PolaroidOptions_shadow_color_eq(VALUE self, VALUE shadow)
|
|
1505
1518
|
Draw *draw;
|
1506
1519
|
|
1507
1520
|
rb_check_frozen(self);
|
1508
|
-
|
1521
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1509
1522
|
Color_to_PixelColor(&draw->shadow_color, shadow);
|
1510
1523
|
return shadow;
|
1511
1524
|
}
|
@@ -1523,7 +1536,7 @@ PolaroidOptions_border_color_eq(VALUE self, VALUE border)
|
|
1523
1536
|
Draw *draw;
|
1524
1537
|
|
1525
1538
|
rb_check_frozen(self);
|
1526
|
-
|
1539
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1527
1540
|
Color_to_PixelColor(&draw->info->border_color, border);
|
1528
1541
|
return border;
|
1529
1542
|
}
|
@@ -1572,6 +1585,9 @@ get_dummy_tm_img(VALUE klass)
|
|
1572
1585
|
}
|
1573
1586
|
|
1574
1587
|
|
1588
|
+
// aliases for common use of structure types; GetMultilineTypeMetrics, GetTypeMetrics
|
1589
|
+
typedef GVL_STRUCT_TYPE(GetTypeMetrics) GVL_STRUCT_TYPE(get_type_metrics);
|
1590
|
+
|
1575
1591
|
/**
|
1576
1592
|
* Call a get-type-metrics function.
|
1577
1593
|
*
|
@@ -1589,19 +1605,15 @@ get_dummy_tm_img(VALUE klass)
|
|
1589
1605
|
* @see Draw_get_multiline_type_metrics
|
1590
1606
|
*/
|
1591
1607
|
static VALUE
|
1592
|
-
get_type_metrics(
|
1593
|
-
int argc,
|
1594
|
-
VALUE *argv,
|
1595
|
-
VALUE self,
|
1596
|
-
get_type_metrics_func_t getter)
|
1608
|
+
get_type_metrics(int argc, VALUE *argv, VALUE self, gvl_function_t fp)
|
1597
1609
|
{
|
1598
1610
|
Image *image;
|
1599
1611
|
Draw *draw;
|
1600
1612
|
VALUE t;
|
1601
1613
|
TypeMetric metrics;
|
1602
1614
|
char *text = NULL;
|
1603
|
-
|
1604
|
-
|
1615
|
+
size_t text_l;
|
1616
|
+
MagickBooleanType okay;
|
1605
1617
|
#if defined(IMAGEMAGICK_7)
|
1606
1618
|
ExceptionInfo *exception;
|
1607
1619
|
#endif
|
@@ -1610,7 +1622,7 @@ get_type_metrics(
|
|
1610
1622
|
{
|
1611
1623
|
case 1: // use default image
|
1612
1624
|
text = rm_str2cstr(argv[0], &text_l);
|
1613
|
-
|
1625
|
+
TypedData_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, &rm_image_data_type, image);
|
1614
1626
|
break;
|
1615
1627
|
case 2:
|
1616
1628
|
t = rm_cur_image(argv[0]);
|
@@ -1627,7 +1639,7 @@ get_type_metrics(
|
|
1627
1639
|
rb_raise(rb_eArgError, "no text to measure");
|
1628
1640
|
}
|
1629
1641
|
|
1630
|
-
|
1642
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1631
1643
|
#if defined(IMAGEMAGICK_7)
|
1632
1644
|
exception = AcquireExceptionInfo();
|
1633
1645
|
draw->info->text = InterpretImageProperties(NULL, image, text, exception);
|
@@ -1651,10 +1663,12 @@ get_type_metrics(
|
|
1651
1663
|
}
|
1652
1664
|
|
1653
1665
|
#if defined(IMAGEMAGICK_7)
|
1654
|
-
|
1666
|
+
GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics, exception };
|
1655
1667
|
#else
|
1656
|
-
|
1668
|
+
GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics };
|
1657
1669
|
#endif
|
1670
|
+
void *ret = CALL_FUNC_WITHOUT_GVL(fp, &args);
|
1671
|
+
okay = static_cast<MagickBooleanType>(reinterpret_cast<intptr_t &>(ret));
|
1658
1672
|
|
1659
1673
|
magick_free(draw->info->text);
|
1660
1674
|
draw->info->text = NULL;
|