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.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +0 -1
- data/CHANGELOG.md +20 -0
- data/README.md +5 -14
- data/before_install_osx.sh +2 -1
- data/ext/RMagick/extconf.rb +72 -36
- data/ext/RMagick/rmagick.h +24 -18
- data/ext/RMagick/rmagick_gvl.h +224 -0
- data/ext/RMagick/rmdraw.c +107 -128
- data/ext/RMagick/rmenum.c +34 -15
- data/ext/RMagick/rmfill.c +77 -16
- data/ext/RMagick/rmilist.c +158 -70
- data/ext/RMagick/rmimage.c +1073 -596
- data/ext/RMagick/rminfo.c +108 -124
- data/ext/RMagick/rmkinfo.c +43 -13
- data/ext/RMagick/rmmain.c +7 -9
- data/ext/RMagick/rmmontage.c +41 -20
- data/ext/RMagick/rmpixel.c +64 -40
- data/ext/RMagick/rmutil.c +10 -89
- data/lib/rmagick/version.rb +3 -1
- data/lib/rmagick.rb +2 -0
- data/lib/rmagick_internal.rb +8 -48
- data/rmagick.gemspec +3 -1
- metadata +17 -4
- data/deprecated/RMagick.rb +0 -6
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
|
17
|
-
static 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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
896
|
+
GVL_STRUCT_TYPE(AnnotateImage) args = { image, draw->info, exception };
|
914
897
|
#else
|
915
|
-
AnnotateImage
|
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
|
-
|
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
|
-
|
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
|
1059
|
+
GVL_STRUCT_TYPE(DrawImage) args = { image, draw->info, exception };
|
1076
1060
|
#else
|
1077
|
-
DrawImage
|
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 =
|
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
|
-
|
1181
|
-
|
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
|
-
|
1194
|
+
TypedData_Get_Struct(self, Draw, &rm_draw_data_type, draw);
|
1210
1195
|
|
1211
1196
|
options = new_DrawOptions();
|
1212
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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 =
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1635
|
+
GVL_STRUCT_TYPE(get_type_metrics) args = { image, draw->info, &metrics, exception };
|
1658
1636
|
#else
|
1659
|
-
|
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;
|