rmagick 4.2.2 → 5.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/Dockerfile +14 -0
- data/.devcontainer/ImageMagick6/devcontainer.json +11 -0
- data/.devcontainer/devcontainer.json +11 -0
- data/.devcontainer/setup-repo.sh +10 -0
- data/.devcontainer/setup-user.sh +45 -0
- data/.editorconfig +1 -1
- data/.github/workflows/ci.yml +59 -24
- data/.gitignore +3 -0
- data/.rubocop_todo.yml +0 -1
- data/.yardopts +1 -1
- data/CHANGELOG.md +131 -0
- data/README.md +12 -17
- data/Rakefile +53 -81
- data/before_install_linux.sh +4 -4
- data/before_install_osx.sh +7 -6
- data/ext/RMagick/extconf.rb +94 -45
- data/ext/RMagick/{rmagick.c → rmagick.cpp} +19 -22
- data/ext/RMagick/rmagick.h +90 -60
- data/ext/RMagick/rmagick_gvl.h +224 -0
- data/ext/RMagick/{rmdraw.c → rmdraw.cpp} +160 -146
- data/ext/RMagick/{rmenum.c → rmenum.cpp} +69 -50
- data/ext/RMagick/{rmfill.c → rmfill.cpp} +81 -20
- data/ext/RMagick/{rmilist.c → rmilist.cpp} +184 -93
- data/ext/RMagick/{rmimage.c → rmimage.cpp} +1276 -731
- data/ext/RMagick/{rminfo.c → rminfo.cpp} +119 -131
- data/ext/RMagick/{rmkinfo.c → rmkinfo.cpp} +41 -16
- data/ext/RMagick/rmmain.cpp +1957 -0
- data/ext/RMagick/{rmmontage.c → rmmontage.cpp} +49 -28
- data/ext/RMagick/{rmpixel.c → rmpixel.cpp} +109 -84
- data/ext/RMagick/{rmstruct.c → rmstruct.cpp} +12 -12
- data/ext/RMagick/{rmutil.c → rmutil.cpp} +52 -91
- data/lib/rmagick/version.rb +3 -1
- data/lib/rmagick.rb +2 -0
- data/lib/rmagick_internal.rb +9 -48
- data/lib/rvg/rvg.rb +2 -2
- data/rmagick.gemspec +8 -7
- metadata +54 -23
- data/.codeclimate.yml +0 -63
- data/deprecated/RMagick.rb +0 -6
- data/ext/RMagick/rmmain.c +0 -1951
data/ext/RMagick/rmagick.h
CHANGED
@@ -16,14 +16,21 @@
|
|
16
16
|
//! Suppress warnings about deprecated functions on Windows
|
17
17
|
#define _CRT_SECURE_NO_DEPRECATE 1
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
#include
|
22
|
-
|
23
|
-
|
24
|
-
#include <
|
25
|
-
#include
|
26
|
-
#include
|
19
|
+
// ruby.h contains a C++ template, which cannot be included in extern "C".
|
20
|
+
// Therefore, it includes the header in advance.
|
21
|
+
#include "ruby/defines.h"
|
22
|
+
|
23
|
+
extern "C" {
|
24
|
+
#include <assert.h>
|
25
|
+
#include <stdio.h>
|
26
|
+
#include <ctype.h>
|
27
|
+
#include <stdlib.h>
|
28
|
+
#include <math.h>
|
29
|
+
#include <sys/types.h>
|
30
|
+
#include "ruby.h"
|
31
|
+
#include "ruby/io.h"
|
32
|
+
#include "rmagick_gvl.h"
|
33
|
+
}
|
27
34
|
|
28
35
|
#if defined(__MINGW32__)
|
29
36
|
// Ruby defines wrong format specifiers for MinGW. So this defines original macro in here.
|
@@ -44,10 +51,6 @@
|
|
44
51
|
#endif
|
45
52
|
|
46
53
|
#if defined(__GNUC__)
|
47
|
-
#pragma GCC diagnostic push
|
48
|
-
#pragma GCC diagnostic ignored "-Wdeclaration-after-statement"
|
49
|
-
#pragma GCC diagnostic ignored "-Wunknown-pragmas"
|
50
|
-
|
51
54
|
#if __GNUC__ > 6
|
52
55
|
#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
|
53
56
|
#endif
|
@@ -61,6 +64,11 @@
|
|
61
64
|
#undef PACKAGE_TARNAME
|
62
65
|
#undef WORDS_BIGENDIAN
|
63
66
|
|
67
|
+
#ifndef HAVE_RB_EXT_RACTOR_SAFE
|
68
|
+
#undef RUBY_TYPED_FROZEN_SHAREABLE
|
69
|
+
#define RUBY_TYPED_FROZEN_SHAREABLE 0
|
70
|
+
#endif
|
71
|
+
|
64
72
|
#include "extconf.h"
|
65
73
|
|
66
74
|
#if defined(IMAGEMAGICK_7)
|
@@ -90,8 +98,8 @@
|
|
90
98
|
|
91
99
|
//! Trace new image creation in bang methods
|
92
100
|
#define UPDATE_DATA_PTR(_obj_, _new_) \
|
93
|
-
do {
|
94
|
-
|
101
|
+
do { \
|
102
|
+
DATA_PTR(_obj_) = (void *)(_new_); \
|
95
103
|
} while(0)
|
96
104
|
|
97
105
|
|
@@ -310,7 +318,7 @@ typedef enum _QuantumExpressionOperator
|
|
310
318
|
|
311
319
|
|
312
320
|
/** This implements the "omitted storage class model" for external variables.
|
313
|
-
* (Ref: Harbison & Steele.) The rmmain.
|
321
|
+
* (Ref: Harbison & Steele.) The rmmain.cpp file defines MAIN, which causes
|
314
322
|
* the single defining declarations to be generated. No other source files
|
315
323
|
* define MAIN and therefore generate referencing declarations.
|
316
324
|
*/
|
@@ -396,7 +404,6 @@ EXTERN VALUE Class_KernelInfoType;
|
|
396
404
|
/**
|
397
405
|
* Commonly-used IDs
|
398
406
|
*/
|
399
|
-
EXTERN ID rm_ID_trace_proc; /**< "@trace_proc" */
|
400
407
|
EXTERN ID rm_ID_call; /**< "call" */
|
401
408
|
EXTERN ID rm_ID_changed; /**< "changed" */
|
402
409
|
EXTERN ID rm_ID_cur_image; /**< "cur_image" */
|
@@ -411,7 +418,13 @@ EXTERN ID rm_ID_push; /**< "push" */
|
|
411
418
|
EXTERN ID rm_ID_values; /**< "values" */
|
412
419
|
EXTERN ID rm_ID_width; /**< "width" */
|
413
420
|
|
414
|
-
|
421
|
+
extern const rb_data_type_t rm_enum_data_type;
|
422
|
+
extern const rb_data_type_t rm_info_data_type;
|
423
|
+
extern const rb_data_type_t rm_image_data_type;
|
424
|
+
extern const rb_data_type_t rm_draw_data_type;
|
425
|
+
extern const rb_data_type_t rm_pixel_data_type;
|
426
|
+
extern const rb_data_type_t rm_montage_data_type;
|
427
|
+
extern const rb_data_type_t rm_kernel_info_data_type;
|
415
428
|
|
416
429
|
#if !defined(min)
|
417
430
|
#define min(a, b) ((a)<(b)?(a):(b)) /**< min of two values */
|
@@ -431,59 +444,59 @@ EXTERN unsigned long long rm_main_thread_id;
|
|
431
444
|
Define simple attribute accessor methods (boolean, int, string, and double types)
|
432
445
|
*/
|
433
446
|
#define C_boolean_to_R_boolean(attr) (attr) ? Qtrue : Qfalse /**< C boolean -> Ruby boolean */
|
434
|
-
#define R_boolean_to_C_boolean(attr) RTEST(attr) /**< C boolean <- Ruby boolean */
|
447
|
+
#define R_boolean_to_C_boolean(attr) (MagickBooleanType)RTEST(attr) /**< C boolean <- Ruby boolean */
|
435
448
|
#define C_int_to_R_int(attr) INT2FIX(attr) /**< C int -> Ruby int */
|
436
449
|
#define R_int_to_C_int(attr) NUM2INT(attr) /**< C int <- Ruby int */
|
437
|
-
#define C_long_to_R_long(attr)
|
450
|
+
#define C_long_to_R_long(attr) LONG2NUM(attr) /**< C long -> Ruby long */
|
438
451
|
#define R_long_to_C_long(attr) NUM2LONG(attr) /**< C long <- Ruby long */
|
439
|
-
#define C_ulong_to_R_ulong(attr)
|
452
|
+
#define C_ulong_to_R_ulong(attr) ULONG2NUM(attr) /**< C unsigned long -> Ruby unsigned long */
|
440
453
|
#define R_ulong_to_C_ulong(attr) NUM2ULONG(attr) /**< C unsigned long <- Ruby unsigned long */
|
441
454
|
#define C_str_to_R_str(attr) attr ? rb_str_new2(attr) : Qnil /**< C string -> Ruby string */
|
442
455
|
#define C_dbl_to_R_dbl(attr) rb_float_new(attr) /**< C double -> Ruby double */
|
443
456
|
#define R_dbl_to_C_dbl(attr) NUM2DBL(attr) /**< C double <- Ruby double */
|
444
457
|
|
445
458
|
//! define attribute reader
|
446
|
-
#define
|
459
|
+
#define IMPLEMENT_TYPED_ATTR_READER(klass, attr, type, data_type) \
|
447
460
|
{\
|
448
|
-
|
461
|
+
klass *ptr;\
|
449
462
|
if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\
|
450
463
|
rm_check_destroyed(self); \
|
451
464
|
}\
|
452
|
-
|
465
|
+
TypedData_Get_Struct(self, klass, data_type, ptr);\
|
453
466
|
return C_##type##_to_R_##type(ptr->attr);\
|
454
467
|
}
|
455
468
|
|
456
469
|
//! define attribute reader when attribute name is different from the field name
|
457
|
-
#define
|
470
|
+
#define IMPLEMENT_TYPED_ATTR_READERF(klass, attr, field, type, data_type) \
|
458
471
|
{\
|
459
|
-
|
472
|
+
klass *ptr;\
|
460
473
|
rm_check_destroyed(self); \
|
461
|
-
|
474
|
+
TypedData_Get_Struct(self, klass, data_type, ptr);\
|
462
475
|
return C_##type##_to_R_##type(ptr->field);\
|
463
476
|
}
|
464
477
|
|
465
478
|
//! define attribute writer
|
466
|
-
#define
|
479
|
+
#define IMPLEMENT_TYPED_ATTR_WRITER(klass, attr, type, data_type) \
|
467
480
|
{\
|
468
|
-
|
481
|
+
klass *ptr;\
|
469
482
|
if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\
|
470
483
|
rm_check_destroyed(self); \
|
471
484
|
}\
|
472
485
|
rb_check_frozen(self);\
|
473
|
-
|
486
|
+
TypedData_Get_Struct(self, klass, data_type, ptr);\
|
474
487
|
ptr->attr = R_##type##_to_C_##type(val);\
|
475
488
|
return val;\
|
476
489
|
}
|
477
490
|
|
478
491
|
//! define attribute writer when attribute name is different from the field name
|
479
|
-
#define
|
492
|
+
#define IMPLEMENT_TYPED_ATTR_WRITERF(klass, attr, field, type, data_type) \
|
480
493
|
{\
|
481
|
-
|
494
|
+
klass *ptr;\
|
482
495
|
if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\
|
483
496
|
rm_check_destroyed(self); \
|
484
497
|
}\
|
485
498
|
rb_check_frozen(self);\
|
486
|
-
|
499
|
+
TypedData_Get_Struct(self, klass, data_type, ptr);\
|
487
500
|
ptr->field = R_##type##_to_C_##type(val);\
|
488
501
|
return self;\
|
489
502
|
}
|
@@ -493,15 +506,15 @@ EXTERN unsigned long long rm_main_thread_id;
|
|
493
506
|
* Declare attribute accessors
|
494
507
|
*/
|
495
508
|
//! declare attribute reader
|
496
|
-
#define ATTR_READER(
|
497
|
-
extern VALUE
|
509
|
+
#define ATTR_READER(klass, attr) \
|
510
|
+
extern VALUE klass##_##attr(VALUE);
|
498
511
|
//! declare attribute writer
|
499
|
-
#define ATTR_WRITER(
|
500
|
-
extern VALUE
|
512
|
+
#define ATTR_WRITER(klass, attr) \
|
513
|
+
extern VALUE klass##_##attr##_eq(VALUE, VALUE);
|
501
514
|
//! declare attribute accessor
|
502
|
-
#define ATTR_ACCESSOR(
|
503
|
-
ATTR_READER(
|
504
|
-
ATTR_WRITER(
|
515
|
+
#define ATTR_ACCESSOR(klass, attr) \
|
516
|
+
ATTR_READER(klass, attr)\
|
517
|
+
ATTR_WRITER(klass, attr)
|
505
518
|
|
506
519
|
|
507
520
|
//! Define a Magick module constant
|
@@ -513,7 +526,6 @@ EXTERN unsigned long long rm_main_thread_id;
|
|
513
526
|
#define DEF_CONSTV(constant, val) rb_define_const(Module_Magick, #constant, UINT2NUM(val))
|
514
527
|
#endif
|
515
528
|
|
516
|
-
|
517
529
|
//! Convert a Ruby enum constant back to a C enum member.
|
518
530
|
#define VALUE_TO_ENUM(value, e, type) \
|
519
531
|
do {\
|
@@ -521,7 +533,7 @@ EXTERN unsigned long long rm_main_thread_id;
|
|
521
533
|
if (CLASS_OF(value) != Class_##type)\
|
522
534
|
rb_raise(rb_eTypeError, "wrong enumeration type - expected %s, got %s", \
|
523
535
|
rb_class2name(Class_##type), rb_class2name(CLASS_OF(value)));\
|
524
|
-
|
536
|
+
TypedData_Get_Struct(value, MagickEnum, &rm_enum_data_type, magick_enum);\
|
525
537
|
e = (type)(magick_enum->val);\
|
526
538
|
} while(0)
|
527
539
|
|
@@ -534,11 +546,13 @@ EXTERN unsigned long long rm_main_thread_id;
|
|
534
546
|
// the same source file.
|
535
547
|
|
536
548
|
|
537
|
-
|
549
|
+
extern "C" {
|
550
|
+
|
551
|
+
// rmmain.cpp
|
538
552
|
extern void Init_RMagick2(void);
|
539
553
|
|
540
554
|
|
541
|
-
// rmagick.
|
555
|
+
// rmagick.cpp
|
542
556
|
extern VALUE Magick_colors(VALUE);
|
543
557
|
extern VALUE Magick_fonts(VALUE);
|
544
558
|
extern VALUE Magick_init_formats(VALUE);
|
@@ -547,7 +561,7 @@ extern VALUE Magick_set_cache_threshold(VALUE, VALUE);
|
|
547
561
|
extern VALUE Magick_set_log_event_mask(int, VALUE *, VALUE);
|
548
562
|
extern VALUE Magick_set_log_format(VALUE, VALUE);
|
549
563
|
|
550
|
-
// rmdraw.
|
564
|
+
// rmdraw.cpp
|
551
565
|
ATTR_WRITER(Draw, affine)
|
552
566
|
ATTR_WRITER(Draw, align)
|
553
567
|
ATTR_WRITER(Draw, border_color)
|
@@ -598,7 +612,7 @@ ATTR_WRITER(PolaroidOptions, shadow_color);
|
|
598
612
|
ATTR_WRITER(PolaroidOptions, border_color);
|
599
613
|
|
600
614
|
|
601
|
-
// rmmontage.
|
615
|
+
// rmmontage.cpp
|
602
616
|
ATTR_WRITER(Montage, background_color)
|
603
617
|
ATTR_WRITER(Montage, border_color)
|
604
618
|
ATTR_WRITER(Montage, border_width)
|
@@ -621,7 +635,7 @@ extern VALUE Montage_alloc(VALUE);
|
|
621
635
|
extern VALUE rm_montage_new(void);
|
622
636
|
|
623
637
|
|
624
|
-
// rmilist.
|
638
|
+
// rmilist.cpp
|
625
639
|
extern VALUE ImageList_animate(int, VALUE *, VALUE);
|
626
640
|
extern VALUE ImageList_append(VALUE, VALUE);
|
627
641
|
extern VALUE ImageList_average(VALUE);
|
@@ -643,7 +657,7 @@ extern VALUE ImageList_write(VALUE, VALUE);
|
|
643
657
|
extern VALUE rm_imagelist_from_images(Image *);
|
644
658
|
|
645
659
|
|
646
|
-
// rminfo.
|
660
|
+
// rminfo.cpp
|
647
661
|
ATTR_ACCESSOR(Info, antialias)
|
648
662
|
ATTR_ACCESSOR(Info, attenuate)
|
649
663
|
ATTR_ACCESSOR(Info, authenticate)
|
@@ -705,7 +719,7 @@ extern VALUE rm_info_new(void);
|
|
705
719
|
extern DisposeType rm_dispose_to_enum(const char *);
|
706
720
|
extern GravityType rm_gravity_to_enum(const char *);
|
707
721
|
|
708
|
-
// rmkinfo.
|
722
|
+
// rmkinfo.cpp
|
709
723
|
|
710
724
|
extern VALUE KernelInfo_alloc(VALUE);
|
711
725
|
|
@@ -718,7 +732,7 @@ extern VALUE KernelInfo_clone(VALUE);
|
|
718
732
|
extern VALUE KernelInfo_builtin(VALUE, VALUE, VALUE);
|
719
733
|
|
720
734
|
|
721
|
-
// rmimage.
|
735
|
+
// rmimage.cpp
|
722
736
|
ATTR_ACCESSOR(Image, background_color)
|
723
737
|
ATTR_READER(Image, base_columns)
|
724
738
|
ATTR_READER(Image, base_filename)
|
@@ -1019,10 +1033,9 @@ extern VALUE Image_write(VALUE, VALUE);
|
|
1019
1033
|
|
1020
1034
|
extern VALUE rm_image_new(Image *);
|
1021
1035
|
extern void rm_image_destroy(void *);
|
1022
|
-
extern void rm_trace_creation(Image *);
|
1023
1036
|
|
1024
1037
|
|
1025
|
-
// rmfill.
|
1038
|
+
// rmfill.cpp
|
1026
1039
|
extern VALUE GradientFill_alloc(VALUE);
|
1027
1040
|
extern VALUE GradientFill_initialize(VALUE, VALUE, VALUE, VALUE, VALUE, VALUE, VALUE);
|
1028
1041
|
extern VALUE GradientFill_fill(VALUE, VALUE);
|
@@ -1032,7 +1045,7 @@ extern VALUE TextureFill_initialize(VALUE, VALUE);
|
|
1032
1045
|
extern VALUE TextureFill_fill(VALUE, VALUE);
|
1033
1046
|
|
1034
1047
|
|
1035
|
-
// rmpixel.
|
1048
|
+
// rmpixel.cpp
|
1036
1049
|
|
1037
1050
|
|
1038
1051
|
ATTR_ACCESSOR(Pixel, red)
|
@@ -1043,7 +1056,6 @@ ATTR_ACCESSOR(Pixel, cyan)
|
|
1043
1056
|
ATTR_ACCESSOR(Pixel, magenta)
|
1044
1057
|
ATTR_ACCESSOR(Pixel, yellow)
|
1045
1058
|
ATTR_ACCESSOR(Pixel, black)
|
1046
|
-
extern void destroy_Pixel(Pixel *);
|
1047
1059
|
extern VALUE Pixel_alloc(VALUE);
|
1048
1060
|
extern VALUE Pixel_case_eq(VALUE, VALUE);
|
1049
1061
|
extern VALUE Pixel_clone(VALUE);
|
@@ -1064,7 +1076,7 @@ extern VALUE Pixel_to_hsla(VALUE);
|
|
1064
1076
|
extern VALUE Pixel_to_s(VALUE);
|
1065
1077
|
|
1066
1078
|
|
1067
|
-
// rmenum.
|
1079
|
+
// rmenum.cpp
|
1068
1080
|
extern VALUE Enum_alloc(VALUE);
|
1069
1081
|
extern VALUE Enum_initialize(VALUE, VALUE, VALUE);
|
1070
1082
|
extern VALUE Enum_to_s(VALUE);
|
@@ -1073,7 +1085,7 @@ extern VALUE Enum_spaceship(VALUE, VALUE);
|
|
1073
1085
|
extern VALUE Enum_bitwise_or(VALUE, VALUE);
|
1074
1086
|
extern VALUE Enum_case_eq(VALUE, VALUE);
|
1075
1087
|
extern VALUE Enum_type_initialize(VALUE, VALUE, VALUE);
|
1076
|
-
extern VALUE Enum_find(VALUE
|
1088
|
+
extern VALUE Enum_find(VALUE, int);
|
1077
1089
|
extern VALUE Enum_type_each(VALUE);
|
1078
1090
|
extern VALUE rm_enum_new(VALUE, VALUE, VALUE);
|
1079
1091
|
extern VALUE ClassType_find(ClassType);
|
@@ -1100,7 +1112,7 @@ extern const char *StyleType_name(StyleType);
|
|
1100
1112
|
extern VALUE VirtualPixelMethod_find(VirtualPixelMethod);
|
1101
1113
|
|
1102
1114
|
|
1103
|
-
// rmstruct.
|
1115
|
+
// rmstruct.cpp
|
1104
1116
|
extern VALUE ChromaticityInfo_to_s(VALUE);
|
1105
1117
|
extern VALUE ChromaticityInfo_new(ChromaticityInfo *);
|
1106
1118
|
extern void Color_to_PixelColor(PixelColor *, VALUE);
|
@@ -1135,7 +1147,7 @@ extern void Export_TypeInfo(TypeInfo *, VALUE);
|
|
1135
1147
|
extern VALUE Import_TypeMetric(TypeMetric *);
|
1136
1148
|
|
1137
1149
|
|
1138
|
-
// rmutil.
|
1150
|
+
// rmutil.cpp
|
1139
1151
|
extern VALUE ImageMagickError_initialize(int, VALUE *, VALUE);
|
1140
1152
|
extern void *magick_malloc(const size_t);
|
1141
1153
|
extern void *magick_safe_malloc(const size_t, const size_t);
|
@@ -1156,7 +1168,7 @@ extern void rm_check_ary_len(VALUE, long);
|
|
1156
1168
|
extern VALUE rm_check_ary_type(VALUE ary);
|
1157
1169
|
extern Image *rm_check_destroyed(VALUE);
|
1158
1170
|
extern Image *rm_check_frozen(VALUE);
|
1159
|
-
extern char *rm_str2cstr(VALUE,
|
1171
|
+
extern char *rm_str2cstr(VALUE, size_t *);
|
1160
1172
|
extern int rm_check_num2dbl(VALUE);
|
1161
1173
|
extern double rm_fuzz_to_dbl(VALUE);
|
1162
1174
|
extern Quantum rm_app2quantum(VALUE);
|
@@ -1173,6 +1185,9 @@ extern void rm_set_user_artifact(Image *, Info *);
|
|
1173
1185
|
extern void rm_sync_image_options(Image *, Info *);
|
1174
1186
|
extern void rm_split(Image *);
|
1175
1187
|
extern void rm_magick_error(const char *);
|
1188
|
+
#if defined(IMAGEMAGICK_7)
|
1189
|
+
extern void rm_set_pixelinfo_alpha(PixelInfo *, const MagickRealType);
|
1190
|
+
#endif
|
1176
1191
|
|
1177
1192
|
//! whether to retain on errors
|
1178
1193
|
typedef enum
|
@@ -1190,7 +1205,6 @@ typedef enum
|
|
1190
1205
|
extern void rm_check_exception(ExceptionInfo *, Image *, ErrorRetention);
|
1191
1206
|
extern void rm_ensure_result(Image *);
|
1192
1207
|
extern Image *rm_clone_image(Image *);
|
1193
|
-
extern MagickBooleanType rm_progress_monitor(const char *, const MagickOffsetType, const MagickSizeType, void *);
|
1194
1208
|
extern VALUE rm_exif_by_entry(Image *);
|
1195
1209
|
extern VALUE rm_exif_by_number(Image *);
|
1196
1210
|
extern void rm_get_optional_arguments(VALUE);
|
@@ -1199,10 +1213,26 @@ extern void rm_error_handler(const ExceptionType, const char *, const char *);
|
|
1199
1213
|
extern void rm_warning_handler(const ExceptionType, const char *, const char *);
|
1200
1214
|
extern MagickBooleanType rm_should_raise_exception(ExceptionInfo *, const ExceptionRetention);
|
1201
1215
|
extern void rm_raise_exception(ExceptionInfo *);
|
1202
|
-
extern
|
1216
|
+
extern VALUE rm_io_path(VALUE);
|
1203
1217
|
#if defined(IMAGEMAGICK_6)
|
1204
1218
|
extern void rm_check_image_exception(Image *, ErrorRetention);
|
1205
1219
|
#endif
|
1206
1220
|
|
1221
|
+
#if !defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0)
|
1222
|
+
/* UnityAddKernelInfo() was private function until IM 6.9 */
|
1223
|
+
MagickExport void UnityAddKernelInfo(KernelInfo *kernel, const double scale);
|
1224
|
+
/* ScaleKernelInfo() was private function until IM 6.9 */
|
1225
|
+
MagickExport void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor, const GeometryFlags normalize_flags);
|
1226
|
+
#endif
|
1227
|
+
|
1228
|
+
#if (RUBY_VERSION_MAJOR == 2 && RUBY_VERSION_MINOR < 7)
|
1229
|
+
#define RESCUE_FUNC(func) (VALUE (*)(ANYARGS))(func)
|
1230
|
+
#define RESCUE_EXCEPTION_HANDLER_FUNC(func) (VALUE (*)(ANYARGS))(func)
|
1231
|
+
#else
|
1232
|
+
#define RESCUE_FUNC(func) (VALUE(*)(VALUE))(func)
|
1233
|
+
#define RESCUE_EXCEPTION_HANDLER_FUNC(func) (VALUE(*)(VALUE, VALUE))(func)
|
1207
1234
|
#endif
|
1208
1235
|
|
1236
|
+
} // extern "C"
|
1237
|
+
|
1238
|
+
#endif
|
@@ -0,0 +1,224 @@
|
|
1
|
+
#ifndef _RMAGICK_GVL_H_
|
2
|
+
#define _RMAGICK_GVL_H_
|
3
|
+
|
4
|
+
#include "ruby/thread.h"
|
5
|
+
|
6
|
+
typedef void *(gvl_function_t)(void *);
|
7
|
+
|
8
|
+
#define GVL_FUNC(name) name##_gvl
|
9
|
+
#define GVL_STRUCT_TYPE(name) name##_args_t
|
10
|
+
#define CALL_FUNC_WITHOUT_GVL(fp, args) \
|
11
|
+
rb_thread_call_without_gvl(fp, args, RUBY_UBF_PROCESS, NULL)
|
12
|
+
|
13
|
+
|
14
|
+
#define DEFINE_GVL_STRUCT1(name, type1) \
|
15
|
+
typedef struct { \
|
16
|
+
type1 arg1; \
|
17
|
+
} GVL_STRUCT_TYPE(name)
|
18
|
+
#define DEFINE_GVL_FUNC1(func_name, struct_name) \
|
19
|
+
static void *func_name##_gvl(void *p) \
|
20
|
+
{ \
|
21
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
22
|
+
return (void *)func_name(args->arg1); \
|
23
|
+
}
|
24
|
+
|
25
|
+
#define DEFINE_GVL_STUB1(name, type1) \
|
26
|
+
DEFINE_GVL_STRUCT1(name, type1); \
|
27
|
+
DEFINE_GVL_FUNC1(name, name)
|
28
|
+
|
29
|
+
|
30
|
+
#define DEFINE_GVL_STRUCT2(name, type1, type2) \
|
31
|
+
typedef struct { \
|
32
|
+
type1 arg1; \
|
33
|
+
type2 arg2; \
|
34
|
+
} GVL_STRUCT_TYPE(name)
|
35
|
+
#define DEFINE_GVL_FUNC2(func_name, struct_name) \
|
36
|
+
static void *func_name##_gvl(void *p) \
|
37
|
+
{ \
|
38
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
39
|
+
return (void *)func_name(args->arg1, args->arg2); \
|
40
|
+
}
|
41
|
+
|
42
|
+
#define DEFINE_GVL_STUB2(name, type1, type2) \
|
43
|
+
DEFINE_GVL_STRUCT2(name, type1, type2); \
|
44
|
+
DEFINE_GVL_FUNC2(name, name)
|
45
|
+
|
46
|
+
|
47
|
+
#define DEFINE_GVL_STRUCT3(name, type1, type2, type3) \
|
48
|
+
typedef struct { \
|
49
|
+
type1 arg1; \
|
50
|
+
type2 arg2; \
|
51
|
+
type3 arg3; \
|
52
|
+
} GVL_STRUCT_TYPE(name)
|
53
|
+
#define DEFINE_GVL_FUNC3(func_name, struct_name) \
|
54
|
+
static void *func_name##_gvl(void *p) \
|
55
|
+
{ \
|
56
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
57
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3); \
|
58
|
+
}
|
59
|
+
|
60
|
+
#define DEFINE_GVL_STUB3(name, type1, type2, type3) \
|
61
|
+
DEFINE_GVL_STRUCT3(name, type1, type2, type3); \
|
62
|
+
DEFINE_GVL_FUNC3(name, name)
|
63
|
+
|
64
|
+
|
65
|
+
#define DEFINE_GVL_STRUCT4(name, type1, type2, type3, type4) \
|
66
|
+
typedef struct { \
|
67
|
+
type1 arg1; \
|
68
|
+
type2 arg2; \
|
69
|
+
type3 arg3; \
|
70
|
+
type4 arg4; \
|
71
|
+
} GVL_STRUCT_TYPE(name)
|
72
|
+
#define DEFINE_GVL_FUNC4(func_name, struct_name) \
|
73
|
+
static void *func_name##_gvl(void *p) \
|
74
|
+
{ \
|
75
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
76
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4); \
|
77
|
+
}
|
78
|
+
|
79
|
+
#define DEFINE_GVL_STUB4(name, type1, type2, type3, type4) \
|
80
|
+
DEFINE_GVL_STRUCT4(name, type1, type2, type3, type4); \
|
81
|
+
DEFINE_GVL_FUNC4(name, name)
|
82
|
+
|
83
|
+
|
84
|
+
#define DEFINE_GVL_STRUCT5(name, type1, type2, type3, type4, type5) \
|
85
|
+
typedef struct { \
|
86
|
+
type1 arg1; \
|
87
|
+
type2 arg2; \
|
88
|
+
type3 arg3; \
|
89
|
+
type4 arg4; \
|
90
|
+
type5 arg5; \
|
91
|
+
} GVL_STRUCT_TYPE(name)
|
92
|
+
#define DEFINE_GVL_FUNC5(func_name, struct_name) \
|
93
|
+
static void *func_name##_gvl(void *p) \
|
94
|
+
{ \
|
95
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
96
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5); \
|
97
|
+
}
|
98
|
+
#define DEFINE_GVL_STUB5(name, type1, type2, type3, type4, type5) \
|
99
|
+
DEFINE_GVL_STRUCT5(name, type1, type2, type3, type4, type5); \
|
100
|
+
DEFINE_GVL_FUNC5(name, name)
|
101
|
+
|
102
|
+
|
103
|
+
#define DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6) \
|
104
|
+
typedef struct { \
|
105
|
+
type1 arg1; \
|
106
|
+
type2 arg2; \
|
107
|
+
type3 arg3; \
|
108
|
+
type4 arg4; \
|
109
|
+
type5 arg5; \
|
110
|
+
type6 arg6; \
|
111
|
+
} GVL_STRUCT_TYPE(name)
|
112
|
+
#define DEFINE_GVL_FUNC6(func_name, struct_name) \
|
113
|
+
static void *func_name##_gvl(void *p) \
|
114
|
+
{ \
|
115
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
116
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); \
|
117
|
+
}
|
118
|
+
#define DEFINE_GVL_STUB6(name, type1, type2, type3, type4, type5, type6) \
|
119
|
+
DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6); \
|
120
|
+
DEFINE_GVL_FUNC6(name, name)
|
121
|
+
|
122
|
+
|
123
|
+
#define DEFINE_GVL_STRUCT7(name, type1, type2, type3, type4, type5, type6, type7) \
|
124
|
+
typedef struct { \
|
125
|
+
type1 arg1; \
|
126
|
+
type2 arg2; \
|
127
|
+
type3 arg3; \
|
128
|
+
type4 arg4; \
|
129
|
+
type5 arg5; \
|
130
|
+
type6 arg6; \
|
131
|
+
type7 arg7; \
|
132
|
+
} GVL_STRUCT_TYPE(name)
|
133
|
+
#define DEFINE_GVL_FUNC7(func_name, struct_name) \
|
134
|
+
static void *func_name##_gvl(void *p) \
|
135
|
+
{ \
|
136
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
137
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7); \
|
138
|
+
}
|
139
|
+
#define DEFINE_GVL_STUB7(name, type1, type2, type3, type4, type5, type6, type7) \
|
140
|
+
DEFINE_GVL_STRUCT7(name, type1, type2, type3, type4, type5, type6, type7); \
|
141
|
+
DEFINE_GVL_FUNC7(name, name)
|
142
|
+
|
143
|
+
|
144
|
+
#define DEFINE_GVL_STRUCT8(name, type1, type2, type3, type4, type5, type6, type7, type8) \
|
145
|
+
typedef struct { \
|
146
|
+
type1 arg1; \
|
147
|
+
type2 arg2; \
|
148
|
+
type3 arg3; \
|
149
|
+
type4 arg4; \
|
150
|
+
type5 arg5; \
|
151
|
+
type6 arg6; \
|
152
|
+
type7 arg7; \
|
153
|
+
type8 arg8; \
|
154
|
+
} GVL_STRUCT_TYPE(name)
|
155
|
+
#define DEFINE_GVL_FUNC8(func_name, struct_name) \
|
156
|
+
static void *func_name##_gvl(void *p) \
|
157
|
+
{ \
|
158
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
159
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7, args->arg8); \
|
160
|
+
}
|
161
|
+
#define DEFINE_GVL_STUB8(name, type1, type2, type3, type4, type5, type6, type7, type8) \
|
162
|
+
DEFINE_GVL_STRUCT8(name, type1, type2, type3, type4, type5, type6, type7, type8); \
|
163
|
+
DEFINE_GVL_FUNC8(name, name)
|
164
|
+
|
165
|
+
|
166
|
+
#define DEFINE_GVL_STRUCT9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9) \
|
167
|
+
typedef struct { \
|
168
|
+
type1 arg1; \
|
169
|
+
type2 arg2; \
|
170
|
+
type3 arg3; \
|
171
|
+
type4 arg4; \
|
172
|
+
type5 arg5; \
|
173
|
+
type6 arg6; \
|
174
|
+
type7 arg7; \
|
175
|
+
type8 arg8; \
|
176
|
+
type9 arg9; \
|
177
|
+
} GVL_STRUCT_TYPE(name)
|
178
|
+
#define DEFINE_GVL_FUNC9(func_name, struct_name) \
|
179
|
+
static void *func_name##_gvl(void *p) \
|
180
|
+
{ \
|
181
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
182
|
+
return (void *)func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6, args->arg7, args->arg8, args->arg9); \
|
183
|
+
}
|
184
|
+
#define DEFINE_GVL_STUB9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9) \
|
185
|
+
DEFINE_GVL_STRUCT9(name, type1, type2, type3, type4, type5, type6, type7, type8, type9); \
|
186
|
+
DEFINE_GVL_FUNC9(name, name)
|
187
|
+
|
188
|
+
|
189
|
+
#define DEFINE_GVL_VOID_FUNC2(func_name, struct_name) \
|
190
|
+
static void *func_name##_gvl(void *p) \
|
191
|
+
{ \
|
192
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
193
|
+
func_name(args->arg1, args->arg2); \
|
194
|
+
return NULL; \
|
195
|
+
}
|
196
|
+
#define DEFINE_GVL_VOID_STUB2(name, type1, type2) \
|
197
|
+
DEFINE_GVL_STRUCT2(name, type1, type2); \
|
198
|
+
DEFINE_GVL_VOID_FUNC2(name, name)
|
199
|
+
|
200
|
+
|
201
|
+
#define DEFINE_GVL_VOID_FUNC3(func_name, struct_name) \
|
202
|
+
static void *func_name##_gvl(void *p) \
|
203
|
+
{ \
|
204
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
205
|
+
func_name(args->arg1, args->arg2, args->arg3); \
|
206
|
+
return NULL; \
|
207
|
+
}
|
208
|
+
#define DEFINE_GVL_VOID_STUB3(name, type1, type2, type3) \
|
209
|
+
DEFINE_GVL_STRUCT3(name, type1, type2, type3); \
|
210
|
+
DEFINE_GVL_VOID_FUNC3(name, name)
|
211
|
+
|
212
|
+
|
213
|
+
#define DEFINE_GVL_VOID_FUNC6(func_name, struct_name) \
|
214
|
+
static void *func_name##_gvl(void *p) \
|
215
|
+
{ \
|
216
|
+
GVL_STRUCT_TYPE(struct_name) *args = (GVL_STRUCT_TYPE(struct_name) *)p; \
|
217
|
+
func_name(args->arg1, args->arg2, args->arg3, args->arg4, args->arg5, args->arg6); \
|
218
|
+
return NULL; \
|
219
|
+
}
|
220
|
+
#define DEFINE_GVL_VOID_STUB6(name, type1, type2, type3, type4, type5, type6) \
|
221
|
+
DEFINE_GVL_STRUCT6(name, type1, type2, type3, type4, type5, type6); \
|
222
|
+
DEFINE_GVL_VOID_FUNC6(name, name)
|
223
|
+
|
224
|
+
#endif
|