rmagick 5.4.3 → 5.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/ci.yml +15 -0
  3. data/.gitignore +1 -0
  4. data/.rubocop_todo.yml +16 -8
  5. data/CHANGELOG.md +50 -0
  6. data/Gemfile +20 -0
  7. data/Rakefile +11 -0
  8. data/before_install_osx.sh +1 -1
  9. data/ext/RMagick/extconf.rb +27 -11
  10. data/ext/RMagick/rmagick.h +3 -1
  11. data/ext/RMagick/rmdraw.cpp +10 -10
  12. data/ext/RMagick/rmfill.cpp +4 -4
  13. data/ext/RMagick/rmilist.cpp +10 -2
  14. data/ext/RMagick/rmimage.cpp +321 -294
  15. data/ext/RMagick/rminfo.cpp +22 -21
  16. data/ext/RMagick/rmkinfo.cpp +5 -18
  17. data/ext/RMagick/rmmain.cpp +30 -64
  18. data/ext/RMagick/rmmontage.cpp +5 -5
  19. data/ext/RMagick/rmpixel.cpp +9 -7
  20. data/ext/RMagick/rmutil.cpp +31 -71
  21. data/lib/rmagick/version.rb +1 -1
  22. data/lib/rmagick_internal.rb +67 -65
  23. data/lib/rvg/embellishable.rb +6 -2
  24. data/lib/rvg/misc.rb +7 -7
  25. data/lib/rvg/rvg.rb +2 -0
  26. data/lib/rvg/stretchable.rb +2 -2
  27. data/lib/rvg/transformable.rb +1 -1
  28. data/rmagick.gemspec +1 -13
  29. data/sig/rmagick/_draw_common_methods.rbs +64 -0
  30. data/sig/rmagick/_image_common_methods.rbs +389 -0
  31. data/sig/rmagick/draw.rbs +38 -0
  32. data/sig/rmagick/draw_attribute.rbs +28 -0
  33. data/sig/rmagick/enum.rbs +814 -0
  34. data/sig/rmagick/error.rbs +11 -0
  35. data/sig/rmagick/fill.rbs +21 -0
  36. data/sig/rmagick/geometry.rbs +14 -0
  37. data/sig/rmagick/image.rbs +194 -0
  38. data/sig/rmagick/image_list.rbs +181 -0
  39. data/sig/rmagick/iptc.rbs +101 -0
  40. data/sig/rmagick/kernel_info.rbs +12 -0
  41. data/sig/rmagick/optional_method_arguments.rbs +10 -0
  42. data/sig/rmagick/pixel.rbs +46 -0
  43. data/sig/rmagick/struct.rbs +90 -0
  44. data/sig/rmagick.rbs +43 -0
  45. data/sig/rvg/clippath.rbs +34 -0
  46. data/sig/rvg/container.rbs +78 -0
  47. data/sig/rvg/deep_equal.rbs +48 -0
  48. data/sig/rvg/describable.rbs +30 -0
  49. data/sig/rvg/embellishable.rbs +226 -0
  50. data/sig/rvg/misc.rbs +145 -0
  51. data/sig/rvg/paint.rbs +55 -0
  52. data/sig/rvg/pathdata.rbs +77 -0
  53. data/sig/rvg/rvg.rbs +125 -0
  54. data/sig/rvg/stretchable.rbs +56 -0
  55. data/sig/rvg/stylable.rbs +66 -0
  56. data/sig/rvg/text.rbs +118 -0
  57. data/sig/rvg/transformable.rbs +59 -0
  58. data/sig/rvg/units.rbs +33 -0
  59. metadata +32 -128
@@ -819,8 +819,8 @@ Info_density(VALUE self)
819
819
  /**
820
820
  * Set the text rendering density geometry
821
821
  *
822
- * @param density_arg [String] the density
823
- * @return [String] the given value
822
+ * @param density_arg [Magick::Geometry, String] the density
823
+ * @return [Magick::Geometry, String] the given value
824
824
  * @see https://www.imagemagick.org/Magick++/Geometry.html
825
825
  */
826
826
  VALUE
@@ -836,7 +836,7 @@ Info_density_eq(VALUE self, VALUE density_arg)
836
836
  {
837
837
  magick_free(info->density);
838
838
  info->density = NULL;
839
- return self;
839
+ return density_arg;
840
840
  }
841
841
 
842
842
  density = rb_String(density_arg);
@@ -1000,7 +1000,7 @@ Info_dispose_eq(VALUE self, VALUE disp)
1000
1000
  if (NIL_P(disp))
1001
1001
  {
1002
1002
  DeleteImageOption(info, "dispose");
1003
- return self;
1003
+ return disp;
1004
1004
  }
1005
1005
 
1006
1006
  VALUE_TO_ENUM(disp, dispose, DisposeType);
@@ -1096,8 +1096,8 @@ Info_extract(VALUE self)
1096
1096
  /**
1097
1097
  * Set the extract geometry.
1098
1098
  *
1099
- * @param extract_arg [String] the extract string
1100
- * @return [String] the given value
1099
+ * @param extract_arg [Magick::Geometry, String] the extract string
1100
+ * @return [Magick::Geometry, String] the given value
1101
1101
  * @see https://www.imagemagick.org/Magick++/Geometry.html
1102
1102
  */
1103
1103
  VALUE
@@ -1113,7 +1113,7 @@ Info_extract_eq(VALUE self, VALUE extract_arg)
1113
1113
  {
1114
1114
  magick_free(info->extract);
1115
1115
  info->extract = NULL;
1116
- return self;
1116
+ return extract_arg;
1117
1117
  }
1118
1118
 
1119
1119
  extract = rb_String(extract_arg);
@@ -1431,7 +1431,7 @@ Info_gravity_eq(VALUE self, VALUE grav)
1431
1431
  if (NIL_P(grav))
1432
1432
  {
1433
1433
  DeleteImageOption(info, "gravity");
1434
- return self;
1434
+ return grav;
1435
1435
  }
1436
1436
 
1437
1437
  VALUE_TO_ENUM(grav, gravity, GravityType);
@@ -1668,8 +1668,8 @@ Info_origin(VALUE self)
1668
1668
  * The geometry format is
1669
1669
  * +-x+-y
1670
1670
  *
1671
- * @param origin_arg [String] the origin geometry
1672
- * @return [String] the given value
1671
+ * @param origin_arg [Magick::Geometry, String] the origin geometry
1672
+ * @return [Magick::Geometry, String] the given value
1673
1673
  * @see https://www.imagemagick.org/Magick++/Geometry.html
1674
1674
  */
1675
1675
  VALUE
@@ -1684,7 +1684,7 @@ Info_origin_eq(VALUE self, VALUE origin_arg)
1684
1684
  if (NIL_P(origin_arg))
1685
1685
  {
1686
1686
  DeleteImageOption(info, "origin");
1687
- return self;
1687
+ return origin_arg;
1688
1688
  }
1689
1689
 
1690
1690
  origin_str = rb_String(origin_arg);
@@ -1724,8 +1724,8 @@ Info_page(VALUE self)
1724
1724
  * Store the Postscript page geometry. Argument may be a Geometry object as well
1725
1725
  * as a geometry string.
1726
1726
  *
1727
- * @param page_arg [String] the geometry
1728
- * @return [String] the given value
1727
+ * @param page_arg [Magick::Geometry, String] the geometry
1728
+ * @return [Magick::Geometry, String] the given value
1729
1729
  * @see https://www.imagemagick.org/Magick++/Geometry.html
1730
1730
  */
1731
1731
  VALUE
@@ -1740,7 +1740,7 @@ Info_page_eq(VALUE self, VALUE page_arg)
1740
1740
  {
1741
1741
  magick_free(info->page);
1742
1742
  info->page = NULL;
1743
- return self;
1743
+ return page_arg;
1744
1744
  }
1745
1745
  geom_str = rb_String(page_arg);
1746
1746
  geometry = GetPageGeometry(StringValueCStr(geom_str));
@@ -1748,7 +1748,7 @@ Info_page_eq(VALUE self, VALUE page_arg)
1748
1748
  {
1749
1749
  magick_free(info->page);
1750
1750
  info->page = NULL;
1751
- return self;
1751
+ return page_arg;
1752
1752
  }
1753
1753
  info->page = geometry;
1754
1754
 
@@ -1949,8 +1949,8 @@ Info_size(VALUE self)
1949
1949
  /**
1950
1950
  * Set the size (either as a Geometry object or a Geometry string
1951
1951
  *
1952
- * @param size_arg [String] the size
1953
- * @return [String] the given value
1952
+ * @param size_arg [Magick::Geometry, String] the size
1953
+ * @return [Magick::Geometry, String] the given value
1954
1954
  * @see https://www.imagemagick.org/Magick++/Geometry.html
1955
1955
  */
1956
1956
  VALUE
@@ -1966,7 +1966,7 @@ Info_size_eq(VALUE self, VALUE size_arg)
1966
1966
  {
1967
1967
  magick_free(info->size);
1968
1968
  info->size = NULL;
1969
- return self;
1969
+ return size_arg;
1970
1970
  }
1971
1971
 
1972
1972
  size = rb_String(size_arg);
@@ -2100,8 +2100,8 @@ Info_tile_offset(VALUE self)
2100
2100
  /**
2101
2101
  * Set tile offset geometry.
2102
2102
  *
2103
- * @param offset [String] the offset geometry
2104
- * @return [String] the given value
2103
+ * @param offset [Magick::Geometry, String] the offset geometry
2104
+ * @return [Magick::Geometry, String] the given value
2105
2105
  * @see https://www.imagemagick.org/Magick++/Geometry.html
2106
2106
  */
2107
2107
  VALUE
@@ -2401,7 +2401,8 @@ rm_info_new(void)
2401
2401
  * @overload initialize
2402
2402
  *
2403
2403
  * @overload initialize
2404
- * @yield [Magick::Image::Info]
2404
+ * @yield [info]
2405
+ * @yieldparam info [Magick::Image::Info]
2405
2406
  *
2406
2407
  * @return self
2407
2408
  */
@@ -74,15 +74,13 @@ VALUE
74
74
  KernelInfo_initialize(VALUE self, VALUE kernel_string)
75
75
  {
76
76
  KernelInfo *kernel;
77
+ char *string = StringValueCStr(kernel_string);
78
+
77
79
  #if defined(IMAGEMAGICK_7)
78
80
  ExceptionInfo *exception;
79
- #endif
80
-
81
- Check_Type(kernel_string, T_STRING);
82
81
 
83
- #if defined(IMAGEMAGICK_7)
84
82
  exception = AcquireExceptionInfo();
85
- kernel = AcquireKernelInfo(StringValueCStr(kernel_string), exception);
83
+ kernel = AcquireKernelInfo(string, exception);
86
84
  if (rm_should_raise_exception(exception, DestroyExceptionRetention))
87
85
  {
88
86
  if (kernel != (KernelInfo *) NULL)
@@ -92,7 +90,7 @@ KernelInfo_initialize(VALUE self, VALUE kernel_string)
92
90
  rm_raise_exception(exception);
93
91
  }
94
92
  #else
95
- kernel = AcquireKernelInfo(StringValueCStr(kernel_string));
93
+ kernel = AcquireKernelInfo(string);
96
94
  #endif
97
95
 
98
96
  if (!kernel)
@@ -114,9 +112,6 @@ KernelInfo_initialize(VALUE self, VALUE kernel_string)
114
112
  VALUE
115
113
  KernelInfo_unity_add(VALUE self, VALUE scale)
116
114
  {
117
- if (!FIXNUM_P(scale))
118
- Check_Type(scale, T_FLOAT);
119
-
120
115
  GVL_STRUCT_TYPE(UnityAddKernelInfo) args = { (KernelInfo*)DATA_PTR(self), NUM2DBL(scale) };
121
116
  CALL_FUNC_WITHOUT_GVL(GVL_FUNC(UnityAddKernelInfo), &args);
122
117
  return Qnil;
@@ -136,13 +131,7 @@ KernelInfo_scale(VALUE self, VALUE scale, VALUE flags)
136
131
  {
137
132
  GeometryFlags geoflags;
138
133
 
139
- if (!FIXNUM_P(scale))
140
- Check_Type(scale, T_FLOAT);
141
-
142
- if (rb_obj_is_instance_of(flags, Class_GeometryFlags))
143
- VALUE_TO_ENUM(flags, geoflags, GeometryFlags);
144
- else
145
- rb_raise(rb_eArgError, "expected Integer or Magick::GeometryFlags to specify flags");
134
+ VALUE_TO_ENUM(flags, geoflags, GeometryFlags);
146
135
 
147
136
  GVL_STRUCT_TYPE(ScaleKernelInfo) args = { (KernelInfo*)DATA_PTR(self), NUM2DBL(scale), geoflags };
148
137
  CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ScaleKernelInfo), &args);
@@ -158,7 +147,6 @@ KernelInfo_scale(VALUE self, VALUE scale, VALUE flags)
158
147
  VALUE
159
148
  KernelInfo_scale_geometry(VALUE self, VALUE geometry)
160
149
  {
161
- Check_Type(geometry, T_STRING);
162
150
  GVL_STRUCT_TYPE(ScaleGeometryKernelInfo) args = { (KernelInfo*)DATA_PTR(self), StringValueCStr(geometry) };
163
151
  CALL_FUNC_WITHOUT_GVL(GVL_FUNC(ScaleGeometryKernelInfo), &args);
164
152
  return Qnil;
@@ -195,7 +183,6 @@ KernelInfo_builtin(VALUE self, VALUE what, VALUE geometry)
195
183
  ExceptionInfo *exception;
196
184
  #endif
197
185
 
198
- Check_Type(geometry, T_STRING);
199
186
  VALUE_TO_ENUM(what, kernel_type, KernelInfoType);
200
187
  ParseGeometry(StringValueCStr(geometry), &info);
201
188
 
@@ -653,30 +653,33 @@ Init_RMagick2(void)
653
653
  rb_define_alloc_func(Class_Draw, Draw_alloc);
654
654
 
655
655
  // Define the attributes
656
- rb_define_method(Class_Draw, "affine=", RUBY_METHOD_FUNC(Draw_affine_eq), 1);
657
- rb_define_method(Class_Draw, "align=", RUBY_METHOD_FUNC(Draw_align_eq), 1);
658
- rb_define_method(Class_Draw, "decorate=", RUBY_METHOD_FUNC(Draw_decorate_eq), 1);
659
- rb_define_method(Class_Draw, "density=", RUBY_METHOD_FUNC(Draw_density_eq), 1);
660
- rb_define_method(Class_Draw, "encoding=", RUBY_METHOD_FUNC(Draw_encoding_eq), 1);
661
- rb_define_method(Class_Draw, "fill=", RUBY_METHOD_FUNC(Draw_fill_eq), 1);
662
- rb_define_method(Class_Draw, "fill_pattern=", RUBY_METHOD_FUNC(Draw_fill_pattern_eq), 1);
663
- rb_define_method(Class_Draw, "font=", RUBY_METHOD_FUNC(Draw_font_eq), 1);
664
- rb_define_method(Class_Draw, "font_family=", RUBY_METHOD_FUNC(Draw_font_family_eq), 1);
665
- rb_define_method(Class_Draw, "font_stretch=", RUBY_METHOD_FUNC(Draw_font_stretch_eq), 1);
666
- rb_define_method(Class_Draw, "font_style=", RUBY_METHOD_FUNC(Draw_font_style_eq), 1);
667
- rb_define_method(Class_Draw, "font_weight=", RUBY_METHOD_FUNC(Draw_font_weight_eq), 1);
668
- rb_define_method(Class_Draw, "gravity=", RUBY_METHOD_FUNC(Draw_gravity_eq), 1);
669
- rb_define_method(Class_Draw, "interline_spacing=", RUBY_METHOD_FUNC(Draw_interline_spacing_eq), 1);
670
- rb_define_method(Class_Draw, "interword_spacing=", RUBY_METHOD_FUNC(Draw_interword_spacing_eq), 1);
671
- rb_define_method(Class_Draw, "kerning=", RUBY_METHOD_FUNC(Draw_kerning_eq), 1);
672
- rb_define_method(Class_Draw, "pointsize=", RUBY_METHOD_FUNC(Draw_pointsize_eq), 1);
673
- rb_define_method(Class_Draw, "rotation=", RUBY_METHOD_FUNC(Draw_rotation_eq), 1);
674
- rb_define_method(Class_Draw, "stroke=", RUBY_METHOD_FUNC(Draw_stroke_eq), 1);
675
- rb_define_method(Class_Draw, "stroke_pattern=", RUBY_METHOD_FUNC(Draw_stroke_pattern_eq), 1);
676
- rb_define_method(Class_Draw, "stroke_width=", RUBY_METHOD_FUNC(Draw_stroke_width_eq), 1);
677
- rb_define_method(Class_Draw, "text_antialias=", RUBY_METHOD_FUNC(Draw_text_antialias_eq), 1);
678
- rb_define_method(Class_Draw, "tile=", RUBY_METHOD_FUNC(Draw_tile_eq), 1);
679
- rb_define_method(Class_Draw, "undercolor=", RUBY_METHOD_FUNC(Draw_undercolor_eq), 1);
656
+ Module_DrawAttribute = rb_define_module_under(Module_Magick, "DrawAttribute");
657
+ rb_define_method(Module_DrawAttribute, "affine=", RUBY_METHOD_FUNC(Draw_affine_eq), 1);
658
+ rb_define_method(Module_DrawAttribute, "align=", RUBY_METHOD_FUNC(Draw_align_eq), 1);
659
+ rb_define_method(Module_DrawAttribute, "decorate=", RUBY_METHOD_FUNC(Draw_decorate_eq), 1);
660
+ rb_define_method(Module_DrawAttribute, "density=", RUBY_METHOD_FUNC(Draw_density_eq), 1);
661
+ rb_define_method(Module_DrawAttribute, "encoding=", RUBY_METHOD_FUNC(Draw_encoding_eq), 1);
662
+ rb_define_method(Module_DrawAttribute, "fill=", RUBY_METHOD_FUNC(Draw_fill_eq), 1);
663
+ rb_define_method(Module_DrawAttribute, "fill_pattern=", RUBY_METHOD_FUNC(Draw_fill_pattern_eq), 1);
664
+ rb_define_method(Module_DrawAttribute, "font=", RUBY_METHOD_FUNC(Draw_font_eq), 1);
665
+ rb_define_method(Module_DrawAttribute, "font_family=", RUBY_METHOD_FUNC(Draw_font_family_eq), 1);
666
+ rb_define_method(Module_DrawAttribute, "font_stretch=", RUBY_METHOD_FUNC(Draw_font_stretch_eq), 1);
667
+ rb_define_method(Module_DrawAttribute, "font_style=", RUBY_METHOD_FUNC(Draw_font_style_eq), 1);
668
+ rb_define_method(Module_DrawAttribute, "font_weight=", RUBY_METHOD_FUNC(Draw_font_weight_eq), 1);
669
+ rb_define_method(Module_DrawAttribute, "gravity=", RUBY_METHOD_FUNC(Draw_gravity_eq), 1);
670
+ rb_define_method(Module_DrawAttribute, "interline_spacing=", RUBY_METHOD_FUNC(Draw_interline_spacing_eq), 1);
671
+ rb_define_method(Module_DrawAttribute, "interword_spacing=", RUBY_METHOD_FUNC(Draw_interword_spacing_eq), 1);
672
+ rb_define_method(Module_DrawAttribute, "kerning=", RUBY_METHOD_FUNC(Draw_kerning_eq), 1);
673
+ rb_define_method(Module_DrawAttribute, "pointsize=", RUBY_METHOD_FUNC(Draw_pointsize_eq), 1);
674
+ rb_define_method(Module_DrawAttribute, "rotation=", RUBY_METHOD_FUNC(Draw_rotation_eq), 1);
675
+ rb_define_method(Module_DrawAttribute, "stroke=", RUBY_METHOD_FUNC(Draw_stroke_eq), 1);
676
+ rb_define_method(Module_DrawAttribute, "stroke_pattern=", RUBY_METHOD_FUNC(Draw_stroke_pattern_eq), 1);
677
+ rb_define_method(Module_DrawAttribute, "stroke_width=", RUBY_METHOD_FUNC(Draw_stroke_width_eq), 1);
678
+ rb_define_method(Module_DrawAttribute, "text_antialias=", RUBY_METHOD_FUNC(Draw_text_antialias_eq), 1);
679
+ rb_define_method(Module_DrawAttribute, "tile=", RUBY_METHOD_FUNC(Draw_tile_eq), 1);
680
+ rb_define_method(Module_DrawAttribute, "undercolor=", RUBY_METHOD_FUNC(Draw_undercolor_eq), 1);
681
+
682
+ rb_include_module(Class_Draw, Module_DrawAttribute);
680
683
 
681
684
  rb_define_method(Class_Draw, "annotate", RUBY_METHOD_FUNC(Draw_annotate), 6);
682
685
  rb_define_method(Class_Draw, "clone", RUBY_METHOD_FUNC(Draw_clone), 0);
@@ -704,27 +707,8 @@ Init_RMagick2(void)
704
707
 
705
708
  rb_define_method(Class_DrawOptions, "initialize", RUBY_METHOD_FUNC(DrawOptions_initialize), 0);
706
709
 
707
- rb_define_method(Class_DrawOptions, "affine=", RUBY_METHOD_FUNC(Draw_affine_eq), 1);
708
- rb_define_method(Class_DrawOptions, "align=", RUBY_METHOD_FUNC(Draw_align_eq), 1);
709
- rb_define_method(Class_DrawOptions, "decorate=", RUBY_METHOD_FUNC(Draw_decorate_eq), 1);
710
- rb_define_method(Class_DrawOptions, "density=", RUBY_METHOD_FUNC(Draw_density_eq), 1);
711
- rb_define_method(Class_DrawOptions, "encoding=", RUBY_METHOD_FUNC(Draw_encoding_eq), 1);
712
- rb_define_method(Class_DrawOptions, "fill=", RUBY_METHOD_FUNC(Draw_fill_eq), 1);
713
- rb_define_method(Class_DrawOptions, "fill_pattern=", RUBY_METHOD_FUNC(Draw_fill_pattern_eq), 1);
714
- rb_define_method(Class_DrawOptions, "font=", RUBY_METHOD_FUNC(Draw_font_eq), 1);
715
- rb_define_method(Class_DrawOptions, "font_family=", RUBY_METHOD_FUNC(Draw_font_family_eq), 1);
716
- rb_define_method(Class_DrawOptions, "font_stretch=", RUBY_METHOD_FUNC(Draw_font_stretch_eq), 1);
717
- rb_define_method(Class_DrawOptions, "font_style=", RUBY_METHOD_FUNC(Draw_font_style_eq), 1);
718
- rb_define_method(Class_DrawOptions, "font_weight=", RUBY_METHOD_FUNC(Draw_font_weight_eq), 1);
719
- rb_define_method(Class_DrawOptions, "gravity=", RUBY_METHOD_FUNC(Draw_gravity_eq), 1);
720
- rb_define_method(Class_DrawOptions, "pointsize=", RUBY_METHOD_FUNC(Draw_pointsize_eq), 1);
721
- rb_define_method(Class_DrawOptions, "rotation=", RUBY_METHOD_FUNC(Draw_rotation_eq), 1);
722
- rb_define_method(Class_DrawOptions, "stroke=", RUBY_METHOD_FUNC(Draw_stroke_eq), 1);
723
- rb_define_method(Class_DrawOptions, "stroke_pattern=", RUBY_METHOD_FUNC(Draw_stroke_pattern_eq), 1);
724
- rb_define_method(Class_DrawOptions, "stroke_width=", RUBY_METHOD_FUNC(Draw_stroke_width_eq), 1);
725
- rb_define_method(Class_DrawOptions, "text_antialias=", RUBY_METHOD_FUNC(Draw_text_antialias_eq), 1);
726
- rb_define_method(Class_DrawOptions, "tile=", RUBY_METHOD_FUNC(Draw_tile_eq), 1);
727
- rb_define_method(Class_DrawOptions, "undercolor=", RUBY_METHOD_FUNC(Draw_undercolor_eq), 1);
710
+ rb_include_module(Class_DrawOptions, Module_DrawAttribute);
711
+
728
712
 
729
713
  /*-----------------------------------------------------------------------*/
730
714
  /* Class Magick::Pixel */
@@ -948,25 +932,7 @@ Init_RMagick2(void)
948
932
  rb_define_method(Class_PolaroidOptions, "border_color=", RUBY_METHOD_FUNC(PolaroidOptions_border_color_eq), 1);
949
933
 
950
934
  // The other attribute writer methods are implemented by Draw's functions
951
- rb_define_method(Class_PolaroidOptions, "align=", RUBY_METHOD_FUNC(Draw_align_eq), 1);
952
- rb_define_method(Class_PolaroidOptions, "decorate=", RUBY_METHOD_FUNC(Draw_decorate_eq), 1);
953
- rb_define_method(Class_PolaroidOptions, "density=", RUBY_METHOD_FUNC(Draw_density_eq), 1);
954
- rb_define_method(Class_PolaroidOptions, "encoding=", RUBY_METHOD_FUNC(Draw_encoding_eq), 1);
955
- rb_define_method(Class_PolaroidOptions, "fill=", RUBY_METHOD_FUNC(Draw_fill_eq), 1);
956
- rb_define_method(Class_PolaroidOptions, "fill_pattern=", RUBY_METHOD_FUNC(Draw_fill_pattern_eq), 1);
957
- rb_define_method(Class_PolaroidOptions, "font=", RUBY_METHOD_FUNC(Draw_font_eq), 1);
958
- rb_define_method(Class_PolaroidOptions, "font_family=", RUBY_METHOD_FUNC(Draw_font_family_eq), 1);
959
- rb_define_method(Class_PolaroidOptions, "font_stretch=", RUBY_METHOD_FUNC(Draw_font_stretch_eq), 1);
960
- rb_define_method(Class_PolaroidOptions, "font_style=", RUBY_METHOD_FUNC(Draw_font_style_eq), 1);
961
- rb_define_method(Class_PolaroidOptions, "font_weight=", RUBY_METHOD_FUNC(Draw_font_weight_eq), 1);
962
- rb_define_method(Class_PolaroidOptions, "gravity=", RUBY_METHOD_FUNC(Draw_gravity_eq), 1);
963
- rb_define_method(Class_PolaroidOptions, "pointsize=", RUBY_METHOD_FUNC(Draw_pointsize_eq), 1);
964
- rb_define_method(Class_PolaroidOptions, "stroke=", RUBY_METHOD_FUNC(Draw_stroke_eq), 1);
965
- rb_define_method(Class_PolaroidOptions, "stroke_pattern=", RUBY_METHOD_FUNC(Draw_stroke_pattern_eq), 1);
966
- rb_define_method(Class_PolaroidOptions, "stroke_width=", RUBY_METHOD_FUNC(Draw_stroke_width_eq), 1);
967
- rb_define_method(Class_PolaroidOptions, "text_antialias=", RUBY_METHOD_FUNC(Draw_text_antialias_eq), 1);
968
- rb_define_method(Class_PolaroidOptions, "undercolor=", RUBY_METHOD_FUNC(Draw_undercolor_eq), 1);
969
-
935
+ rb_include_module(Class_PolaroidOptions, Module_DrawAttribute);
970
936
 
971
937
  /*-----------------------------------------------------------------------*/
972
938
  /* Magick::******Fill classes and methods */
@@ -235,7 +235,7 @@ Montage_font_eq(VALUE self, VALUE font)
235
235
  * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
236
236
  * or a Geometry object
237
237
  *
238
- * @param frame_arg [String] the frame geometry
238
+ * @param frame_arg [Magick::Geometry, String] the frame geometry
239
239
  * @see https://www.imagemagick.org/Magick++/Geometry.html
240
240
  */
241
241
  VALUE
@@ -261,8 +261,8 @@ Montage_frame_eq(VALUE self, VALUE frame_arg)
261
261
  * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
262
262
  * or a Geometry object
263
263
  *
264
- * @param geometry_arg [String] the geometry
265
- * @return [String] the given geometry
264
+ * @param geometry_arg [Magick::Geometry, String] the geometry
265
+ * @return [Magick::Geometry, String] the given geometry
266
266
  * @see https://www.imagemagick.org/Magick++/Geometry.html
267
267
  */
268
268
  VALUE
@@ -422,8 +422,8 @@ Montage_texture_eq(VALUE self, VALUE texture)
422
422
  * <width>x<height>+<outer-bevel-width>+<inner-bevel-width>
423
423
  * or a Geometry object
424
424
  *
425
- * @param tile_arg [String] the tile geometry
426
- * @return [String] the given tile geometry
425
+ * @param tile_arg [Magick::Geometry, String] the tile geometry
426
+ * @return [Magick::Geometry, String] the given tile geometry
427
427
  * @see https://www.imagemagick.org/Magick++/Geometry.html
428
428
  */
429
429
  VALUE
@@ -595,8 +595,8 @@ Pixel_eql_q(VALUE self, VALUE other)
595
595
  * Compare pixel values for equality.
596
596
  *
597
597
  * @overload fcmp(other, fuzz = 0.0, colorspace = Magick::RGBColorspace)
598
- * @param other [Magick::Pixel] The pixel to which the receiver is compared
599
- * @param fuzz [Float] The amount of fuzz to allow before the colors are considered to be different
598
+ * @param other [Magick::Pixel, String] The pixel to which the receiver is compared
599
+ * @param fuzz [Numeric] The amount of fuzz to allow before the colors are considered to be different
600
600
  * @param colorspace [Magick::ColorspaceType] The colorspace
601
601
  * @return [Boolean] true if equal, otherwise false
602
602
  */
@@ -711,7 +711,7 @@ Pixel_from_color(VALUE klass ATTRIBUTE_UNUSED, VALUE name)
711
711
  * @param hue [Numeric, String] A value in the range.
712
712
  * @param saturation [Numeric, String] A value in the range.
713
713
  * @param lightness [Numeric, String] A value in the range.
714
- * @param alpha [Numeric] The alpha value.
714
+ * @param alpha [Numeric, String] The alpha value.
715
715
  * @return [Magick::Pixel] a new Magick::Pixel object
716
716
  */
717
717
  VALUE
@@ -1069,6 +1069,10 @@ Pixel_spaceship(VALUE self, VALUE other)
1069
1069
  {
1070
1070
  Pixel *self_pixel, *other_pixel;
1071
1071
 
1072
+ if (CLASS_OF(self) != CLASS_OF(other)) {
1073
+ return Qnil;
1074
+ }
1075
+
1072
1076
  TypedData_Get_Struct(self, Pixel, &rm_pixel_data_type, self_pixel);
1073
1077
  TypedData_Get_Struct(other, Pixel, &rm_pixel_data_type, other_pixel);
1074
1078
 
@@ -1096,10 +1100,8 @@ Pixel_spaceship(VALUE self, VALUE other)
1096
1100
  }
1097
1101
  #endif
1098
1102
 
1099
- // Values are equal, check class.
1100
-
1101
- return rb_funcall(CLASS_OF(self), rb_intern("<=>"), 1, CLASS_OF(other));
1102
-
1103
+ // Values are equal.
1104
+ return INT2NUM(0);
1103
1105
  }
1104
1106
 
1105
1107
 
@@ -360,49 +360,23 @@ rescue_not_str(VALUE arg, VALUE raised_exc ATTRIBUTE_UNUSED)
360
360
  *
361
361
  * @param arg the argument
362
362
  * @param max the maximum allowed value
363
+ * @param only_positive Accept whether only positive numbers?
363
364
  * @return a double
364
365
  */
365
366
  double
366
- rm_percentage(VALUE arg, double max)
367
+ rm_percentage2(VALUE arg, double max, bool only_positive)
367
368
  {
368
369
  double pct;
369
370
  char *end;
370
371
 
371
372
  if (!rm_check_num2dbl(arg))
372
373
  {
373
- char *pct_str;
374
- long pct_long;
375
-
376
- arg = rb_rescue(RESCUE_FUNC(rb_str_to_str), arg, RESCUE_EXCEPTION_HANDLER_FUNC(rescue_not_str), arg);
377
- pct_str = StringValueCStr(arg);
378
- errno = 0;
379
- pct_long = strtol(pct_str, &end, 10);
380
- if (errno == ERANGE)
381
- {
382
- rb_raise(rb_eRangeError, "`%s' out of range", pct_str);
383
- }
384
- if (*end != '\0' && *end != '%')
385
- {
386
- rb_raise(rb_eArgError, "expected percentage, got `%s'", pct_str);
387
- }
388
-
389
- if (*end == '%' && pct_long != 0)
390
- {
391
- pct = (((double)pct_long) / 100.0) * max;
392
- }
393
- else
394
- {
395
- pct = (double) pct_long;
396
- }
397
- if (pct < 0.0)
398
- {
399
- rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", pct_str);
400
- }
374
+ pct = rm_str_to_pct(arg, only_positive) * max;
401
375
  }
402
376
  else
403
377
  {
404
378
  pct = NUM2DBL(arg);
405
- if (pct < 0.0)
379
+ if (pct < 0.0 && only_positive)
406
380
  {
407
381
  rb_raise(rb_eArgError, "percentages may not be negative (got `%g')", pct);
408
382
  }
@@ -412,6 +386,24 @@ rm_percentage(VALUE arg, double max)
412
386
  }
413
387
 
414
388
 
389
+ /**
390
+ * Return a double between 0.0 and max (the second argument), inclusive. If the
391
+ * argument is a number convert to a Float object, otherwise it's supposed to be
392
+ * a string in the form * "NN%". Convert to a number and then to a Float.
393
+ *
394
+ * No Ruby usage (internal function)
395
+ *
396
+ * @param arg the argument
397
+ * @param max the maximum allowed value
398
+ * @return a double
399
+ */
400
+ double
401
+ rm_percentage(VALUE arg, double max)
402
+ {
403
+ return rm_percentage2(arg, max, true);
404
+ }
405
+
406
+
415
407
  /**
416
408
  * Return 0 if rb_num2dbl doesn't raise an exception.
417
409
  *
@@ -464,10 +456,11 @@ rm_check_num2dbl(VALUE obj)
464
456
  * No Ruby usage (internal function)
465
457
  *
466
458
  * @param str the string
459
+ * @param only_positive Accept whether only positive numbers?
467
460
  * @return a double
468
461
  */
469
462
  double
470
- rm_str_to_pct(VALUE str)
463
+ rm_str_to_pct(VALUE str, bool only_positive)
471
464
  {
472
465
  long pct;
473
466
  char *pct_str, *end;
@@ -485,7 +478,7 @@ rm_str_to_pct(VALUE str)
485
478
  {
486
479
  rb_raise(rb_eArgError, "expected percentage, got `%s'", pct_str);
487
480
  }
488
- if (pct < 0L)
481
+ if (pct < 0L && only_positive)
489
482
  {
490
483
  rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", pct_str);
491
484
  }
@@ -508,45 +501,7 @@ rm_str_to_pct(VALUE str)
508
501
  double
509
502
  rm_fuzz_to_dbl(VALUE fuzz_arg)
510
503
  {
511
- double fuzz;
512
- char *end;
513
-
514
- if (!rm_check_num2dbl(fuzz_arg))
515
- {
516
- char *fuzz_str;
517
-
518
- // Convert to string, issue error message if failure.
519
- fuzz_arg = rb_rescue(RESCUE_FUNC(rb_str_to_str), fuzz_arg, RESCUE_EXCEPTION_HANDLER_FUNC(rescue_not_str), fuzz_arg);
520
- fuzz_str = StringValueCStr(fuzz_arg);
521
- errno = 0;
522
- fuzz = strtod(fuzz_str, &end);
523
- if (errno == ERANGE)
524
- {
525
- rb_raise(rb_eRangeError, "`%s' out of range", fuzz_str);
526
- }
527
- if(*end == '%')
528
- {
529
- if (fuzz < 0.0)
530
- {
531
- rb_raise(rb_eArgError, "percentages may not be negative (got `%s')", fuzz_str);
532
- }
533
- fuzz = (fuzz * QuantumRange) / 100.0;
534
- }
535
- else if(*end != '\0')
536
- {
537
- rb_raise(rb_eArgError, "expected percentage, got `%s'", fuzz_str);
538
- }
539
- }
540
- else
541
- {
542
- fuzz = NUM2DBL(fuzz_arg);
543
- if (fuzz < 0.0)
544
- {
545
- rb_raise(rb_eArgError, "fuzz may not be negative (got `%g')", fuzz);
546
- }
547
- }
548
-
549
- return fuzz;
504
+ return rm_percentage(fuzz_arg, QuantumRange);
550
505
  }
551
506
 
552
507
 
@@ -1262,6 +1217,11 @@ void rm_sync_image_options(Image *image, Info *info)
1262
1217
  }
1263
1218
 
1264
1219
  copy_options(image, info);
1220
+
1221
+ #if defined(IMAGEMAGICK_7)
1222
+ // The value of info->compression is referenced when saving the image in ImageMagick 7.
1223
+ info->compression = image->compression;
1224
+ #endif
1265
1225
  }
1266
1226
 
1267
1227
 
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Magick
4
- VERSION = '5.4.3'
4
+ VERSION = '5.5.0'
5
5
  MIN_RUBY_VERSION = '2.3.0'
6
6
  MIN_IM_VERSION = '6.7.7'
7
7
  end