rmagick 5.4.4 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +43 -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 +24 -6
  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 +1 -1
  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,7 +595,7 @@ 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
598
+ * @param other [Magick::Pixel, String] The pixel to which the receiver is compared
599
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
@@ -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.4'
4
+ VERSION = '5.5.0'
5
5
  MIN_RUBY_VERSION = '2.3.0'
6
6
  MIN_IM_VERSION = '6.7.7'
7
7
  end