rmagick 4.2.6 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/ImageMagick6/devcontainer.json +1 -1
  3. data/.devcontainer/{ImageMagick7/devcontainer.json → devcontainer.json} +2 -2
  4. data/.devcontainer/setup-user.sh +1 -1
  5. data/.editorconfig +1 -1
  6. data/.github/workflows/ci.yml +87 -9
  7. data/.gitignore +4 -0
  8. data/.rubocop_todo.yml +16 -9
  9. data/.yardopts +1 -1
  10. data/CHANGELOG.md +130 -0
  11. data/Gemfile +20 -0
  12. data/README.md +10 -17
  13. data/Rakefile +63 -80
  14. data/before_install_linux.sh +3 -3
  15. data/before_install_osx.sh +6 -5
  16. data/ext/RMagick/extconf.rb +112 -52
  17. data/ext/RMagick/{rmagick.c → rmagick.cpp} +19 -22
  18. data/ext/RMagick/rmagick.h +88 -59
  19. data/ext/RMagick/rmagick_gvl.h +224 -0
  20. data/ext/RMagick/{rmdraw.c → rmdraw.cpp} +170 -159
  21. data/ext/RMagick/{rmenum.c → rmenum.cpp} +69 -50
  22. data/ext/RMagick/{rmfill.c → rmfill.cpp} +85 -24
  23. data/ext/RMagick/{rmilist.c → rmilist.cpp} +191 -93
  24. data/ext/RMagick/{rmimage.c → rmimage.cpp} +1543 -989
  25. data/ext/RMagick/{rminfo.c → rminfo.cpp} +140 -152
  26. data/ext/RMagick/{rmkinfo.c → rmkinfo.cpp} +46 -34
  27. data/ext/RMagick/rmmain.cpp +1923 -0
  28. data/ext/RMagick/{rmmontage.c → rmmontage.cpp} +50 -29
  29. data/ext/RMagick/{rmpixel.c → rmpixel.cpp} +108 -83
  30. data/ext/RMagick/{rmstruct.c → rmstruct.cpp} +6 -6
  31. data/ext/RMagick/{rmutil.c → rmutil.cpp} +62 -161
  32. data/lib/rmagick/version.rb +3 -1
  33. data/lib/rmagick.rb +2 -0
  34. data/lib/rmagick_internal.rb +76 -110
  35. data/lib/rvg/embellishable.rb +6 -2
  36. data/lib/rvg/misc.rb +7 -7
  37. data/lib/rvg/rvg.rb +2 -0
  38. data/lib/rvg/stretchable.rb +2 -2
  39. data/lib/rvg/transformable.rb +1 -1
  40. data/rmagick.gemspec +4 -13
  41. data/sig/rmagick/_draw_common_methods.rbs +64 -0
  42. data/sig/rmagick/_image_common_methods.rbs +389 -0
  43. data/sig/rmagick/draw.rbs +38 -0
  44. data/sig/rmagick/draw_attribute.rbs +28 -0
  45. data/sig/rmagick/enum.rbs +814 -0
  46. data/sig/rmagick/error.rbs +11 -0
  47. data/sig/rmagick/fill.rbs +21 -0
  48. data/sig/rmagick/geometry.rbs +14 -0
  49. data/sig/rmagick/image.rbs +194 -0
  50. data/sig/rmagick/image_list.rbs +181 -0
  51. data/sig/rmagick/iptc.rbs +101 -0
  52. data/sig/rmagick/kernel_info.rbs +12 -0
  53. data/sig/rmagick/optional_method_arguments.rbs +10 -0
  54. data/sig/rmagick/pixel.rbs +46 -0
  55. data/sig/rmagick/struct.rbs +90 -0
  56. data/sig/rmagick.rbs +43 -0
  57. data/sig/rvg/clippath.rbs +34 -0
  58. data/sig/rvg/container.rbs +78 -0
  59. data/sig/rvg/deep_equal.rbs +48 -0
  60. data/sig/rvg/describable.rbs +30 -0
  61. data/sig/rvg/embellishable.rbs +226 -0
  62. data/sig/rvg/misc.rbs +145 -0
  63. data/sig/rvg/paint.rbs +55 -0
  64. data/sig/rvg/pathdata.rbs +77 -0
  65. data/sig/rvg/rvg.rbs +125 -0
  66. data/sig/rvg/stretchable.rbs +56 -0
  67. data/sig/rvg/stylable.rbs +66 -0
  68. data/sig/rvg/text.rbs +118 -0
  69. data/sig/rvg/transformable.rbs +59 -0
  70. data/sig/rvg/units.rbs +33 -0
  71. metadata +59 -129
  72. data/.codeclimate.yml +0 -63
  73. data/deprecated/RMagick.rb +0 -6
  74. 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.c
9
- * @version $Id: rmdraw.c,v 1.83 2009/12/20 02:33:33 baror Exp $
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
- static void mark_Draw(void *);
17
- static void destroy_Draw(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
- /** Method that gets type metrics */
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
- typedef MagickBooleanType (get_type_metrics_func_t)(Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
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
- typedef MagickBooleanType (get_type_metrics_func_t)(Image *, const DrawInfo *, TypeMetric *);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- blob = ImageToBlob(info, image, &length, exception);
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
- image = BlobToImage(info, RSTRING_PTR(str), RSTRING_LEN(str), exception);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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
- Data_Get_Struct(self, Draw, draw);
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,16 +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
- if (rb_proc_arity(rb_block_proc()) == 0)
857
- {
858
- // Run the block in self's context
859
- rb_warn("passing a block without an image argument is deprecated");
860
- rb_obj_instance_eval(0, NULL, self);
861
- }
862
- else
863
- {
864
- rb_yield(self);
865
- }
858
+ rb_yield(self);
866
859
  }
867
860
 
868
861
  // Translate & store in Draw structure
@@ -910,10 +903,11 @@ VALUE Draw_annotate(
910
903
  magick_clone_string(&draw->info->geometry, geometry_str);
911
904
 
912
905
  #if defined(IMAGEMAGICK_7)
913
- AnnotateImage(image, draw->info, exception);
906
+ GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info, exception };
914
907
  #else
915
- AnnotateImage(image, draw->info);
908
+ GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info };
916
909
  #endif
910
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(AnnotateImage), &args);
917
911
 
918
912
  magick_free(draw->info->text);
919
913
  draw->info->text = NULL;
@@ -956,24 +950,24 @@ Draw_clone(VALUE self)
956
950
  * Draw the image.
957
951
  *
958
952
  * @overload composite(x, y, width, height, image)
959
- * @param x [Float] x position
960
- * @param y [Float] y position
961
- * @param width [Float] the width
962
- * @param height [Float] the height
953
+ * @param x [Numeric] x position
954
+ * @param y [Numeric] y position
955
+ * @param width [Numeric] the width
956
+ * @param height [Numeric] the height
963
957
  * @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
964
958
  * imagelist, uses the current image.
965
959
  *
966
- * @overload composite(x, y, width, height, image, operator = Magick::OverCompositeOp)
960
+ * @overload composite(x, y, width, height, image, composite_op = Magick::OverCompositeOp)
967
961
  * - The "image" argument can be either an ImageList object or an Image
968
962
  * argument.
969
- * @param x [Float] x position
970
- * @param y [Float] y position
971
- * @param width [Float] the width
972
- * @param height [Float] the height
963
+ * @param x [Numeric] x position
964
+ * @param y [Numeric] y position
965
+ * @param width [Numeric] the width
966
+ * @param height [Numeric] the height
973
967
  * @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
974
968
  * imagelist, uses the current image.
975
- * @param operator [Magick::CompositeOperator] the operator
976
- *
969
+ * @param composite_op [Magick::CompositeOperator] the operator
970
+ *
977
971
  * @return [Magick::Draw] self
978
972
  */
979
973
  VALUE
@@ -982,7 +976,7 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
982
976
  Draw *draw;
983
977
  const char *op;
984
978
  double x, y, width, height;
985
- CompositeOperator cop;
979
+ CompositeOperator composite_op;
986
980
  VALUE image;
987
981
  Image *comp_img;
988
982
  struct TmpFile_Name *tmpfile_name;
@@ -1004,19 +998,19 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
1004
998
  width = NUM2DBL(argv[2]);
1005
999
  height = NUM2DBL(argv[3]);
1006
1000
 
1007
- cop = OverCompositeOp;
1001
+ composite_op = OverCompositeOp;
1008
1002
  if (argc == 6)
1009
1003
  {
1010
- VALUE_TO_ENUM(argv[5], cop, CompositeOperator);
1004
+ VALUE_TO_ENUM(argv[5], composite_op, CompositeOperator);
1011
1005
  }
1012
1006
 
1013
- op = CommandOptionToMnemonic(MagickComposeOptions, cop);
1007
+ op = CommandOptionToMnemonic(MagickComposeOptions, composite_op);
1014
1008
  if (rm_strcasecmp("Unrecognized", op) == 0)
1015
1009
  {
1016
- rb_raise(rb_eArgError, "unknown composite operator (%d)", cop);
1010
+ rb_raise(rb_eArgError, "unknown composite operator (%d)", composite_op);
1017
1011
  }
1018
1012
 
1019
- Data_Get_Struct(self, Draw, draw);
1013
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1020
1014
 
1021
1015
  // Create a temp copy of the composite image
1022
1016
  rm_write_temp_image(comp_img, name, sizeof(name));
@@ -1024,7 +1018,7 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
1024
1018
  // Add the temp filename to the filename array.
1025
1019
  // Use Magick storage since we need to keep the list around
1026
1020
  // until destroy_Draw is called.
1027
- 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)));
1028
1022
  strcpy(tmpfile_name->name, name);
1029
1023
  tmpfile_name->next = draw->tmpfile_ary;
1030
1024
  draw->tmpfile_ary = tmpfile_name;
@@ -1061,7 +1055,7 @@ Draw_draw(VALUE self, VALUE image_arg)
1061
1055
  image_arg = rm_cur_image(image_arg);
1062
1056
  image = rm_check_frozen(image_arg);
1063
1057
 
1064
- Data_Get_Struct(self, Draw, draw);
1058
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1065
1059
  if (draw->primitives == 0)
1066
1060
  {
1067
1061
  rb_raise(rb_eArgError, "nothing to draw");
@@ -1072,10 +1066,11 @@ Draw_draw(VALUE self, VALUE image_arg)
1072
1066
 
1073
1067
  #if defined(IMAGEMAGICK_7)
1074
1068
  exception = AcquireExceptionInfo();
1075
- DrawImage(image, draw->info, exception);
1069
+ GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info, exception };
1076
1070
  #else
1077
- DrawImage(image, draw->info);
1071
+ GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info };
1078
1072
  #endif
1073
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(DrawImage), &args);
1079
1074
 
1080
1075
  magick_free(draw->info->primitive);
1081
1076
  draw->info->primitive = NULL;
@@ -1106,7 +1101,7 @@ Draw_dup(VALUE self)
1106
1101
 
1107
1102
  draw = ALLOC(Draw);
1108
1103
  memset(draw, 0, sizeof(Draw));
1109
- dup = Data_Wrap_Struct(CLASS_OF(self), mark_Draw, destroy_Draw, draw);
1104
+ dup = TypedData_Wrap_Struct(CLASS_OF(self), &rm_draw_data_type, draw);
1110
1105
  RB_GC_GUARD(dup);
1111
1106
 
1112
1107
  return rb_funcall(dup, rm_ID_initialize_copy, 1, self);
@@ -1136,7 +1131,7 @@ Draw_get_type_metrics(
1136
1131
  VALUE *argv,
1137
1132
  VALUE self)
1138
1133
  {
1139
- return get_type_metrics(argc, argv, self, GetTypeMetrics);
1134
+ return get_type_metrics(argc, argv, self, GVL_FUNC(GetTypeMetrics));
1140
1135
  }
1141
1136
 
1142
1137
 
@@ -1163,7 +1158,7 @@ Draw_get_multiline_type_metrics(
1163
1158
  VALUE *argv,
1164
1159
  VALUE self)
1165
1160
  {
1166
- return get_type_metrics(argc, argv, self, GetMultilineTypeMetrics);
1161
+ return get_type_metrics(argc, argv, self, GVL_FUNC(GetMultilineTypeMetrics));
1167
1162
  }
1168
1163
 
1169
1164
 
@@ -1177,8 +1172,8 @@ VALUE Draw_init_copy(VALUE self, VALUE orig)
1177
1172
  {
1178
1173
  Draw *copy, *original;
1179
1174
 
1180
- Data_Get_Struct(orig, Draw, original);
1181
- Data_Get_Struct(self, Draw, copy);
1175
+ TypedData_Get_Struct(orig, Draw, &rm_draw_data_type, original);
1176
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, copy);
1182
1177
 
1183
1178
  copy->info = CloneDrawInfo(NULL, original->info);
1184
1179
  if (!copy->info)
@@ -1206,10 +1201,10 @@ Draw_initialize(VALUE self)
1206
1201
  Draw *draw, *draw_options;
1207
1202
  VALUE options;
1208
1203
 
1209
- Data_Get_Struct(self, Draw, draw);
1204
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1210
1205
 
1211
1206
  options = new_DrawOptions();
1212
- Data_Get_Struct(options, Draw, draw_options);
1207
+ TypedData_Get_Struct(options, Draw, &rm_draw_data_type, draw_options);
1213
1208
  draw->info = draw_options->info;
1214
1209
  draw_options->info = NULL;
1215
1210
 
@@ -1230,7 +1225,7 @@ Draw_inspect(VALUE self)
1230
1225
  {
1231
1226
  Draw *draw;
1232
1227
 
1233
- Data_Get_Struct(self, Draw, draw);
1228
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1234
1229
  return draw->primitives ? draw->primitives : rb_str_new2("(no primitives defined)");
1235
1230
  }
1236
1231
 
@@ -1240,14 +1235,14 @@ Draw_inspect(VALUE self)
1240
1235
  *
1241
1236
  * @return [Magick::Draw] a new Draw object
1242
1237
  */
1243
- VALUE Draw_alloc(VALUE class)
1238
+ VALUE Draw_alloc(VALUE klass)
1244
1239
  {
1245
1240
  Draw *draw;
1246
1241
  VALUE draw_obj;
1247
1242
 
1248
1243
  draw = ALLOC(Draw);
1249
1244
  memset(draw, 0, sizeof(Draw));
1250
- draw_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw);
1245
+ draw_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw);
1251
1246
 
1252
1247
  RB_GC_GUARD(draw_obj);
1253
1248
 
@@ -1267,7 +1262,7 @@ Draw_primitive(VALUE self, VALUE primitive)
1267
1262
  Draw *draw;
1268
1263
 
1269
1264
  rb_check_frozen(self);
1270
- Data_Get_Struct(self, Draw, draw);
1265
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1271
1266
 
1272
1267
  if (draw->primitives == (VALUE)0)
1273
1268
  {
@@ -1275,13 +1270,32 @@ Draw_primitive(VALUE self, VALUE primitive)
1275
1270
  }
1276
1271
  else
1277
1272
  {
1278
- draw->primitives = rb_str_concat(draw->primitives, rb_str_new2("\n"));
1273
+ draw->primitives = rb_str_plus(draw->primitives, rb_str_new2("\n"));
1279
1274
  draw->primitives = rb_str_concat(draw->primitives, primitive);
1280
1275
  }
1281
1276
 
1282
1277
  return self;
1283
1278
  }
1284
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
1285
1299
 
1286
1300
  /**
1287
1301
  * Mark referenced objects.
@@ -1291,13 +1305,17 @@ Draw_primitive(VALUE self, VALUE primitive)
1291
1305
  * @param drawptr pointer to a Draw object
1292
1306
  */
1293
1307
  static void
1294
- mark_Draw(void *drawptr)
1308
+ Draw_mark(void *drawptr)
1295
1309
  {
1296
1310
  Draw *draw = (Draw *)drawptr;
1297
1311
 
1298
1312
  if (draw->primitives != (VALUE)0)
1299
1313
  {
1314
+ #ifdef HAVE_RB_GC_MARK_MOVABLE
1315
+ rb_gc_mark_movable(draw->primitives);
1316
+ #else
1300
1317
  rb_gc_mark(draw->primitives);
1318
+ #endif
1301
1319
  }
1302
1320
  }
1303
1321
 
@@ -1310,7 +1328,7 @@ mark_Draw(void *drawptr)
1310
1328
  * @param drawptr pointer to a Draw object
1311
1329
  */
1312
1330
  static void
1313
- destroy_Draw(void *drawptr)
1331
+ Draw_destroy(void *drawptr)
1314
1332
  {
1315
1333
  Draw *draw = (Draw *)drawptr;
1316
1334
 
@@ -1334,6 +1352,18 @@ destroy_Draw(void *drawptr)
1334
1352
  xfree(drawptr);
1335
1353
  }
1336
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
+ }
1337
1367
 
1338
1368
  /**
1339
1369
  * Allocate & initialize a DrawOptions object.
@@ -1358,14 +1388,14 @@ new_DrawOptions(void)
1358
1388
  * @return [Magick::Image::DrawOptions] a new DrawOptions object
1359
1389
  */
1360
1390
  VALUE
1361
- DrawOptions_alloc(VALUE class)
1391
+ DrawOptions_alloc(VALUE klass)
1362
1392
  {
1363
1393
  Draw *draw_options;
1364
1394
  VALUE draw_options_obj;
1365
1395
 
1366
1396
  draw_options = ALLOC(Draw);
1367
1397
  memset(draw_options, 0, sizeof(Draw));
1368
- draw_options_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw_options);
1398
+ draw_options_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw_options);
1369
1399
 
1370
1400
  RB_GC_GUARD(draw_options_obj);
1371
1401
 
@@ -1383,27 +1413,16 @@ DrawOptions_initialize(VALUE self)
1383
1413
  {
1384
1414
  Draw *draw_options;
1385
1415
 
1386
- Data_Get_Struct(self, Draw, draw_options);
1416
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw_options);
1387
1417
  draw_options->info = AcquireDrawInfo();
1388
1418
  if (!draw_options->info)
1389
1419
  {
1390
1420
  rb_raise(rb_eNoMemError, "not enough memory to continue");
1391
1421
  }
1392
1422
 
1393
- GetDrawInfo(NULL, draw_options->info);
1394
-
1395
1423
  if (rb_block_given_p())
1396
1424
  {
1397
- if (rb_proc_arity(rb_block_proc()) == 0)
1398
- {
1399
- // Run the block in self's context
1400
- rb_warn("passing a block without an image argument is deprecated");
1401
- rb_obj_instance_eval(0, NULL, self);
1402
- }
1403
- else
1404
- {
1405
- rb_yield(self);
1406
- }
1425
+ rb_yield(self);
1407
1426
  }
1408
1427
 
1409
1428
  return self;
@@ -1414,12 +1433,12 @@ DrawOptions_initialize(VALUE self)
1414
1433
  * Allocate a new Magick::Image::PolaroidOptions object.
1415
1434
  *
1416
1435
  * - Internally a PolaroidOptions object is the same as a Draw object. The
1417
- * methods are implemented by Draw methods in rmdraw.c.
1436
+ * methods are implemented by Draw methods in rmdraw.cpp.
1418
1437
  *
1419
1438
  * @return [Magick::Image::PolaroidOptions] a new PolaroidOptions object
1420
1439
  */
1421
1440
  VALUE
1422
- PolaroidOptions_alloc(VALUE class)
1441
+ PolaroidOptions_alloc(VALUE klass)
1423
1442
  {
1424
1443
  VALUE polaroid_obj;
1425
1444
  ImageInfo *image_info;
@@ -1433,7 +1452,7 @@ PolaroidOptions_alloc(VALUE class)
1433
1452
  draw->info = CloneDrawInfo(image_info, (DrawInfo *) NULL);
1434
1453
  (void) DestroyImageInfo(image_info);
1435
1454
 
1436
- polaroid_obj = Data_Wrap_Struct(class, NULL, destroy_Draw, draw);
1455
+ polaroid_obj = TypedData_Wrap_Struct(klass, &rm_draw_data_type, draw);
1437
1456
 
1438
1457
  RB_GC_GUARD(polaroid_obj);
1439
1458
 
@@ -1444,8 +1463,8 @@ PolaroidOptions_alloc(VALUE class)
1444
1463
  /**
1445
1464
  * Initialize a PolaroidOptions object.
1446
1465
  *
1447
- * @yield [self]
1448
- * @yieldparam self [Magick::Image::PolaroidOptions] self
1466
+ * @yield [opt]
1467
+ * @yieldparam opt [Magick::Image::PolaroidOptions] self
1449
1468
  * @return [Magick::Image::PolaroidOptions] self
1450
1469
  */
1451
1470
  VALUE
@@ -1455,7 +1474,7 @@ PolaroidOptions_initialize(VALUE self)
1455
1474
  ExceptionInfo *exception;
1456
1475
 
1457
1476
  // Default shadow color
1458
- Data_Get_Struct(self, Draw, draw);
1477
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1459
1478
 
1460
1479
  exception = AcquireExceptionInfo();
1461
1480
  QueryColorCompliance("gray75", AllCompliance, &draw->shadow_color, exception);
@@ -1466,16 +1485,7 @@ PolaroidOptions_initialize(VALUE self)
1466
1485
 
1467
1486
  if (rb_block_given_p())
1468
1487
  {
1469
- if (rb_proc_arity(rb_block_proc()) == 0)
1470
- {
1471
- // Run the block in self's context
1472
- rb_warn("passing a block without an image argument is deprecated");
1473
- rb_obj_instance_eval(0, NULL, self);
1474
- }
1475
- else
1476
- {
1477
- rb_yield(self);
1478
- }
1488
+ rb_yield(self);
1479
1489
  }
1480
1490
 
1481
1491
  return self;
@@ -1508,7 +1518,7 @@ PolaroidOptions_shadow_color_eq(VALUE self, VALUE shadow)
1508
1518
  Draw *draw;
1509
1519
 
1510
1520
  rb_check_frozen(self);
1511
- Data_Get_Struct(self, Draw, draw);
1521
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1512
1522
  Color_to_PixelColor(&draw->shadow_color, shadow);
1513
1523
  return shadow;
1514
1524
  }
@@ -1526,7 +1536,7 @@ PolaroidOptions_border_color_eq(VALUE self, VALUE border)
1526
1536
  Draw *draw;
1527
1537
 
1528
1538
  rb_check_frozen(self);
1529
- Data_Get_Struct(self, Draw, draw);
1539
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1530
1540
  Color_to_PixelColor(&draw->info->border_color, border);
1531
1541
  return border;
1532
1542
  }
@@ -1575,6 +1585,9 @@ get_dummy_tm_img(VALUE klass)
1575
1585
  }
1576
1586
 
1577
1587
 
1588
+ // aliases for common use of structure types; GetMultilineTypeMetrics, GetTypeMetrics
1589
+ typedef GVL_STRUCT_TYPE(GetTypeMetrics) GVL_STRUCT_TYPE(get_type_metrics);
1590
+
1578
1591
  /**
1579
1592
  * Call a get-type-metrics function.
1580
1593
  *
@@ -1592,19 +1605,15 @@ get_dummy_tm_img(VALUE klass)
1592
1605
  * @see Draw_get_multiline_type_metrics
1593
1606
  */
1594
1607
  static VALUE
1595
- get_type_metrics(
1596
- int argc,
1597
- VALUE *argv,
1598
- VALUE self,
1599
- get_type_metrics_func_t getter)
1608
+ get_type_metrics(int argc, VALUE *argv, VALUE self, gvl_function_t fp)
1600
1609
  {
1601
1610
  Image *image;
1602
1611
  Draw *draw;
1603
1612
  VALUE t;
1604
1613
  TypeMetric metrics;
1605
1614
  char *text = NULL;
1606
- long text_l;
1607
- unsigned int okay;
1615
+ size_t text_l;
1616
+ MagickBooleanType okay;
1608
1617
  #if defined(IMAGEMAGICK_7)
1609
1618
  ExceptionInfo *exception;
1610
1619
  #endif
@@ -1613,7 +1622,7 @@ get_type_metrics(
1613
1622
  {
1614
1623
  case 1: // use default image
1615
1624
  text = rm_str2cstr(argv[0], &text_l);
1616
- Data_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, image);
1625
+ TypedData_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, &rm_image_data_type, image);
1617
1626
  break;
1618
1627
  case 2:
1619
1628
  t = rm_cur_image(argv[0]);
@@ -1630,7 +1639,7 @@ get_type_metrics(
1630
1639
  rb_raise(rb_eArgError, "no text to measure");
1631
1640
  }
1632
1641
 
1633
- Data_Get_Struct(self, Draw, draw);
1642
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1634
1643
  #if defined(IMAGEMAGICK_7)
1635
1644
  exception = AcquireExceptionInfo();
1636
1645
  draw->info->text = InterpretImageProperties(NULL, image, text, exception);
@@ -1654,10 +1663,12 @@ get_type_metrics(
1654
1663
  }
1655
1664
 
1656
1665
  #if defined(IMAGEMAGICK_7)
1657
- okay = (*getter)(image, draw->info, &metrics, exception);
1666
+ GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics, exception };
1658
1667
  #else
1659
- okay = (*getter)(image, draw->info, &metrics);
1668
+ GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics };
1660
1669
  #endif
1670
+ void *ret = CALL_FUNC_WITHOUT_GVL(fp, &args);
1671
+ okay = static_cast<MagickBooleanType>(reinterpret_cast<intptr_t &>(ret));
1661
1672
 
1662
1673
  magick_free(draw->info->text);
1663
1674
  draw->info->text = NULL;