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,8 +5,8 @@
5
5
  *
6
6
  * Changes since Nov. 2009 copyright © by Benjamin Thomas and Omer Bar-or
7
7
  *
8
- * @file rmenum.c
9
- * @version $Id: rmenum.c,v 1.9 2009/12/20 02:33:33 baror Exp $
8
+ * @file rmenum.cpp
9
+ * @version $Id: rmenum.cpp,v 1.9 2009/12/20 02:33:33 baror Exp $
10
10
  * @author Tim Hunter
11
11
  ******************************************************************************/
12
12
 
@@ -18,9 +18,15 @@
18
18
 
19
19
  static VALUE Enum_type_values(VALUE);
20
20
  static VALUE Enum_type_inspect(VALUE);
21
+ static void rm_enum_free(void *magick_enum);
22
+ static size_t rm_enum_memsize(const void *magick_enum);
21
23
 
22
-
23
-
24
+ const rb_data_type_t rm_enum_data_type = {
25
+ "Magick::Enum",
26
+ { NULL, rm_enum_free, rm_enum_memsize, },
27
+ 0, 0,
28
+ RUBY_TYPED_FROZEN_SHAREABLE,
29
+ };
24
30
 
25
31
 
26
32
  /**
@@ -34,14 +40,14 @@ static VALUE Enum_type_inspect(VALUE);
34
40
  VALUE
35
41
  rm_define_enum_type(const char *tag)
36
42
  {
37
- VALUE class;
43
+ VALUE klass;
38
44
 
39
- class = rb_define_class_under(Module_Magick, tag, Class_Enum);\
45
+ klass = rb_define_class_under(Module_Magick, tag, Class_Enum);\
40
46
 
41
- rb_define_singleton_method(class, "values", Enum_type_values, 0);
42
- rb_define_method(class, "initialize", Enum_type_initialize, 2);
43
- rb_define_method(class, "inspect", Enum_type_inspect, 0);
44
- return class;
47
+ rb_define_singleton_method(klass, "values", RUBY_METHOD_FUNC(Enum_type_values), 0);
48
+ rb_define_method(klass, "initialize", RUBY_METHOD_FUNC(Enum_type_initialize), 2);
49
+ rb_define_method(klass, "inspect", RUBY_METHOD_FUNC(Enum_type_inspect), 0);
50
+ return klass;
45
51
  }
46
52
 
47
53
 
@@ -50,19 +56,19 @@ rm_define_enum_type(const char *tag)
50
56
  *
51
57
  * No Ruby usage (internal function)
52
58
  *
53
- * @param class the subclass
59
+ * @param klass the subclass
54
60
  * @param sym the symbol
55
61
  * @param val the value for the symbol
56
62
  * @return a new instance of class
57
63
  */
58
64
  VALUE
59
- rm_enum_new(VALUE class, VALUE sym, VALUE val)
65
+ rm_enum_new(VALUE klass, VALUE sym, VALUE val)
60
66
  {
61
67
  VALUE argv[2];
62
68
 
63
69
  argv[0] = sym;
64
70
  argv[1] = val;
65
- return rb_obj_freeze(rb_class_new_instance(2, argv, class));
71
+ return rb_obj_freeze(rb_class_new_instance(2, argv, klass));
66
72
  }
67
73
 
68
74
  /**
@@ -78,7 +84,7 @@ rm_enum_to_cstr(VALUE enum_type)
78
84
  {
79
85
  MagickEnum *magick_enum;
80
86
 
81
- Data_Get_Struct(enum_type, MagickEnum, magick_enum);
87
+ TypedData_Get_Struct(enum_type, MagickEnum, &rm_enum_data_type, magick_enum);
82
88
  return rb_id2name(magick_enum->id);
83
89
  }
84
90
 
@@ -93,18 +99,31 @@ static void rm_enum_free(void *magick_enum)
93
99
  {
94
100
  xfree(magick_enum);
95
101
  }
102
+
103
+ /**
104
+ * Get Enum object size.
105
+ *
106
+ * No Ruby usage (internal function)
107
+ *
108
+ * @param magick_enum the enum
109
+ */
110
+ static size_t rm_enum_memsize(const void *magick_enum)
111
+ {
112
+ return sizeof(MagickEnum);
113
+ }
114
+
96
115
  /**
97
116
  * Enum class alloc function.
98
117
  *
99
118
  * @return [Magick::Enum] a new enumerator
100
119
  */
101
120
  VALUE
102
- Enum_alloc(VALUE class)
121
+ Enum_alloc(VALUE klass)
103
122
  {
104
123
  MagickEnum *magick_enum;
105
124
  VALUE enumr;
106
125
 
107
- enumr = Data_Make_Struct(class, MagickEnum, NULL, rm_enum_free, magick_enum);
126
+ enumr = TypedData_Make_Struct(klass, MagickEnum, &rm_enum_data_type, magick_enum);
108
127
  rb_obj_freeze(enumr);
109
128
 
110
129
  return enumr;
@@ -122,11 +141,11 @@ Enum_case_eq(VALUE self, VALUE other)
122
141
  {
123
142
  if (CLASS_OF(self) == CLASS_OF(other))
124
143
  {
125
- MagickEnum *this, *that;
144
+ MagickEnum *self_enum, *other_enum;
126
145
 
127
- Data_Get_Struct(self, MagickEnum, this);
128
- Data_Get_Struct(other, MagickEnum, that);
129
- return this->val == that->val ? Qtrue : Qfalse;
146
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, self_enum);
147
+ TypedData_Get_Struct(other, MagickEnum, &rm_enum_data_type, other_enum);
148
+ return self_enum->val == other_enum->val ? Qtrue : Qfalse;
130
149
  }
131
150
 
132
151
  return Qfalse;
@@ -145,7 +164,7 @@ Enum_initialize(VALUE self, VALUE sym, VALUE val)
145
164
  {
146
165
  MagickEnum *magick_enum;
147
166
 
148
- Data_Get_Struct(self, MagickEnum, magick_enum);
167
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, magick_enum);
149
168
  magick_enum->id = rb_to_id(sym); /* convert symbol to ID */
150
169
  magick_enum->val = NUM2INT(val);
151
170
 
@@ -163,7 +182,7 @@ Enum_to_i(VALUE self)
163
182
  {
164
183
  MagickEnum *magick_enum;
165
184
 
166
- Data_Get_Struct(self, MagickEnum, magick_enum);
185
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, magick_enum);
167
186
  return INT2NUM(magick_enum->val);
168
187
  }
169
188
 
@@ -177,20 +196,20 @@ Enum_to_i(VALUE self)
177
196
  VALUE
178
197
  Enum_spaceship(VALUE self, VALUE other)
179
198
  {
180
- MagickEnum *this, *that;
199
+ MagickEnum *self_enum, *other_enum;
181
200
 
182
201
  if(CLASS_OF(self) != CLASS_OF(other)) {
183
202
  return Qnil;
184
203
  }
185
204
 
186
- Data_Get_Struct(self, MagickEnum, this);
187
- Data_Get_Struct(other, MagickEnum, that);
205
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, self_enum);
206
+ TypedData_Get_Struct(other, MagickEnum, &rm_enum_data_type, other_enum);
188
207
 
189
- if (this->val > that->val)
208
+ if (self_enum->val > other_enum->val)
190
209
  {
191
210
  return INT2FIX(1);
192
211
  }
193
- else if (this->val < that->val)
212
+ else if (self_enum->val < other_enum->val)
194
213
  {
195
214
  return INT2FIX(-1);
196
215
  }
@@ -205,25 +224,25 @@ Enum_spaceship(VALUE self, VALUE other)
205
224
  * @return [Magick::Enum] new Enum instance
206
225
  */
207
226
  VALUE
208
- Enum_bitwise_or(VALUE self, VALUE another)
227
+ Enum_bitwise_or(VALUE self, VALUE other)
209
228
  {
210
- VALUE new_enum, cls;
211
- MagickEnum *this, *that, *new_enum_data;
229
+ VALUE new_enum, klass;
230
+ MagickEnum *self_enum, *other_enum, *new_enum_data;
212
231
 
213
- cls = CLASS_OF(self);
214
- if (CLASS_OF(another) != cls)
232
+ klass = CLASS_OF(self);
233
+ if (CLASS_OF(other) != klass)
215
234
  {
216
- rb_raise(rb_eArgError, "Expected class %s but got %s", rb_class2name(cls), rb_class2name(CLASS_OF(another)));
235
+ rb_raise(rb_eArgError, "Expected class %s but got %s", rb_class2name(klass), rb_class2name(CLASS_OF(other)));
217
236
  }
218
237
 
219
- new_enum = Enum_alloc(cls);
238
+ new_enum = Enum_alloc(klass);
220
239
 
221
- Data_Get_Struct(self, MagickEnum, this);
222
- Data_Get_Struct(another, MagickEnum, that);
223
- Data_Get_Struct(new_enum, MagickEnum, new_enum_data);
240
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, self_enum);
241
+ TypedData_Get_Struct(other, MagickEnum, &rm_enum_data_type, other_enum);
242
+ TypedData_Get_Struct(new_enum, MagickEnum, &rm_enum_data_type, new_enum_data);
224
243
 
225
- new_enum_data->id = rb_to_id(rb_sprintf("%s|%s", rb_id2name(this->id), rb_id2name(that->id)));
226
- new_enum_data->val = this->val | that->val;
244
+ new_enum_data->id = rb_to_id(rb_sprintf("%s|%s", rb_id2name(self_enum->id), rb_id2name(other_enum->id)));
245
+ new_enum_data->val = self_enum->val | other_enum->val;
227
246
 
228
247
  return new_enum;
229
248
  }
@@ -282,7 +301,7 @@ Enum_type_inspect(VALUE self)
282
301
  char str[100];
283
302
  MagickEnum *magick_enum;
284
303
 
285
- Data_Get_Struct(self, MagickEnum, magick_enum);
304
+ TypedData_Get_Struct(self, MagickEnum, &rm_enum_data_type, magick_enum);
286
305
  snprintf(str, sizeof(str), "%.48s=%d", rb_id2name(magick_enum->id), magick_enum->val);
287
306
 
288
307
  return rb_str_new2(str);
@@ -302,13 +321,13 @@ Enum_type_inspect(VALUE self)
302
321
  * @return [Magick::Enum] self
303
322
  */
304
323
  static VALUE
305
- Enum_type_values(VALUE class)
324
+ Enum_type_values(VALUE klass)
306
325
  {
307
326
  VALUE enumerators, copy;
308
327
  VALUE rv;
309
328
  int x;
310
329
 
311
- enumerators = rb_cv_get(class, ENUMERATORS_CLASS_VAR);
330
+ enumerators = rb_cv_get(klass, ENUMERATORS_CLASS_VAR);
312
331
 
313
332
  if (rb_block_given_p())
314
333
  {
@@ -316,7 +335,7 @@ Enum_type_values(VALUE class)
316
335
  {
317
336
  rb_yield(rb_ary_entry(enumerators, x));
318
337
  }
319
- rv = class;
338
+ rv = klass;
320
339
  }
321
340
  else
322
341
  {
@@ -341,25 +360,25 @@ Enum_type_values(VALUE class)
341
360
  *
342
361
  * No Ruby usage (internal function)
343
362
  *
344
- * @param class the class type
363
+ * @param klass the class type
345
364
  * @param value the value for enum
346
365
  * @return a enumerator
347
366
  */
348
367
 
349
368
  VALUE
350
- Enum_find(VALUE class, int val)
369
+ Enum_find(VALUE klass, int val)
351
370
  {
352
371
  VALUE enumerators;
353
372
  MagickEnum *magick_enum;
354
373
  int x;
355
374
 
356
- enumerators = rb_cv_get(class, ENUMERATORS_CLASS_VAR);
375
+ enumerators = rb_cv_get(klass, ENUMERATORS_CLASS_VAR);
357
376
  enumerators = rm_check_ary_type(enumerators);
358
377
 
359
378
  for (x = 0; x < RARRAY_LEN(enumerators); x++)
360
379
  {
361
380
  VALUE enumerator = rb_ary_entry(enumerators, x);
362
- Data_Get_Struct(enumerator, MagickEnum, magick_enum);
381
+ TypedData_Get_Struct(enumerator, MagickEnum, &rm_enum_data_type, magick_enum);
363
382
  if (magick_enum->val == val)
364
383
  {
365
384
  return enumerator;
@@ -379,9 +398,9 @@ Enum_find(VALUE class, int val)
379
398
  * @return a new enumerator
380
399
  */
381
400
  VALUE
382
- ClassType_find(ClassType cls)
401
+ ClassType_find(ClassType klass)
383
402
  {
384
- return Enum_find(Class_ClassType, cls);
403
+ return Enum_find(Class_ClassType, klass);
385
404
  }
386
405
 
387
406
 
@@ -466,7 +485,7 @@ ComplianceType_find(ComplianceType compliance)
466
485
  if ((compliance & (SVGCompliance|X11Compliance|XPMCompliance))
467
486
  == (SVGCompliance|X11Compliance|XPMCompliance))
468
487
  {
469
- c = SVGCompliance|X11Compliance|XPMCompliance;
488
+ c = (ComplianceType)(SVGCompliance|X11Compliance|XPMCompliance);
470
489
  }
471
490
  else if (compliance & SVGCompliance)
472
491
  {
@@ -5,13 +5,18 @@
5
5
  *
6
6
  * Changes since Nov. 2009 copyright &copy; by Benjamin Thomas and Omer Bar-or
7
7
  *
8
- * @file rmfill.c
9
- * @version $Id: rmfill.c,v 1.33 2009/12/20 02:33:33 baror Exp $
8
+ * @file rmfill.cpp
9
+ * @version $Id: rmfill.cpp,v 1.33 2009/12/20 02:33:33 baror Exp $
10
10
  * @author Tim Hunter
11
11
  ******************************************************************************/
12
12
 
13
13
  #include "rmagick.h"
14
14
 
15
+ static void GradientFill_free(void *fill);
16
+ static size_t GradientFill_memsize(const void *ptr);
17
+ static void TextureFill_free(void *fill_obj);
18
+ static size_t TextureFill_memsize(const void *ptr);
19
+
15
20
  /** Data associated with a GradientFill */
16
21
  typedef struct
17
22
  {
@@ -29,29 +34,63 @@ typedef struct
29
34
  Image *texture; /**< the texture */
30
35
  } rm_TextureFill;
31
36
 
37
+ const rb_data_type_t rm_gradient_fill_data_type = {
38
+ "Magick::GradientFill",
39
+ { NULL, GradientFill_free, GradientFill_memsize, },
40
+ 0, 0,
41
+ RUBY_TYPED_FROZEN_SHAREABLE,
42
+ };
43
+
44
+ const rb_data_type_t rm_texture_fill_data_type = {
45
+ "Magick::TextureFill",
46
+ { NULL, TextureFill_free, TextureFill_memsize, },
47
+ 0, 0,
48
+ RUBY_TYPED_FROZEN_SHAREABLE,
49
+ };
50
+
51
+
52
+ DEFINE_GVL_STUB2(SyncAuthenticPixels, Image *, ExceptionInfo *);
53
+
54
+
32
55
  /**
33
- * Free Fill or Fill subclass object (except for TextureFill).
56
+ * Free GradientFill or GradientFill subclass object (except for TextureFill).
34
57
  *
35
58
  * No Ruby usage (internal function)
36
59
  *
37
60
  * @param fill the fill
38
61
  */
39
- static void free_Fill(void *fill)
62
+ static void
63
+ GradientFill_free(void *fill)
40
64
  {
41
65
  xfree(fill);
42
66
  }
43
67
 
68
+
69
+ /**
70
+ * Get GradientFill object size.
71
+ *
72
+ * No Ruby usage (internal function)
73
+ *
74
+ * @param ptr pointer to the GradientFill object
75
+ */
76
+ static size_t
77
+ GradientFill_memsize(const void *ptr)
78
+ {
79
+ return sizeof(rm_GradientFill);
80
+ }
81
+
82
+
44
83
  /**
45
84
  * Create new GradientFill object.
46
85
  *
47
86
  * @return [Magick::GradientFill] a new GradientFill object
48
87
  */
49
88
  VALUE
50
- GradientFill_alloc(VALUE class)
89
+ GradientFill_alloc(VALUE klass)
51
90
  {
52
91
  rm_GradientFill *fill;
53
92
 
54
- return Data_Make_Struct(class, rm_GradientFill, NULL, free_Fill, fill);
93
+ return TypedData_Make_Struct(klass, rm_GradientFill, &rm_gradient_fill_data_type, fill);
55
94
  }
56
95
 
57
96
 
@@ -78,7 +117,7 @@ GradientFill_initialize(
78
117
  {
79
118
  rm_GradientFill *fill;
80
119
 
81
- Data_Get_Struct(self, rm_GradientFill, fill);
120
+ TypedData_Get_Struct(self, rm_GradientFill, &rm_gradient_fill_data_type, fill);
82
121
 
83
122
  fill->x1 = NUM2DBL(x1);
84
123
  fill->y1 = NUM2DBL(y1);
@@ -153,7 +192,8 @@ point_fill(
153
192
  #endif
154
193
  }
155
194
 
156
- SyncAuthenticPixels(image, exception);
195
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
196
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
157
197
  CHECK_EXCEPTION();
158
198
  }
159
199
 
@@ -222,7 +262,8 @@ vertical_fill(
222
262
  row_pixels += GetPixelChannels(image);
223
263
  }
224
264
 
225
- SyncAuthenticPixels(image, exception);
265
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
266
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
226
267
  CHECK_EXCEPTION();
227
268
  }
228
269
 
@@ -255,7 +296,8 @@ vertical_fill(
255
296
 
256
297
  memcpy(row_pixels, master, image->columns * sizeof(PixelPacket));
257
298
 
258
- SyncAuthenticPixels(image, exception);
299
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
300
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
259
301
  if (rm_should_raise_exception(exception, RetainExceptionRetention))
260
302
  {
261
303
  xfree((void *)master);
@@ -328,7 +370,8 @@ horizontal_fill(
328
370
  row_pixels += GetPixelChannels(image);
329
371
  }
330
372
 
331
- SyncAuthenticPixels(image, exception);
373
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
374
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
332
375
  CHECK_EXCEPTION();
333
376
  }
334
377
 
@@ -360,7 +403,8 @@ horizontal_fill(
360
403
 
361
404
  memcpy(col_pixels, master, image->rows * sizeof(PixelPacket));
362
405
 
363
- SyncAuthenticPixels(image, exception);
406
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
407
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
364
408
  if (rm_should_raise_exception(exception, RetainExceptionRetention))
365
409
  {
366
410
  xfree((void *)master);
@@ -471,7 +515,8 @@ v_diagonal_fill(
471
515
  #endif
472
516
  }
473
517
 
474
- SyncAuthenticPixels(image, exception);
518
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
519
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
475
520
  CHECK_EXCEPTION();
476
521
  }
477
522
 
@@ -577,7 +622,8 @@ h_diagonal_fill(
577
622
  #endif
578
623
  }
579
624
 
580
- SyncAuthenticPixels(image, exception);
625
+ GVL_STRUCT_TYPE(SyncAuthenticPixels) args = { image, exception };
626
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(SyncAuthenticPixels), &args);
581
627
  CHECK_EXCEPTION();
582
628
  }
583
629
 
@@ -588,7 +634,7 @@ h_diagonal_fill(
588
634
  * Call GradientFill with the start and stop colors specified when this fill
589
635
  * object was created.
590
636
  *
591
- * @param image_obj [Magick::Image] the image to fill
637
+ * @param image_obj [Magick::Image, Magick::ImageList] the image to fill
592
638
  * @return [Magick::GradientFill] self
593
639
  */
594
640
  VALUE
@@ -599,8 +645,8 @@ GradientFill_fill(VALUE self, VALUE image_obj)
599
645
  PixelColor start_color, stop_color;
600
646
  double x1, y1, x2, y2; // points on the line
601
647
 
602
- Data_Get_Struct(self, rm_GradientFill, fill);
603
- image = rm_check_destroyed(image_obj);
648
+ TypedData_Get_Struct(self, rm_GradientFill, &rm_gradient_fill_data_type, fill);
649
+ image = rm_check_destroyed(rm_cur_image(image_obj));
604
650
 
605
651
  x1 = fill->x1;
606
652
  y1 = fill->y1;
@@ -662,7 +708,7 @@ GradientFill_fill(VALUE self, VALUE image_obj)
662
708
  * @param fill_obj the TextureFill
663
709
  */
664
710
  static void
665
- free_TextureFill(void *fill_obj)
711
+ TextureFill_free(void *fill_obj)
666
712
  {
667
713
  rm_TextureFill *fill = (rm_TextureFill *)fill_obj;
668
714
 
@@ -674,16 +720,31 @@ free_TextureFill(void *fill_obj)
674
720
  xfree(fill);
675
721
  }
676
722
 
723
+
724
+ /**
725
+ * Get TextureFill object size.
726
+ *
727
+ * No Ruby usage (internal function)
728
+ *
729
+ * @param ptr pointer to the TextureFill object
730
+ */
731
+ static size_t
732
+ TextureFill_memsize(const void *ptr)
733
+ {
734
+ return sizeof(rm_TextureFill);
735
+ }
736
+
737
+
677
738
  /**
678
739
  * Create new TextureFill object.
679
740
  *
680
741
  * @return [Magick::TextureFill] a new TextureFill object
681
742
  */
682
743
  VALUE
683
- TextureFill_alloc(VALUE class)
744
+ TextureFill_alloc(VALUE klass)
684
745
  {
685
746
  rm_TextureFill *fill;
686
- return Data_Make_Struct(class, rm_TextureFill, NULL, free_TextureFill, fill);
747
+ return TypedData_Make_Struct(klass, rm_TextureFill, &rm_texture_fill_data_type, fill);
687
748
  }
688
749
 
689
750
  /**
@@ -700,7 +761,7 @@ TextureFill_initialize(VALUE self, VALUE texture_arg)
700
761
  Image *texture;
701
762
  VALUE texture_image;
702
763
 
703
- Data_Get_Struct(self, rm_TextureFill, fill);
764
+ TypedData_Get_Struct(self, rm_TextureFill, &rm_texture_fill_data_type, fill);
704
765
 
705
766
  texture_image = rm_cur_image(texture_arg);
706
767
 
@@ -719,7 +780,7 @@ TextureFill_initialize(VALUE self, VALUE texture_arg)
719
780
  * Call TextureFill with the texture specified when this fill object was
720
781
  * created.
721
782
  *
722
- * @param image_obj [Magick::Image] the image to fill
783
+ * @param image_obj [Magick::Image, Magick::ImageList] the image to fill
723
784
  * @return [Magick::TextureFill] self
724
785
  */
725
786
  VALUE
@@ -731,8 +792,8 @@ TextureFill_fill(VALUE self, VALUE image_obj)
731
792
  ExceptionInfo *exception;
732
793
  #endif
733
794
 
734
- image = rm_check_destroyed(image_obj);
735
- Data_Get_Struct(self, rm_TextureFill, fill);
795
+ image = rm_check_destroyed(rm_cur_image(image_obj));
796
+ TypedData_Get_Struct(self, rm_TextureFill, &rm_texture_fill_data_type, fill);
736
797
 
737
798
  #if defined(IMAGEMAGICK_7)
738
799
  exception = AcquireExceptionInfo();