rmagick 5.4.4 → 6.0.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer/ImageMagick6/devcontainer.json +1 -1
  3. data/.devcontainer/devcontainer.json +1 -1
  4. data/.github/workflows/ci.yml +41 -31
  5. data/.gitignore +1 -0
  6. data/.rubocop.yml +36 -9
  7. data/.rubocop_todo.yml +369 -187
  8. data/CHANGELOG.md +77 -0
  9. data/Gemfile +14 -0
  10. data/README.md +3 -3
  11. data/Rakefile +12 -1
  12. data/before_install_linux.sh +1 -11
  13. data/before_install_osx.sh +5 -7
  14. data/ext/RMagick/extconf.rb +58 -68
  15. data/ext/RMagick/rmagick.h +7 -12
  16. data/ext/RMagick/rmdraw.cpp +10 -20
  17. data/ext/RMagick/rmfill.cpp +4 -4
  18. data/ext/RMagick/rmilist.cpp +10 -2
  19. data/ext/RMagick/rmimage.cpp +342 -344
  20. data/ext/RMagick/rminfo.cpp +22 -21
  21. data/ext/RMagick/rmkinfo.cpp +5 -18
  22. data/ext/RMagick/rmmain.cpp +42 -91
  23. data/ext/RMagick/rmmontage.cpp +5 -5
  24. data/ext/RMagick/rmpixel.cpp +3 -3
  25. data/ext/RMagick/rmutil.cpp +58 -89
  26. data/lib/rmagick/version.rb +3 -3
  27. data/lib/rmagick.rb +1 -1
  28. data/lib/rmagick_internal.rb +111 -103
  29. data/lib/rvg/container.rb +3 -3
  30. data/lib/rvg/embellishable.rb +7 -3
  31. data/lib/rvg/misc.rb +15 -15
  32. data/lib/rvg/rvg.rb +6 -6
  33. data/lib/rvg/stretchable.rb +2 -2
  34. data/lib/rvg/stylable.rb +2 -2
  35. data/lib/rvg/transformable.rb +1 -1
  36. data/lib/rvg/units.rb +1 -0
  37. data/rmagick.gemspec +2 -15
  38. data/sig/rmagick/_draw_common_methods.rbs +64 -0
  39. data/sig/rmagick/_image_common_methods.rbs +387 -0
  40. data/sig/rmagick/draw.rbs +38 -0
  41. data/sig/rmagick/draw_attribute.rbs +28 -0
  42. data/sig/rmagick/enum.rbs +820 -0
  43. data/sig/rmagick/error.rbs +11 -0
  44. data/sig/rmagick/fill.rbs +21 -0
  45. data/sig/rmagick/geometry.rbs +14 -0
  46. data/sig/rmagick/image.rbs +196 -0
  47. data/sig/rmagick/image_list.rbs +183 -0
  48. data/sig/rmagick/iptc.rbs +101 -0
  49. data/sig/rmagick/kernel_info.rbs +12 -0
  50. data/sig/rmagick/optional_method_arguments.rbs +10 -0
  51. data/sig/rmagick/pixel.rbs +46 -0
  52. data/sig/rmagick/struct.rbs +90 -0
  53. data/sig/rmagick.rbs +43 -0
  54. data/sig/rvg/clippath.rbs +34 -0
  55. data/sig/rvg/container.rbs +78 -0
  56. data/sig/rvg/deep_equal.rbs +48 -0
  57. data/sig/rvg/describable.rbs +30 -0
  58. data/sig/rvg/embellishable.rbs +226 -0
  59. data/sig/rvg/misc.rbs +145 -0
  60. data/sig/rvg/paint.rbs +55 -0
  61. data/sig/rvg/pathdata.rbs +77 -0
  62. data/sig/rvg/rvg.rbs +125 -0
  63. data/sig/rvg/stretchable.rbs +56 -0
  64. data/sig/rvg/stylable.rbs +66 -0
  65. data/sig/rvg/text.rbs +118 -0
  66. data/sig/rvg/transformable.rbs +59 -0
  67. data/sig/rvg/units.rbs +33 -0
  68. metadata +38 -134
data/CHANGELOG.md CHANGED
@@ -3,6 +3,83 @@
3
3
  All notable changes to this project are documented in this file.
4
4
  This project adheres to [Semantic Versioning](http://semver.org/).
5
5
 
6
+ ## RMagick 6.0.0
7
+
8
+ Improvements
9
+
10
+ - Improve compatibility of Image#pixel_color value for ImageMagick 6 and 7 (#1591)
11
+ - Add missing constants (#1580)
12
+ - Loosen ImageMagick version check between compiled and runtime (#1526)
13
+
14
+ Bug Fixes
15
+
16
+ - Transform image according to Info#colorspace (#1594)
17
+ - Sync Image::Info attributes to image object (#1593)
18
+ - Fix install error on Windows MINGW environment (#1588)
19
+ - Fix header checks in order to use aligned_malloc expectedly (#1579)
20
+
21
+ Breaking Changes
22
+
23
+ - Change method that returns a color name to return a hex string (#1592)
24
+ - The following methods return RGBA hex string as color name. The hex string length is according to color depth.
25
+ - `Image#background_color`
26
+ - `Image#border_color`
27
+ - `Image#colormap`
28
+ - `Image#matte_color`
29
+ - `Image#transparent_color`
30
+ - `Info#background_color`
31
+ - `Info#border_color`
32
+ - `Info#matte_color`
33
+ - `Info#transparent_color`
34
+ - Change default value of argument
35
+ - The hex argument of `Pixel#to_color` has `true` by default.
36
+ - Drop ruby-mswin environment support on Windows (#1587)
37
+ - Drop Ruby 2.x support (#1540)
38
+ - Drop ImageMagick 6.7 support (#1539)
39
+
40
+ ## RMagick 5.5.0
41
+
42
+ Improvements
43
+
44
+ - Add RBS signatures (#1458)
45
+ - Remove unnecessary type check in KernelInfo#{unity_add, scale} (#1514)
46
+ - Remove unnecessary type check in Image#{morphology, morphology_channel} (#1513)
47
+ - Improve HatchFill.new to accept Pixel object as color (#1512)
48
+ - Fix GraphicContext#font_weight to accept Numeric object (#1510)
49
+ - Improve GraphicContext#font_weight to accept Symbol object (#1509)
50
+ - Improve Stretchable#viewbox to use implicitly conversioned value (#1507)
51
+ - Improve RVG::Transformable#rotate to convert to Float implicitly (#1506)
52
+ - Fix Image#modulate in order to accept negative number (#1505)
53
+ - Improve Image#modulate to accept "NN%" form string (#1504)
54
+ - Implicit conversion to string with methods that expect a string (#1496)
55
+ - Coerce to string instead of using #to_s (#1495)
56
+ - Coerce to string where pass object into string interpolation (#1494)
57
+ - Fix Draw#{fill_opacity, opacity, stroke_opacity} to correctly handle arguments (#1492)
58
+ - Fix Draw#{interline_spacing, interword_spacing, kerning} to correctly handle arguments that can be converted to Float (#1491)
59
+ - Remove unnecessary type check in KernelInfo methods (#1489)
60
+ - Generate compile_flags.txt for clangd for development (#1488)
61
+ - Fix Draw#{stroke_dasharray, stroke_miterlimit} to accept object which has #to_f method (#1486)
62
+ - Fix Image#composite_affine to accept ImageList object (#1484)
63
+ - Fix Image#add_compose_mask to accept ImageList object (#1483)
64
+ - Fix incorrect number of required arguments in ArgumentError (#1482)
65
+ - Fix ImageList#sort! that should return self (#1481)
66
+ - Fix ImageList#eql? that should not raise exception if can't compare (#1479)
67
+ - Fix ImageList#<=> that should return nil if can't compare (#1478)
68
+ - Add DrawAttribute module to simplify Draw, DrawOptions and PolaroidOptions (#1477)
69
+ - Add missing attribute writer methods in Image::{DrawOptions, PolaroidOptions} (#1476)
70
+ - Add Image::PolaroidOptions#affine= (#1475)
71
+ - Add Image::PolaroidOptions#tile= (#1474)
72
+ - Attribute writer methods should return passed value (#1473)
73
+ - Return self with ImageList if Image's method return self (#1472)
74
+ - Fix Image#clut_channel to accept ImageList object (#1471)
75
+ - Fix Magick::GradientFill#fill and Magick::TextureFill#fill to accept ImageList object (#1467)
76
+
77
+ Bug Fixes
78
+
79
+ - Fix typo in order to fix NoMethodError (#1515)
80
+ - Sync compression value in order fix the problem of compression being ignored by ImageMagick 7 (#1503)
81
+ - Add PKG_CONFIG_PATH for ImageMagick 7 in order to fix installation error on macOS (#1501)
82
+
6
83
  ## RMagick 5.4.4
7
84
 
8
85
  Bug Fixes
data/Gemfile CHANGED
@@ -2,3 +2,17 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in rmagick.gemspec
4
4
  gemspec
5
+
6
+ gem 'pry', '~> 0.14'
7
+ gem 'rake-compiler', '~> 1.2'
8
+ gem 'rspec', '~> 3.13'
9
+ gem 'rspec_junit_formatter', '~> 0.6.0'
10
+ gem 'simplecov', '~> 0.22.0'
11
+ gem 'yard', '~> 0.9.36'
12
+
13
+ gem 'rubocop', '~> 1.63'
14
+ gem 'rubocop-performance', '~> 1.21'
15
+ gem 'rubocop-rspec', '~> 2.29'
16
+
17
+ gem 'rbs', '~> 3.4'
18
+ gem 'steep', '~> 1.6'
data/README.md CHANGED
@@ -42,14 +42,14 @@ These prerequisites are required for the latest version of RMagick.
42
42
  - RMagick 5.4.0 or later requires a C++ compiler.
43
43
 
44
44
  **Ruby**
45
- - Version 2.3 or later.
45
+ - Version 3.0 or later.
46
46
 
47
47
  You can get Ruby from <https://www.ruby-lang.org>.
48
48
 
49
49
  Ruby must be able to build C-Extensions (e.g. MRI, Rubinius, not JRuby)
50
50
 
51
51
  **ImageMagick**
52
- - Version 6.7.7 or later (6.x.x).
52
+ - Version 6.8.9 or later (6.x.x).
53
53
  - Version 7.0.8 or later (7.x.x). Require RMagick 4.1.0 or later.
54
54
 
55
55
  You can get ImageMagick from <https://imagemagick.org>.
@@ -138,7 +138,7 @@ gem install rmagick
138
138
  ### Versioning
139
139
 
140
140
  RMagick is versioned according to Semantic Versioning. For stable version
141
- compatible with Ruby 1.8+, use `~> 2.0`. Versions >= 3 work on Ruby >= 2.x
141
+ compatible with Ruby 3.0+, use `~> 3.0`. Versions >= 6 work on Ruby >= 3.x
142
142
  only.
143
143
 
144
144
  Using RMagick
data/Rakefile CHANGED
@@ -71,7 +71,7 @@ namespace :website do
71
71
  now = now.strftime('%m/%d/%y')
72
72
 
73
73
  lines.each do |line|
74
- line.gsub!(/0\.0\.0/, Magick::VERSION)
74
+ line.gsub!("0.0.0", Magick::VERSION)
75
75
  line.gsub!(%r{YY/MM/DD}, now)
76
76
  end
77
77
  lines
@@ -143,6 +143,17 @@ namespace :website do
143
143
  end
144
144
  end
145
145
 
146
+ namespace :rbs do
147
+ desc 'Validate RBS definitions'
148
+ task :validate do
149
+ all_sigs = Dir.glob('sig').map { |dir| "-I #{dir}" }.join(' ')
150
+ sh("bundle exec rbs #{all_sigs} validate") do |ok, _|
151
+ abort('one or more rbs validate failed') unless ok
152
+ end
153
+ end
154
+ end
155
+
156
+ require 'bundler/gem_tasks'
146
157
  require 'rake/extensiontask'
147
158
  require 'rspec/core/rake_task'
148
159
  RSpec::Core::RakeTask.new(:spec)
@@ -2,8 +2,6 @@
2
2
 
3
3
  set -euox pipefail
4
4
 
5
- gem install bundler -v 2.3.26 # Bundler 2.4.x has dropped support for Ruby 2.3
6
-
7
5
  if [ -v STYLE_CHECKS ]; then
8
6
  set +ux
9
7
  exit 0
@@ -15,22 +13,14 @@ if [ ! -v IMAGEMAGICK_VERSION ]; then
15
13
  exit 1
16
14
  fi
17
15
 
18
- sudo apt-get clean
19
- sudo apt-get update
20
-
21
16
  # remove all existing imagemagick related packages
22
17
  sudo apt-get autoremove -y imagemagick* libmagick* --purge
23
18
 
24
19
  # install build tools, ImageMagick delegates
25
20
  sudo apt-get install -y build-essential libx11-dev libxext-dev zlib1g-dev \
26
- liblcms2-dev libpng-dev libjpeg-dev libfreetype6-dev libxml2-dev \
21
+ liblcms2-dev libpng-dev libjpeg-dev libfreetype6-dev \
27
22
  libtiff5-dev libwebp-dev liblqr-1-0-dev vim gsfonts ghostscript
28
23
 
29
- if [ ! -d /usr/include/freetype ]; then
30
- # If `/usr/include/freetype` is not existed, ImageMagick 6.7 configuration fails about Freetype.
31
- sudo ln -sf /usr/include/freetype2 /usr/include/freetype
32
- fi
33
-
34
24
  project_dir=$(pwd)
35
25
  build_dir="${project_dir}/build-ImageMagick/ImageMagick-${IMAGEMAGICK_VERSION}"
36
26
  if [ -v CONFIGURE_OPTIONS ]; then
@@ -2,8 +2,6 @@
2
2
 
3
3
  set -euox pipefail
4
4
 
5
- gem install bundler -v 2.3.26 # Bundler 2.4.x has dropped support for Ruby 2.3
6
-
7
5
  if [ -v STYLE_CHECKS ]; then
8
6
  set +ux
9
7
  exit 0
@@ -17,10 +15,10 @@ fi
17
15
 
18
16
  export HOMEBREW_NO_AUTO_UPDATE=true
19
17
  brew uninstall --force imagemagick imagemagick@6
20
- brew install wget ghostscript freetype jpeg little-cms2 openexr libomp libpng libtiff liblqr libtool zlib webp
18
+ brew install wget ghostscript freetype libtool jpeg little-cms2 openexr libomp libpng libtiff liblqr zlib webp zstd
21
19
 
22
- export LDFLAGS="-L$(brew --prefix libxml2)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix glib)/lib -L$(brew --prefix openexr)/lib"
23
- export CPPFLAGS="-I$(brew --prefix libxml2)/include -I$(brew --prefix zlib)/include -I$(brew --prefix glib)/include/glib-2.0 -I$(brew --prefix glib)/lib/glib-2.0/include -I$(brew --prefix openexr)/include/OpenEXR"
20
+ export LDFLAGS="-L$(brew --prefix jpeg)/lib -L$(brew --prefix little-cms2)/lib -L$(brew --prefix openexr)/lib -L$(brew --prefix libomp)/lib -L$(brew --prefix libpng)/lib -L$(brew --prefix libtiff)/lib -L$(brew --prefix liblqr)/lib -L$(brew --prefix zlib)/lib -L$(brew --prefix webp)/lib -L$(brew --prefix zstd)/lib"
21
+ export CPPFLAGS="-I$(brew --prefix jpeg)/include -I$(brew --prefix openexr)/include/OpenEXR -I$(brew --prefix libtiff)/include -I$(brew --prefix zlib)/include -I$(brew --prefix zstd)/include -I$(brew --prefix glib)/include/glib-2.0 -I$(brew --prefix glib)/lib/glib-2.0/include"
24
22
 
25
23
  project_dir=$(pwd)
26
24
  build_dir="${project_dir}/build-ImageMagick/ImageMagick-${IMAGEMAGICK_VERSION}"
@@ -43,7 +41,7 @@ build_imagemagick() {
43
41
  fi
44
42
 
45
43
  cd "${build_dir}"
46
- ./configure --prefix=/usr/local "${options}" --without-raw --without-jxl
44
+ ./configure --prefix=/usr/local "${options}" --without-raw
47
45
  make -j
48
46
  }
49
47
 
@@ -52,7 +50,7 @@ if [ ! -d "${build_dir}" ]; then
52
50
  fi
53
51
 
54
52
  cd "${build_dir}"
55
- make install -j
53
+ sudo make install -j
56
54
  cd "${project_dir}"
57
55
 
58
56
  set +ux
@@ -4,21 +4,12 @@ require 'rubygems'
4
4
  require 'mkmf'
5
5
  require 'pkg-config'
6
6
 
7
- module MakeMakefile
8
- # Use the C++ compiler to retrieve the information needed to create a Makefile for mswin environment.
9
- remove_const(:CONFTEST_C)
10
- CONFTEST_C = "#{CONFTEST}.cpp"
11
- end
12
-
13
7
  module RMagick
14
8
  class Extconf
15
9
  require 'rmagick/version'
16
10
  RMAGICK_VERS = ::Magick::VERSION
17
11
  MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
18
12
 
19
- # ImageMagick 6.7 package
20
- IM6_7_PACKAGES = ['ImageMagick'].freeze
21
-
22
13
  # ImageMagick 6.8+ packages
23
14
  IM6_PACKAGES = %w[
24
15
  ImageMagick-6.Q64HDRI
@@ -48,6 +39,8 @@ module RMagick
48
39
  def initialize
49
40
  @stdout = $stdout.dup
50
41
 
42
+ exit_failure("No longer support MSWIN environment.") if RUBY_PLATFORM.include?('mswin')
43
+
51
44
  setup_pkg_config_path
52
45
  assert_can_compile!
53
46
  configure_compile_options
@@ -55,19 +48,20 @@ module RMagick
55
48
  end
56
49
 
57
50
  def setup_pkg_config_path
58
- return if RUBY_PLATFORM =~ /mswin|mingw/
51
+ return if RUBY_PLATFORM.include?('mingw')
59
52
 
60
53
  if find_executable('brew')
61
- pkg_config_path = "#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig"
54
+ append_pkg_config_path("#{`brew --prefix imagemagick`.strip}/lib/pkgconfig")
55
+ append_pkg_config_path("#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig")
62
56
  elsif find_executable('pacman')
63
- pkg_config_path = '/usr/lib/imagemagick6/pkgconfig'
64
- else
65
- return
57
+ append_pkg_config_path('/usr/lib/imagemagick6/pkgconfig')
66
58
  end
59
+ end
67
60
 
61
+ def append_pkg_config_path(path)
68
62
  pkg_config_paths = ENV['PKG_CONFIG_PATH'].to_s.split(':')
69
- if File.exist?(pkg_config_path) && !pkg_config_paths.include?(pkg_config_path)
70
- ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], pkg_config_path].compact.join(':')
63
+ if File.exist?(path) && !pkg_config_paths.include?(path)
64
+ ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], path].compact.join(':')
71
65
  end
72
66
  end
73
67
 
@@ -92,11 +86,25 @@ module RMagick
92
86
  else
93
87
  exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find magick/MagickCore.h."
94
88
  end
89
+
90
+ if have_header('malloc.h')
91
+ headers << 'malloc.h'
92
+ elsif have_header('malloc/malloc.h')
93
+ headers << 'malloc/malloc.h'
94
+ end
95
95
  end
96
96
 
97
97
  def configure_compile_options
98
98
  # Magick-config is not available on Windows
99
- if RUBY_PLATFORM !~ /mswin|mingw/
99
+ if RUBY_PLATFORM.include?('mingw') # mingw
100
+
101
+ dir_paths = search_paths_for_windows
102
+ $CPPFLAGS += %( -I"#{dir_paths[:include]}")
103
+ $CPPFLAGS += ' -x c++ -std=c++11 -Wno-register'
104
+ $LDFLAGS += %( -L"#{dir_paths[:root]}" -lucrt)
105
+ $LDFLAGS += (im_version_at_least?('7.0.0') ? ' -lCORE_RL_MagickCore_' : ' -lCORE_RL_magick_')
106
+
107
+ else
100
108
 
101
109
  check_multiple_imagemagick_versions
102
110
  check_partial_imagemagick_versions
@@ -118,31 +126,9 @@ module RMagick
118
126
  $LDFLAGS = "#{original_ldflags} #{ldflags}"
119
127
  end
120
128
 
121
- configure_archflags_for_osx($magick_package) if RUBY_PLATFORM =~ /darwin/ # osx
122
-
123
- elsif RUBY_PLATFORM =~ /mingw/ # mingw
124
-
125
- dir_paths = search_paths_for_library_for_windows
126
- $CPPFLAGS += %( -I"#{dir_paths[:include]}")
127
- $CPPFLAGS += ' -x c++ -std=c++11 -Wno-register'
128
- $LDFLAGS += %( -L"#{dir_paths[:lib]}")
129
- $LDFLAGS << ' -lucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
130
-
131
- have_library(im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_' : 'CORE_RL_magick_')
132
-
133
- else # mswin
129
+ configure_archflags_for_osx($magick_package) if RUBY_PLATFORM.include?('darwin') # osx
134
130
 
135
- dir_paths = search_paths_for_library_for_windows
136
- $CPPFLAGS << %( -I"#{dir_paths[:include]}")
137
- $LDFLAGS << %( -libpath:"#{dir_paths[:lib]}")
138
- $LDFLAGS << ' -libpath:ucrt' if Gem::Version.new(RUBY_VERSION) >= Gem::Version.new('2.4.0')
139
-
140
- $LOCAL_LIBS += ' ' + (im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
141
-
142
- $CPPFLAGS += ' /std:c++11'
143
131
  end
144
- ruby_version = RUBY_VERSION.split('.')
145
- $CPPFLAGS += " -DRUBY_VERSION_MAJOR=#{ruby_version[0]} -DRUBY_VERSION_MINOR=#{ruby_version[1]}"
146
132
  $CPPFLAGS += ' $(optflags) $(debugflags)'
147
133
  end
148
134
 
@@ -180,11 +166,6 @@ module RMagick
180
166
  def determine_imagemagick_package
181
167
  packages = [installed_im7_packages, installed_im6_packages].flatten
182
168
 
183
- if packages.empty?
184
- # ImageMagick 6.7 does not have package file like ImageMagick-6.Q16.pc
185
- packages = detect_imagemagick_packages(IM6_7_PACKAGES)
186
- end
187
-
188
169
  if packages.empty?
189
170
  exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find ImageMagick with pkg-config\n"
190
171
  end
@@ -268,10 +249,10 @@ module RMagick
268
249
  # issue #169
269
250
  # set ARCHFLAGS appropriately for OSX
270
251
  def configure_archflags_for_osx(magick_package)
271
- return unless PKGConfig.libs_only_L(magick_package).match(%r{-L(.+)/lib})
252
+ return unless PKGConfig.libs_only_L(magick_package) =~ %r{-L(.+)/lib}
272
253
 
273
254
  imagemagick_dir = Regexp.last_match(1)
274
- command = Dir.glob(File.join(imagemagick_dir, "bin/*")).select { |file| File.executable? file }.first
255
+ command = Dir.glob(File.join(imagemagick_dir, "bin/*")).find { |file| File.executable? file }
275
256
  fileinfo = `file #{command}`
276
257
 
277
258
  # default ARCHFLAGS
@@ -285,28 +266,27 @@ module RMagick
285
266
  $ARCH_FLAG = archflags.join(' ') unless archflags.empty?
286
267
  end
287
268
 
288
- def search_paths_for_library_for_windows
269
+ def search_paths_for_windows
289
270
  msg = 'searching PATH for the ImageMagick library...'
290
271
  Logging.message msg
291
272
  message msg + "\n"
292
273
 
293
- found_lib = false
274
+ found = false
294
275
  dir_paths = {}
295
276
 
296
277
  paths = ENV['PATH'].split(File::PATH_SEPARATOR)
297
278
  paths.each do |dir|
298
- lib = File.join(dir, 'lib')
299
- lib_file = File.join(lib, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.lib' : 'CORE_RL_magick_.lib')
300
- next unless File.exist?(lib_file)
279
+ dll = File.join(dir, im_version_at_least?('7.0.0') ? 'CORE_RL_MagickCore_.dll' : 'CORE_RL_magick_.dll')
280
+ next unless File.exist?(dll)
301
281
 
302
282
  dir_paths[:include] = File.join(dir, 'include')
303
- dir_paths[:lib] = lib
283
+ dir_paths[:root] = dir
304
284
 
305
- found_lib = true
285
+ found = true
306
286
  break
307
287
  end
308
288
 
309
- return dir_paths if found_lib
289
+ return dir_paths if found
310
290
 
311
291
  exit_failure <<~END_MINGW
312
292
  Can't install RMagick #{RMAGICK_VERS}.
@@ -321,7 +301,7 @@ module RMagick
321
301
  assert_has_dev_libs!
322
302
 
323
303
  # Check for compiler. Extract first word so ENV['CXX'] can be a program name with arguments.
324
- cxx = (ENV['CXX'] || RbConfig::CONFIG['CXX'] || 'g++').split(' ').first
304
+ cxx = (ENV['CXX'] || RbConfig::CONFIG['CXX'] || 'g++').split.first
325
305
  exit_failure "No C++ compiler found in ${ENV['PATH']}. See mkmf.log for details." unless find_executable(cxx)
326
306
  end
327
307
 
@@ -340,17 +320,17 @@ module RMagick
340
320
  Check the mkmf.log file for more detailed information.
341
321
  END_FAILURE
342
322
 
343
- if RUBY_PLATFORM !~ /mswin|mingw/
323
+ if RUBY_PLATFORM.include?('mingw')
324
+ `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
325
+ $magick_version = Regexp.last_match(1)
326
+ exit_failure failure_message unless $magick_version
327
+ else
344
328
  unless PKGConfig.libs('MagickCore')[/\bl\s*(MagickCore|Magick)6?\b/]
345
329
  exit_failure failure_message
346
330
  end
347
331
 
348
332
  $magick_package = determine_imagemagick_package
349
333
  $magick_version = PKGConfig.modversion($magick_package)[/^(\d+\.\d+\.\d+)/]
350
- else
351
- `#{magick_command} -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
352
- $magick_version = Regexp.last_match(1)
353
- exit_failure failure_message unless $magick_version
354
334
  end
355
335
 
356
336
  # Ensure minimum ImageMagick version
@@ -364,8 +344,6 @@ module RMagick
364
344
 
365
345
  def create_header_file
366
346
  ruby_api = [
367
- 'rb_gc_adjust_memory_usage', # Ruby 2.4.0
368
- 'rb_gc_mark_movable', # Ruby 2.7.0
369
347
  'rb_io_path' # Ruby 3.2.0
370
348
  ]
371
349
  memory_api = %w[
@@ -385,15 +363,10 @@ module RMagick
385
363
  have_func(func, headers)
386
364
  end
387
365
 
388
- unless have_header('malloc.h')
389
- have_header('malloc/malloc.h')
390
- end
391
-
392
366
  # Miscellaneous constants
393
367
  $defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
394
368
  $defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
395
369
 
396
- $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1') if im_version_at_least?('6.8.9')
397
370
  $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1') if im_version_at_least?('6.9.0')
398
371
  $defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_10=1') if im_version_at_least?('6.9.10')
399
372
  $defs.push('-DIMAGEMAGICK_7=1') if im_version_at_least?('7.0.0')
@@ -413,6 +386,22 @@ module RMagick
413
386
  print_summary
414
387
  end
415
388
 
389
+ def create_compile_flags_txt
390
+ cppflags = $CPPFLAGS.split
391
+ include_flags = cppflags.select { |flag| flag.start_with?('-I') }
392
+ define_flags = cppflags.select { |flag| flag.start_with?('-D') } + $defs
393
+
394
+ File.open('compile_flags.txt', 'w') do |f|
395
+ include_flags.each { |flag| f.puts(flag) }
396
+ f.puts "-I#{Dir.pwd}"
397
+ f.puts "-I#{RbConfig::CONFIG['rubyhdrdir']}"
398
+ f.puts "-I#{RbConfig::CONFIG['rubyhdrdir']}/ruby/backward"
399
+ f.puts "-I#{RbConfig::CONFIG['rubyarchhdrdir']}"
400
+ f.puts "-std=c++11"
401
+ define_flags.each { |flag| f.puts(flag) }
402
+ end
403
+ end
404
+
416
405
  def magick_command
417
406
  @magick_command ||= if find_executable('magick')
418
407
  'magick'
@@ -451,3 +440,4 @@ at_exit do
451
440
  message msg + "\n"
452
441
  end
453
442
  extconf.create_makefile_file
443
+ extconf.create_compile_flags_txt
@@ -310,10 +310,8 @@ typedef enum _QuantumExpressionOperator
310
310
  AbsQuantumOperator, /**< abs */
311
311
  ExponentialQuantumOperator, /**< exponential */
312
312
  MedianQuantumOperator, /**< median */
313
- SumQuantumOperator /**< sum */
314
- #if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
315
- , RootMeanSquareQuantumOperator /** root mean square */
316
- #endif
313
+ SumQuantumOperator, /**< sum */
314
+ RootMeanSquareQuantumOperator /** root mean square */
317
315
  } QuantumExpressionOperator ;
318
316
 
319
317
 
@@ -333,6 +331,7 @@ typedef enum _QuantumExpressionOperator
333
331
  * RMagick Module and Class VALUEs
334
332
  */
335
333
  EXTERN VALUE Module_Magick;
334
+ EXTERN VALUE Module_DrawAttribute;
336
335
  EXTERN VALUE Class_ImageList;
337
336
  EXTERN VALUE Class_Info;
338
337
  EXTERN VALUE Class_KernelInfo;
@@ -1173,7 +1172,8 @@ extern int rm_check_num2dbl(VALUE);
1173
1172
  extern double rm_fuzz_to_dbl(VALUE);
1174
1173
  extern Quantum rm_app2quantum(VALUE);
1175
1174
  extern double rm_percentage(VALUE, double);
1176
- extern double rm_str_to_pct(VALUE);
1175
+ extern double rm_percentage2(VALUE, double, bool);
1176
+ extern double rm_str_to_pct(VALUE, bool);
1177
1177
  extern VALUE rm_define_enum_type(const char *);
1178
1178
  extern void rm_write_temp_image(Image *, char *, size_t);
1179
1179
  extern void rm_delete_temp_image(char *);
@@ -1225,13 +1225,8 @@ MagickExport void UnityAddKernelInfo(KernelInfo *kernel, const double scale);
1225
1225
  MagickExport void ScaleKernelInfo(KernelInfo *kernel, const double scaling_factor, const GeometryFlags normalize_flags);
1226
1226
  #endif
1227
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)
1234
- #endif
1228
+ #define RESCUE_FUNC(func) (VALUE(*)(VALUE))(func)
1229
+ #define RESCUE_EXCEPTION_HANDLER_FUNC(func) (VALUE(*)(VALUE, VALUE))(func)
1235
1230
 
1236
1231
  } // extern "C"
1237
1232
 
@@ -13,9 +13,7 @@
13
13
  #include "rmagick.h"
14
14
  #include "float.h"
15
15
 
16
- #ifdef HAVE_RB_GC_MARK_MOVABLE
17
16
  static void Draw_compact(void *drawptr);
18
- #endif
19
17
  static void Draw_mark(void *);
20
18
  static void Draw_destroy(void *);
21
19
  static size_t Draw_memsize(const void *);
@@ -28,9 +26,7 @@ const rb_data_type_t rm_draw_data_type = {
28
26
  Draw_mark,
29
27
  Draw_destroy,
30
28
  Draw_memsize,
31
- #ifdef HAVE_RB_GC_MARK_MOVABLE
32
29
  Draw_compact,
33
- #endif
34
30
  },
35
31
  0, 0,
36
32
  RUBY_TYPED_FROZEN_SHAREABLE,
@@ -950,20 +946,20 @@ Draw_clone(VALUE self)
950
946
  * Draw the image.
951
947
  *
952
948
  * @overload composite(x, y, width, height, image)
953
- * @param x [Float] x position
954
- * @param y [Float] y position
955
- * @param width [Float] the width
956
- * @param height [Float] the height
949
+ * @param x [Numeric] x position
950
+ * @param y [Numeric] y position
951
+ * @param width [Numeric] the width
952
+ * @param height [Numeric] the height
957
953
  * @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
958
954
  * imagelist, uses the current image.
959
955
  *
960
956
  * @overload composite(x, y, width, height, image, composite_op = Magick::OverCompositeOp)
961
957
  * - The "image" argument can be either an ImageList object or an Image
962
958
  * argument.
963
- * @param x [Float] x position
964
- * @param y [Float] y position
965
- * @param width [Float] the width
966
- * @param height [Float] the height
959
+ * @param x [Numeric] x position
960
+ * @param y [Numeric] y position
961
+ * @param width [Numeric] the width
962
+ * @param height [Numeric] the height
967
963
  * @param image [Magick::Image, Magick::ImageList] Either an imagelist or an image. If an
968
964
  * imagelist, uses the current image.
969
965
  * @param composite_op [Magick::CompositeOperator] the operator
@@ -1277,7 +1273,6 @@ Draw_primitive(VALUE self, VALUE primitive)
1277
1273
  return self;
1278
1274
  }
1279
1275
 
1280
- #ifdef HAVE_RB_GC_MARK_MOVABLE
1281
1276
  /**
1282
1277
  * Compact the objects.
1283
1278
  *
@@ -1295,7 +1290,6 @@ Draw_compact(void *drawptr)
1295
1290
  draw->primitives = rb_gc_location(draw->primitives);
1296
1291
  }
1297
1292
  }
1298
- #endif
1299
1293
 
1300
1294
  /**
1301
1295
  * Mark referenced objects.
@@ -1311,11 +1305,7 @@ Draw_mark(void *drawptr)
1311
1305
 
1312
1306
  if (draw->primitives != (VALUE)0)
1313
1307
  {
1314
- #ifdef HAVE_RB_GC_MARK_MOVABLE
1315
1308
  rb_gc_mark_movable(draw->primitives);
1316
- #else
1317
- rb_gc_mark(draw->primitives);
1318
- #endif
1319
1309
  }
1320
1310
  }
1321
1311
 
@@ -1463,8 +1453,8 @@ PolaroidOptions_alloc(VALUE klass)
1463
1453
  /**
1464
1454
  * Initialize a PolaroidOptions object.
1465
1455
  *
1466
- * @yield [self]
1467
- * @yieldparam self [Magick::Image::PolaroidOptions] self
1456
+ * @yield [opt]
1457
+ * @yieldparam opt [Magick::Image::PolaroidOptions] self
1468
1458
  * @return [Magick::Image::PolaroidOptions] self
1469
1459
  */
1470
1460
  VALUE
@@ -634,7 +634,7 @@ h_diagonal_fill(
634
634
  * Call GradientFill with the start and stop colors specified when this fill
635
635
  * object was created.
636
636
  *
637
- * @param image_obj [Magick::Image] the image to fill
637
+ * @param image_obj [Magick::Image, Magick::ImageList] the image to fill
638
638
  * @return [Magick::GradientFill] self
639
639
  */
640
640
  VALUE
@@ -646,7 +646,7 @@ GradientFill_fill(VALUE self, VALUE image_obj)
646
646
  double x1, y1, x2, y2; // points on the line
647
647
 
648
648
  TypedData_Get_Struct(self, rm_GradientFill, &rm_gradient_fill_data_type, fill);
649
- image = rm_check_destroyed(image_obj);
649
+ image = rm_check_destroyed(rm_cur_image(image_obj));
650
650
 
651
651
  x1 = fill->x1;
652
652
  y1 = fill->y1;
@@ -780,7 +780,7 @@ TextureFill_initialize(VALUE self, VALUE texture_arg)
780
780
  * Call TextureFill with the texture specified when this fill object was
781
781
  * created.
782
782
  *
783
- * @param image_obj [Magick::Image] the image to fill
783
+ * @param image_obj [Magick::Image, Magick::ImageList] the image to fill
784
784
  * @return [Magick::TextureFill] self
785
785
  */
786
786
  VALUE
@@ -792,7 +792,7 @@ TextureFill_fill(VALUE self, VALUE image_obj)
792
792
  ExceptionInfo *exception;
793
793
  #endif
794
794
 
795
- image = rm_check_destroyed(image_obj);
795
+ image = rm_check_destroyed(rm_cur_image(image_obj));
796
796
  TypedData_Get_Struct(self, rm_TextureFill, &rm_texture_fill_data_type, fill);
797
797
 
798
798
  #if defined(IMAGEMAGICK_7)