rmagick 4.3.0 → 5.1.0

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of rmagick might be problematic. Click here for more details.

data/ext/RMagick/rmdraw.c CHANGED
@@ -13,17 +13,33 @@
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
+ static void Draw_mark(void *);
17
+ static void Draw_destroy(void *);
18
+ static size_t Draw_memsize(const void *);
18
19
  static VALUE new_DrawOptions(void);
20
+ static VALUE get_type_metrics(int, VALUE *, VALUE, gvl_function_t);
19
21
 
20
- /** Method that gets type metrics */
22
+ const rb_data_type_t rm_draw_data_type = {
23
+ "Magick::Draw",
24
+ { Draw_mark, Draw_destroy, Draw_memsize, },
25
+ 0, 0,
26
+ RUBY_TYPED_FROZEN_SHAREABLE,
27
+ };
28
+
29
+
30
+ DEFINE_GVL_STUB4(BlobToImage, const ImageInfo *, const void *, const size_t, ExceptionInfo *);
31
+ DEFINE_GVL_STUB4(ImageToBlob, const ImageInfo *, Image *, size_t *, ExceptionInfo *);
21
32
  #if defined(IMAGEMAGICK_7)
22
- typedef MagickBooleanType (get_type_metrics_func_t)(Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
33
+ DEFINE_GVL_STUB3(AnnotateImage, Image *, const DrawInfo *, ExceptionInfo *);
34
+ DEFINE_GVL_STUB3(DrawImage, Image *, const DrawInfo *, ExceptionInfo *);
35
+ DEFINE_GVL_STUB4(GetMultilineTypeMetrics, Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
36
+ DEFINE_GVL_STUB4(GetTypeMetrics, Image *, const DrawInfo *, TypeMetric *, ExceptionInfo *);
23
37
  #else
24
- typedef MagickBooleanType (get_type_metrics_func_t)(Image *, const DrawInfo *, TypeMetric *);
38
+ DEFINE_GVL_STUB2(AnnotateImage, Image *, const DrawInfo *);
39
+ DEFINE_GVL_STUB2(DrawImage, Image *, const DrawInfo *);
40
+ DEFINE_GVL_STUB3(GetMultilineTypeMetrics, Image *, const DrawInfo *, TypeMetric *);
41
+ DEFINE_GVL_STUB3(GetTypeMetrics, Image *, const DrawInfo *, TypeMetric *);
25
42
  #endif
26
- static VALUE get_type_metrics(int, VALUE *, VALUE, get_type_metrics_func_t);
27
43
 
28
44
 
29
45
  /**
@@ -38,7 +54,7 @@ Draw_affine_eq(VALUE self, VALUE matrix)
38
54
  Draw *draw;
39
55
 
40
56
  rb_check_frozen(self);
41
- Data_Get_Struct(self, Draw, draw);
57
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
42
58
  Export_AffineMatrix(&draw->info->affine, matrix);
43
59
  return matrix;
44
60
  }
@@ -56,7 +72,7 @@ Draw_align_eq(VALUE self, VALUE align)
56
72
  Draw *draw;
57
73
 
58
74
  rb_check_frozen(self);
59
- Data_Get_Struct(self, Draw, draw);
75
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
60
76
  VALUE_TO_ENUM(align, draw->info->align, AlignType);
61
77
  return align;
62
78
  }
@@ -74,7 +90,7 @@ Draw_decorate_eq(VALUE self, VALUE decorate)
74
90
  Draw *draw;
75
91
 
76
92
  rb_check_frozen(self);
77
- Data_Get_Struct(self, Draw, draw);
93
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
78
94
  VALUE_TO_ENUM(decorate, draw->info->decorate, DecorationType);
79
95
  return decorate;
80
96
  }
@@ -92,7 +108,7 @@ Draw_density_eq(VALUE self, VALUE density)
92
108
  Draw *draw;
93
109
 
94
110
  rb_check_frozen(self);
95
- Data_Get_Struct(self, Draw, draw);
111
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
96
112
  magick_clone_string(&draw->info->density, StringValueCStr(density));
97
113
 
98
114
  return density;
@@ -111,7 +127,7 @@ Draw_encoding_eq(VALUE self, VALUE encoding)
111
127
  Draw *draw;
112
128
 
113
129
  rb_check_frozen(self);
114
- Data_Get_Struct(self, Draw, draw);
130
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
115
131
  magick_clone_string(&draw->info->encoding, StringValueCStr(encoding));
116
132
 
117
133
  return encoding;
@@ -130,7 +146,7 @@ Draw_fill_eq(VALUE self, VALUE fill)
130
146
  Draw *draw;
131
147
 
132
148
  rb_check_frozen(self);
133
- Data_Get_Struct(self, Draw, draw);
149
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
134
150
  Color_to_PixelColor(&draw->info->fill, fill);
135
151
  return fill;
136
152
  }
@@ -151,7 +167,7 @@ Draw_fill_pattern_eq(VALUE self, VALUE pattern)
151
167
  Draw *draw;
152
168
 
153
169
  rb_check_frozen(self);
154
- Data_Get_Struct(self, Draw, draw);
170
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
155
171
 
156
172
  if (draw->info->fill_pattern != NULL)
157
173
  {
@@ -186,7 +202,7 @@ Draw_font_eq(VALUE self, VALUE font)
186
202
  Draw *draw;
187
203
 
188
204
  rb_check_frozen(self);
189
- Data_Get_Struct(self, Draw, draw);
205
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
190
206
  magick_clone_string(&draw->info->font, StringValueCStr(font));
191
207
 
192
208
  return font;
@@ -205,7 +221,7 @@ Draw_font_family_eq(VALUE self, VALUE family)
205
221
  Draw *draw;
206
222
 
207
223
  rb_check_frozen(self);
208
- Data_Get_Struct(self, Draw, draw);
224
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
209
225
  magick_clone_string(&draw->info->family, StringValueCStr(family));
210
226
 
211
227
  return family;
@@ -224,7 +240,7 @@ Draw_font_stretch_eq(VALUE self, VALUE stretch)
224
240
  Draw *draw;
225
241
 
226
242
  rb_check_frozen(self);
227
- Data_Get_Struct(self, Draw, draw);
243
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
228
244
  VALUE_TO_ENUM(stretch, draw->info->stretch, StretchType);
229
245
  return stretch;
230
246
  }
@@ -242,7 +258,7 @@ Draw_font_style_eq(VALUE self, VALUE style)
242
258
  Draw *draw;
243
259
 
244
260
  rb_check_frozen(self);
245
- Data_Get_Struct(self, Draw, draw);
261
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
246
262
  VALUE_TO_ENUM(style, draw->info->style, StyleType);
247
263
  return style;
248
264
  }
@@ -262,7 +278,7 @@ Draw_font_weight_eq(VALUE self, VALUE weight)
262
278
  size_t w;
263
279
 
264
280
  rb_check_frozen(self);
265
- Data_Get_Struct(self, Draw, draw);
281
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
266
282
 
267
283
  if (FIXNUM_P(weight))
268
284
  {
@@ -328,7 +344,7 @@ Draw_gravity_eq(VALUE self, VALUE grav)
328
344
  Draw *draw;
329
345
 
330
346
  rb_check_frozen(self);
331
- Data_Get_Struct(self, Draw, draw);
347
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
332
348
  VALUE_TO_ENUM(grav, draw->info->gravity, GravityType);
333
349
 
334
350
  return grav;
@@ -347,7 +363,7 @@ Draw_kerning_eq(VALUE self, VALUE kerning)
347
363
  Draw *draw;
348
364
 
349
365
  rb_check_frozen(self);
350
- Data_Get_Struct(self, Draw, draw);
366
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
351
367
  draw->info->kerning = NUM2DBL(kerning);
352
368
  return kerning;
353
369
  }
@@ -365,7 +381,7 @@ Draw_interline_spacing_eq(VALUE self, VALUE spacing)
365
381
  Draw *draw;
366
382
 
367
383
  rb_check_frozen(self);
368
- Data_Get_Struct(self, Draw, draw);
384
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
369
385
  draw->info->interline_spacing = NUM2DBL(spacing);
370
386
  return spacing;
371
387
  }
@@ -383,7 +399,7 @@ Draw_interword_spacing_eq(VALUE self, VALUE spacing)
383
399
  Draw *draw;
384
400
 
385
401
  rb_check_frozen(self);
386
- Data_Get_Struct(self, Draw, draw);
402
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
387
403
  draw->info->interword_spacing = NUM2DBL(spacing);
388
404
  return spacing;
389
405
  }
@@ -415,7 +431,8 @@ image_to_str(Image *image)
415
431
 
416
432
  info = CloneImageInfo(NULL);
417
433
  exception = AcquireExceptionInfo();
418
- blob = ImageToBlob(info, image, &length, exception);
434
+ GVL_STRUCT_TYPE(ImageToBlob) args = { info, image, &length, exception };
435
+ blob = (unsigned char *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ImageToBlob), &args);
419
436
  DestroyImageInfo(info);
420
437
  CHECK_EXCEPTION();
421
438
  DestroyExceptionInfo(exception);
@@ -453,7 +470,8 @@ Image *str_to_image(VALUE str)
453
470
 
454
471
  info = CloneImageInfo(NULL);
455
472
  exception = AcquireExceptionInfo();
456
- image = BlobToImage(info, RSTRING_PTR(str), RSTRING_LEN(str), exception);
473
+ GVL_STRUCT_TYPE(BlobToImage) args = { info, RSTRING_PTR(str), RSTRING_LEN(str), exception };
474
+ image = (Image *)CALL_FUNC_WITHOUT_GVL(GVL_FUNC(BlobToImage), &args);
457
475
  DestroyImageInfo(info);
458
476
  CHECK_EXCEPTION();
459
477
  DestroyExceptionInfo(exception);
@@ -482,7 +500,7 @@ Draw_marshal_dump(VALUE self)
482
500
  Draw *draw;
483
501
  VALUE ddraw;
484
502
 
485
- Data_Get_Struct(self, Draw, draw);
503
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
486
504
 
487
505
  // Raise an exception if the Draw has a non-NULL gradient or element_reference field
488
506
  if (draw->info->element_reference.type != UndefinedReference
@@ -493,31 +511,17 @@ Draw_marshal_dump(VALUE self)
493
511
 
494
512
  ddraw = rb_hash_new();
495
513
 
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
514
  rb_hash_aset(ddraw, CSTR2SYM("affine"), Import_AffineMatrix(&draw->info->affine));
500
515
  rb_hash_aset(ddraw, CSTR2SYM("gravity"), INT2FIX(draw->info->gravity));
501
516
  rb_hash_aset(ddraw, CSTR2SYM("fill"), Pixel_from_PixelColor(&draw->info->fill));
502
517
  rb_hash_aset(ddraw, CSTR2SYM("stroke"), Pixel_from_PixelColor(&draw->info->stroke));
503
518
  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
519
  rb_hash_aset(ddraw, CSTR2SYM("fill_pattern"), image_to_str(draw->info->fill_pattern));
506
- rb_hash_aset(ddraw, CSTR2SYM("tile"), Qnil); // deprecated
507
520
  rb_hash_aset(ddraw, CSTR2SYM("stroke_pattern"), image_to_str(draw->info->stroke_pattern));
508
521
  rb_hash_aset(ddraw, CSTR2SYM("stroke_antialias"), draw->info->stroke_antialias ? Qtrue : Qfalse);
509
522
  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
523
  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
524
  rb_hash_aset(ddraw, CSTR2SYM("font"), MAGICK_STRING_TO_OBJ(draw->info->font));
520
- // rb_hash_aset(ddraw, CSTR2SYM("metrics"), Qnil); internal
521
525
  rb_hash_aset(ddraw, CSTR2SYM("family"), MAGICK_STRING_TO_OBJ(draw->info->family));
522
526
  rb_hash_aset(ddraw, CSTR2SYM("style"), INT2FIX(draw->info->style));
523
527
  rb_hash_aset(ddraw, CSTR2SYM("stretch"), INT2FIX(draw->info->stretch));
@@ -527,26 +531,17 @@ Draw_marshal_dump(VALUE self)
527
531
  rb_hash_aset(ddraw, CSTR2SYM("density"), MAGICK_STRING_TO_OBJ(draw->info->density));
528
532
  rb_hash_aset(ddraw, CSTR2SYM("align"), INT2FIX(draw->info->align));
529
533
  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
534
  rb_hash_aset(ddraw, CSTR2SYM("clip_units"), INT2FIX(draw->info->clip_units));
536
535
  #if defined(IMAGEMAGICK_7)
537
536
  rb_hash_aset(ddraw, CSTR2SYM("alpha"), QUANTUM2NUM(draw->info->alpha));
538
537
  #else
539
538
  rb_hash_aset(ddraw, CSTR2SYM("opacity"), QUANTUM2NUM(draw->info->opacity));
540
539
  #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
540
  rb_hash_aset(ddraw, CSTR2SYM("kerning"), rb_float_new(draw->info->kerning));
545
541
  rb_hash_aset(ddraw, CSTR2SYM("interword_spacing"), rb_float_new(draw->info->interword_spacing));
546
542
 
547
543
  // Non-DrawInfo fields
548
544
  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
545
 
551
546
  return ddraw;
552
547
  }
@@ -564,21 +559,18 @@ Draw_marshal_load(VALUE self, VALUE ddraw)
564
559
  Draw *draw;
565
560
  VALUE val;
566
561
 
567
- Data_Get_Struct(self, Draw, draw);
568
-
562
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
563
+
569
564
  if (draw->info == NULL)
570
565
  {
571
566
  ImageInfo *image_info;
572
567
 
573
568
  image_info = CloneImageInfo(NULL);
574
569
  draw->info = CloneDrawInfo(image_info, (DrawInfo *) NULL);
575
- DestroyImageInfo(image_info);
570
+ DestroyImageInfo(image_info);
576
571
  }
577
572
  OBJ_TO_MAGICK_STRING(draw->info->geometry, rb_hash_aref(ddraw, CSTR2SYM("geometry")));
578
573
 
579
- //val = rb_hash_aref(ddraw, CSTR2SYM("viewbox"));
580
- //Export_RectangleInfo(&draw->info->viewbox, val);
581
-
582
574
  val = rb_hash_aref(ddraw, CSTR2SYM("affine"));
583
575
  Export_AffineMatrix(&draw->info->affine, val);
584
576
 
@@ -639,7 +631,7 @@ Draw_pointsize_eq(VALUE self, VALUE pointsize)
639
631
  Draw *draw;
640
632
 
641
633
  rb_check_frozen(self);
642
- Data_Get_Struct(self, Draw, draw);
634
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
643
635
  draw->info->pointsize = NUM2DBL(pointsize);
644
636
  return pointsize;
645
637
  }
@@ -659,7 +651,7 @@ Draw_rotation_eq(VALUE self, VALUE deg)
659
651
  AffineMatrix affine, current;
660
652
 
661
653
  rb_check_frozen(self);
662
- Data_Get_Struct(self, Draw, draw);
654
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
663
655
 
664
656
  degrees = NUM2DBL(deg);
665
657
  if (fabs(degrees) > DBL_EPSILON)
@@ -695,7 +687,7 @@ Draw_stroke_eq(VALUE self, VALUE stroke)
695
687
  Draw *draw;
696
688
 
697
689
  rb_check_frozen(self);
698
- Data_Get_Struct(self, Draw, draw);
690
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
699
691
  Color_to_PixelColor(&draw->info->stroke, stroke);
700
692
  return stroke;
701
693
  }
@@ -715,7 +707,7 @@ Draw_stroke_pattern_eq(VALUE self, VALUE pattern)
715
707
  Draw *draw;
716
708
 
717
709
  rb_check_frozen(self);
718
- Data_Get_Struct(self, Draw, draw);
710
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
719
711
 
720
712
  if (draw->info->stroke_pattern != NULL)
721
713
  {
@@ -751,7 +743,7 @@ Draw_stroke_width_eq(VALUE self, VALUE stroke_width)
751
743
  Draw *draw;
752
744
 
753
745
  rb_check_frozen(self);
754
- Data_Get_Struct(self, Draw, draw);
746
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
755
747
  draw->info->stroke_width = NUM2DBL(stroke_width);
756
748
  return stroke_width;
757
749
  }
@@ -769,7 +761,7 @@ Draw_text_antialias_eq(VALUE self, VALUE text_antialias)
769
761
  Draw *draw;
770
762
 
771
763
  rb_check_frozen(self);
772
- Data_Get_Struct(self, Draw, draw);
764
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
773
765
  draw->info->text_antialias = (MagickBooleanType) RTEST(text_antialias);
774
766
  return text_antialias;
775
767
  }
@@ -800,7 +792,7 @@ Draw_undercolor_eq(VALUE self, VALUE undercolor)
800
792
  Draw *draw;
801
793
 
802
794
  rb_check_frozen(self);
803
- Data_Get_Struct(self, Draw, draw);
795
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
804
796
  Color_to_PixelColor(&draw->info->undercolor, undercolor);
805
797
  return undercolor;
806
798
  }
@@ -843,7 +835,7 @@ VALUE Draw_annotate(
843
835
 
844
836
  // Save the affine matrix in case it is modified by
845
837
  // Draw#rotation=
846
- Data_Get_Struct(self, Draw, draw);
838
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
847
839
  keep = draw->info->affine;
848
840
 
849
841
  image_arg = rm_cur_image(image_arg);
@@ -853,16 +845,7 @@ VALUE Draw_annotate(
853
845
  // allowing the app a chance to modify the object's attributes
854
846
  if (rb_block_given_p())
855
847
  {
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
- }
848
+ rb_yield(self);
866
849
  }
867
850
 
868
851
  // Translate & store in Draw structure
@@ -910,10 +893,11 @@ VALUE Draw_annotate(
910
893
  magick_clone_string(&draw->info->geometry, geometry_str);
911
894
 
912
895
  #if defined(IMAGEMAGICK_7)
913
- AnnotateImage(image, draw->info, exception);
896
+ GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info, exception };
914
897
  #else
915
- AnnotateImage(image, draw->info);
898
+ GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info };
916
899
  #endif
900
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(AnnotateImage), &args);
917
901
 
918
902
  magick_free(draw->info->text);
919
903
  draw->info->text = NULL;
@@ -973,7 +957,7 @@ Draw_clone(VALUE self)
973
957
  * @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
974
958
  * imagelist, uses the current image.
975
959
  * @param operator [Magick::CompositeOperator] the operator
976
- *
960
+ *
977
961
  * @return [Magick::Draw] self
978
962
  */
979
963
  VALUE
@@ -1016,7 +1000,7 @@ Draw_composite(int argc, VALUE *argv, VALUE self)
1016
1000
  rb_raise(rb_eArgError, "unknown composite operator (%d)", cop);
1017
1001
  }
1018
1002
 
1019
- Data_Get_Struct(self, Draw, draw);
1003
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1020
1004
 
1021
1005
  // Create a temp copy of the composite image
1022
1006
  rm_write_temp_image(comp_img, name, sizeof(name));
@@ -1061,7 +1045,7 @@ Draw_draw(VALUE self, VALUE image_arg)
1061
1045
  image_arg = rm_cur_image(image_arg);
1062
1046
  image = rm_check_frozen(image_arg);
1063
1047
 
1064
- Data_Get_Struct(self, Draw, draw);
1048
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1065
1049
  if (draw->primitives == 0)
1066
1050
  {
1067
1051
  rb_raise(rb_eArgError, "nothing to draw");
@@ -1072,10 +1056,11 @@ Draw_draw(VALUE self, VALUE image_arg)
1072
1056
 
1073
1057
  #if defined(IMAGEMAGICK_7)
1074
1058
  exception = AcquireExceptionInfo();
1075
- DrawImage(image, draw->info, exception);
1059
+ GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info, exception };
1076
1060
  #else
1077
- DrawImage(image, draw->info);
1061
+ GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info };
1078
1062
  #endif
1063
+ CALL_FUNC_WITHOUT_GVL(GVL_FUNC(DrawImage), &args);
1079
1064
 
1080
1065
  magick_free(draw->info->primitive);
1081
1066
  draw->info->primitive = NULL;
@@ -1106,7 +1091,7 @@ Draw_dup(VALUE self)
1106
1091
 
1107
1092
  draw = ALLOC(Draw);
1108
1093
  memset(draw, 0, sizeof(Draw));
1109
- dup = Data_Wrap_Struct(CLASS_OF(self), mark_Draw, destroy_Draw, draw);
1094
+ dup = TypedData_Wrap_Struct(CLASS_OF(self), &rm_draw_data_type, draw);
1110
1095
  RB_GC_GUARD(dup);
1111
1096
 
1112
1097
  return rb_funcall(dup, rm_ID_initialize_copy, 1, self);
@@ -1136,7 +1121,7 @@ Draw_get_type_metrics(
1136
1121
  VALUE *argv,
1137
1122
  VALUE self)
1138
1123
  {
1139
- return get_type_metrics(argc, argv, self, GetTypeMetrics);
1124
+ return get_type_metrics(argc, argv, self, GVL_FUNC(GetTypeMetrics));
1140
1125
  }
1141
1126
 
1142
1127
 
@@ -1163,7 +1148,7 @@ Draw_get_multiline_type_metrics(
1163
1148
  VALUE *argv,
1164
1149
  VALUE self)
1165
1150
  {
1166
- return get_type_metrics(argc, argv, self, GetMultilineTypeMetrics);
1151
+ return get_type_metrics(argc, argv, self, GVL_FUNC(GetMultilineTypeMetrics));
1167
1152
  }
1168
1153
 
1169
1154
 
@@ -1177,8 +1162,8 @@ VALUE Draw_init_copy(VALUE self, VALUE orig)
1177
1162
  {
1178
1163
  Draw *copy, *original;
1179
1164
 
1180
- Data_Get_Struct(orig, Draw, original);
1181
- Data_Get_Struct(self, Draw, copy);
1165
+ TypedData_Get_Struct(orig, Draw, &rm_draw_data_type, original);
1166
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, copy);
1182
1167
 
1183
1168
  copy->info = CloneDrawInfo(NULL, original->info);
1184
1169
  if (!copy->info)
@@ -1206,10 +1191,10 @@ Draw_initialize(VALUE self)
1206
1191
  Draw *draw, *draw_options;
1207
1192
  VALUE options;
1208
1193
 
1209
- Data_Get_Struct(self, Draw, draw);
1194
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1210
1195
 
1211
1196
  options = new_DrawOptions();
1212
- Data_Get_Struct(options, Draw, draw_options);
1197
+ TypedData_Get_Struct(options, Draw, &rm_draw_data_type, draw_options);
1213
1198
  draw->info = draw_options->info;
1214
1199
  draw_options->info = NULL;
1215
1200
 
@@ -1230,7 +1215,7 @@ Draw_inspect(VALUE self)
1230
1215
  {
1231
1216
  Draw *draw;
1232
1217
 
1233
- Data_Get_Struct(self, Draw, draw);
1218
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1234
1219
  return draw->primitives ? draw->primitives : rb_str_new2("(no primitives defined)");
1235
1220
  }
1236
1221
 
@@ -1247,7 +1232,7 @@ VALUE Draw_alloc(VALUE class)
1247
1232
 
1248
1233
  draw = ALLOC(Draw);
1249
1234
  memset(draw, 0, sizeof(Draw));
1250
- draw_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw);
1235
+ draw_obj = TypedData_Wrap_Struct(class, &rm_draw_data_type, draw);
1251
1236
 
1252
1237
  RB_GC_GUARD(draw_obj);
1253
1238
 
@@ -1267,7 +1252,7 @@ Draw_primitive(VALUE self, VALUE primitive)
1267
1252
  Draw *draw;
1268
1253
 
1269
1254
  rb_check_frozen(self);
1270
- Data_Get_Struct(self, Draw, draw);
1255
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1271
1256
 
1272
1257
  if (draw->primitives == (VALUE)0)
1273
1258
  {
@@ -1275,7 +1260,7 @@ Draw_primitive(VALUE self, VALUE primitive)
1275
1260
  }
1276
1261
  else
1277
1262
  {
1278
- draw->primitives = rb_str_concat(draw->primitives, rb_str_new2("\n"));
1263
+ draw->primitives = rb_str_plus(draw->primitives, rb_str_new2("\n"));
1279
1264
  draw->primitives = rb_str_concat(draw->primitives, primitive);
1280
1265
  }
1281
1266
 
@@ -1291,7 +1276,7 @@ Draw_primitive(VALUE self, VALUE primitive)
1291
1276
  * @param drawptr pointer to a Draw object
1292
1277
  */
1293
1278
  static void
1294
- mark_Draw(void *drawptr)
1279
+ Draw_mark(void *drawptr)
1295
1280
  {
1296
1281
  Draw *draw = (Draw *)drawptr;
1297
1282
 
@@ -1310,7 +1295,7 @@ mark_Draw(void *drawptr)
1310
1295
  * @param drawptr pointer to a Draw object
1311
1296
  */
1312
1297
  static void
1313
- destroy_Draw(void *drawptr)
1298
+ Draw_destroy(void *drawptr)
1314
1299
  {
1315
1300
  Draw *draw = (Draw *)drawptr;
1316
1301
 
@@ -1334,6 +1319,18 @@ destroy_Draw(void *drawptr)
1334
1319
  xfree(drawptr);
1335
1320
  }
1336
1321
 
1322
+ /**
1323
+ * Get Draw object size.
1324
+ *
1325
+ * No Ruby usage (internal function)
1326
+ *
1327
+ * @param infoptr pointer to the Draw object
1328
+ */
1329
+ static size_t
1330
+ Draw_memsize(const void *drawptr)
1331
+ {
1332
+ return sizeof(Draw);
1333
+ }
1337
1334
 
1338
1335
  /**
1339
1336
  * Allocate & initialize a DrawOptions object.
@@ -1365,7 +1362,7 @@ DrawOptions_alloc(VALUE class)
1365
1362
 
1366
1363
  draw_options = ALLOC(Draw);
1367
1364
  memset(draw_options, 0, sizeof(Draw));
1368
- draw_options_obj = Data_Wrap_Struct(class, mark_Draw, destroy_Draw, draw_options);
1365
+ draw_options_obj = TypedData_Wrap_Struct(class, &rm_draw_data_type, draw_options);
1369
1366
 
1370
1367
  RB_GC_GUARD(draw_options_obj);
1371
1368
 
@@ -1383,7 +1380,7 @@ DrawOptions_initialize(VALUE self)
1383
1380
  {
1384
1381
  Draw *draw_options;
1385
1382
 
1386
- Data_Get_Struct(self, Draw, draw_options);
1383
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw_options);
1387
1384
  draw_options->info = AcquireDrawInfo();
1388
1385
  if (!draw_options->info)
1389
1386
  {
@@ -1394,16 +1391,7 @@ DrawOptions_initialize(VALUE self)
1394
1391
 
1395
1392
  if (rb_block_given_p())
1396
1393
  {
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
- }
1394
+ rb_yield(self);
1407
1395
  }
1408
1396
 
1409
1397
  return self;
@@ -1433,7 +1421,7 @@ PolaroidOptions_alloc(VALUE class)
1433
1421
  draw->info = CloneDrawInfo(image_info, (DrawInfo *) NULL);
1434
1422
  (void) DestroyImageInfo(image_info);
1435
1423
 
1436
- polaroid_obj = Data_Wrap_Struct(class, NULL, destroy_Draw, draw);
1424
+ polaroid_obj = TypedData_Wrap_Struct(class, &rm_draw_data_type, draw);
1437
1425
 
1438
1426
  RB_GC_GUARD(polaroid_obj);
1439
1427
 
@@ -1455,7 +1443,7 @@ PolaroidOptions_initialize(VALUE self)
1455
1443
  ExceptionInfo *exception;
1456
1444
 
1457
1445
  // Default shadow color
1458
- Data_Get_Struct(self, Draw, draw);
1446
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1459
1447
 
1460
1448
  exception = AcquireExceptionInfo();
1461
1449
  QueryColorCompliance("gray75", AllCompliance, &draw->shadow_color, exception);
@@ -1466,16 +1454,7 @@ PolaroidOptions_initialize(VALUE self)
1466
1454
 
1467
1455
  if (rb_block_given_p())
1468
1456
  {
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
- }
1457
+ rb_yield(self);
1479
1458
  }
1480
1459
 
1481
1460
  return self;
@@ -1508,7 +1487,7 @@ PolaroidOptions_shadow_color_eq(VALUE self, VALUE shadow)
1508
1487
  Draw *draw;
1509
1488
 
1510
1489
  rb_check_frozen(self);
1511
- Data_Get_Struct(self, Draw, draw);
1490
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1512
1491
  Color_to_PixelColor(&draw->shadow_color, shadow);
1513
1492
  return shadow;
1514
1493
  }
@@ -1526,7 +1505,7 @@ PolaroidOptions_border_color_eq(VALUE self, VALUE border)
1526
1505
  Draw *draw;
1527
1506
 
1528
1507
  rb_check_frozen(self);
1529
- Data_Get_Struct(self, Draw, draw);
1508
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1530
1509
  Color_to_PixelColor(&draw->info->border_color, border);
1531
1510
  return border;
1532
1511
  }
@@ -1575,6 +1554,9 @@ get_dummy_tm_img(VALUE klass)
1575
1554
  }
1576
1555
 
1577
1556
 
1557
+ // aliases for common use of structure types; GetMultilineTypeMetrics, GetTypeMetrics
1558
+ typedef GVL_STRUCT_TYPE(GetTypeMetrics) GVL_STRUCT_TYPE(get_type_metrics);
1559
+
1578
1560
  /**
1579
1561
  * Call a get-type-metrics function.
1580
1562
  *
@@ -1592,11 +1574,7 @@ get_dummy_tm_img(VALUE klass)
1592
1574
  * @see Draw_get_multiline_type_metrics
1593
1575
  */
1594
1576
  static VALUE
1595
- get_type_metrics(
1596
- int argc,
1597
- VALUE *argv,
1598
- VALUE self,
1599
- get_type_metrics_func_t getter)
1577
+ get_type_metrics(int argc, VALUE *argv, VALUE self, gvl_function_t fp)
1600
1578
  {
1601
1579
  Image *image;
1602
1580
  Draw *draw;
@@ -1604,7 +1582,7 @@ get_type_metrics(
1604
1582
  TypeMetric metrics;
1605
1583
  char *text = NULL;
1606
1584
  long text_l;
1607
- unsigned int okay;
1585
+ MagickBooleanType okay;
1608
1586
  #if defined(IMAGEMAGICK_7)
1609
1587
  ExceptionInfo *exception;
1610
1588
  #endif
@@ -1613,7 +1591,7 @@ get_type_metrics(
1613
1591
  {
1614
1592
  case 1: // use default image
1615
1593
  text = rm_str2cstr(argv[0], &text_l);
1616
- Data_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, image);
1594
+ TypedData_Get_Struct(get_dummy_tm_img(CLASS_OF(self)), Image, &rm_image_data_type, image);
1617
1595
  break;
1618
1596
  case 2:
1619
1597
  t = rm_cur_image(argv[0]);
@@ -1630,7 +1608,7 @@ get_type_metrics(
1630
1608
  rb_raise(rb_eArgError, "no text to measure");
1631
1609
  }
1632
1610
 
1633
- Data_Get_Struct(self, Draw, draw);
1611
+ TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
1634
1612
  #if defined(IMAGEMAGICK_7)
1635
1613
  exception = AcquireExceptionInfo();
1636
1614
  draw->info->text = InterpretImageProperties(NULL, image, text, exception);
@@ -1654,10 +1632,11 @@ get_type_metrics(
1654
1632
  }
1655
1633
 
1656
1634
  #if defined(IMAGEMAGICK_7)
1657
- okay = (*getter)(image, draw->info, &metrics, exception);
1635
+ GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics, exception };
1658
1636
  #else
1659
- okay = (*getter)(image, draw->info, &metrics);
1637
+ GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics };
1660
1638
  #endif
1639
+ okay = (MagickBooleanType)CALL_FUNC_WITHOUT_GVL(fp, &args);
1661
1640
 
1662
1641
  magick_free(draw->info->text);
1663
1642
  draw->info->text = NULL;