rmagick 3.1.0 → 3.2.0
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rmagick might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.appveyor.yml +4 -4
- data/.circleci/config.yml +1 -1
- data/.gitignore +1 -0
- data/.rubocop_todo.yml +6 -0
- data/.travis.yml +26 -8
- data/CHANGELOG.md +104 -0
- data/before_install_linux.sh +19 -10
- data/benchmarks/memory/README.md +50 -0
- data/benchmarks/memory/image_new.rb +8 -0
- data/benchmarks/memory/rmagick.gnuplot +16 -0
- data/doc/ex/coalesce.rb +2 -2
- data/doc/ex/drawcomp.rb +3 -3
- data/doc/ex/get_pixels.rb +1 -1
- data/doc/ex/images/Coffee.png +0 -0
- data/doc/ex/images/No.png +0 -0
- data/doc/ex/images/Snake.png +0 -0
- data/doc/ex/implode.rb +2 -2
- data/doc/ex/mask.rb +1 -1
- data/doc/ex/matte_fill_to_border.rb +1 -1
- data/doc/ex/matte_floodfill.rb +1 -1
- data/doc/ex/matte_replace.rb +1 -1
- data/doc/ex/stegano.rb +1 -1
- data/examples/constitute.rb +1 -1
- data/examples/crop_with_gravity.rb +1 -1
- data/examples/demo.rb +4 -4
- data/examples/find_similar_region.rb +1 -1
- data/examples/histogram.rb +3 -3
- data/examples/identify.rb +46 -46
- data/examples/image_opacity.rb +2 -2
- data/examples/vignette.rb +3 -3
- data/ext/RMagick/extconf.rb +19 -15
- data/ext/RMagick/rmagick.c +1 -2
- data/ext/RMagick/rmagick.h +59 -30
- data/ext/RMagick/rmdraw.c +62 -274
- data/ext/RMagick/rmenum.c +121 -665
- data/ext/RMagick/rmfill.c +7 -7
- data/ext/RMagick/rmilist.c +91 -7
- data/ext/RMagick/rmimage.c +568 -379
- data/ext/RMagick/rminfo.c +152 -110
- data/ext/RMagick/rmkinfo.c +17 -1
- data/ext/RMagick/rmmain.c +75 -74
- data/ext/RMagick/rmmontage.c +33 -33
- data/ext/RMagick/rmpixel.c +75 -14
- data/ext/RMagick/rmstruct.c +5 -5
- data/ext/RMagick/rmutil.c +3 -13
- data/lib/obsolete.rb +66 -0
- data/lib/rmagick/version.rb +1 -1
- data/lib/rmagick_internal.rb +54 -41
- data/spec/rmagick/image/composite_spec.rb +5 -76
- data/spec/rmagick/image/properties_spec.rb +1 -1
- data/test/Draw.rb +52 -115
- data/test/Enum.rb +153 -1
- data/test/Fill.rb +1 -1
- data/test/Image1.rb +97 -43
- data/test/Image2.rb +140 -36
- data/test/Image3.rb +110 -120
- data/test/ImageList1.rb +46 -11
- data/test/ImageList2.rb +11 -21
- data/test/Image_attributes.rb +81 -127
- data/test/Import_Export.rb +2 -2
- data/test/Info.rb +5 -1
- data/test/KernelInfo.rb +67 -0
- data/test/Magick.rb +17 -35
- data/test/Pixel.rb +193 -24
- data/test/PolaroidOptions.rb +1 -1
- data/test/Preview.rb +3 -35
- data/test/Struct.rb +45 -0
- data/test/appearance/Montage.rb +26 -0
- data/test/appearance/appearance_assertion.rb +13 -0
- data/test/appearance/expected/montage_border_color.jpg +0 -0
- data/test/lib/Obsolete.rb +30 -0
- data/test/lib/internal/Draw.rb +823 -0
- data/test/lib/internal/Geometry.rb +98 -0
- data/test/lib/internal/Magick.rb +40 -0
- data/test/test_all_basic.rb +16 -17
- metadata +27 -5
- data/doc/ex/images/Coffee.wmf +0 -0
- data/doc/ex/images/No.wmf +0 -0
- data/doc/ex/images/Snake.wmf +0 -0
Binary file
|
data/doc/ex/implode.rb
CHANGED
@@ -15,7 +15,7 @@ implosion = 0.25
|
|
15
15
|
8.times do
|
16
16
|
frames << img.implode(implosion)
|
17
17
|
legend.annotate(frames, 0, 0, 10, 20, format('% 4.2f', implosion))
|
18
|
-
frames.
|
18
|
+
frames.alpha(Magick::DeactivateAlphaChannel)
|
19
19
|
implosion -= 0.10
|
20
20
|
end
|
21
21
|
|
@@ -23,7 +23,7 @@ end
|
|
23
23
|
implosion += 0.10
|
24
24
|
frames << img.implode(implosion)
|
25
25
|
legend.annotate(frames, 0, 0, 10, 20, format('% 4.2f', implosion))
|
26
|
-
frames.
|
26
|
+
frames.alpha(Magick::DeactivateAlphaChannel)
|
27
27
|
end
|
28
28
|
|
29
29
|
frames.delay = 10
|
data/doc/ex/mask.rb
CHANGED
@@ -26,7 +26,7 @@ end
|
|
26
26
|
# in the mask image. Assign the mask image to the mask= attribute of the image
|
27
27
|
# being masked.
|
28
28
|
|
29
|
-
q.
|
29
|
+
q.alpha(Magick::DeactivateAlphaChannel)
|
30
30
|
img.mask q
|
31
31
|
|
32
32
|
# Use the #level method to darken the image under the black part of the mask.
|
@@ -6,7 +6,7 @@ img = Magick::Image.new(200, 200)
|
|
6
6
|
img.compression = Magick::LZWCompression
|
7
7
|
|
8
8
|
bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' }
|
9
|
-
bg[0].
|
9
|
+
bg[0].alpha(Magick::DeactivateAlphaChannel)
|
10
10
|
|
11
11
|
gc = Magick::Draw.new
|
12
12
|
gc.stroke_width(2)
|
data/doc/ex/matte_floodfill.rb
CHANGED
@@ -6,7 +6,7 @@ img = Magick::Image.new(200, 200)
|
|
6
6
|
img.compression = Magick::LZWCompression
|
7
7
|
|
8
8
|
bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' }
|
9
|
-
bg[0].
|
9
|
+
bg[0].alpha(Magick::DeactivateAlphaChannel)
|
10
10
|
|
11
11
|
gc = Magick::Draw.new
|
12
12
|
gc.stroke_width(2)
|
data/doc/ex/matte_replace.rb
CHANGED
@@ -6,7 +6,7 @@ img = Magick::Image.new(200, 200)
|
|
6
6
|
img.compression = Magick::LZWCompression
|
7
7
|
|
8
8
|
bg = Magick::Image.read('plasma:fractal') { self.size = '200x200' }
|
9
|
-
bg[0].
|
9
|
+
bg[0].alpha(Magick::DeactivateAlphaChannel)
|
10
10
|
|
11
11
|
gc = Magick::Draw.new
|
12
12
|
gc.stroke_width(2)
|
data/doc/ex/stegano.rb
CHANGED
@@ -6,7 +6,7 @@ require 'rmagick'
|
|
6
6
|
# Create a small watermark from the Snake image by
|
7
7
|
# shrinking it and converting it to B&W.
|
8
8
|
begin
|
9
|
-
watermark = Magick::Image.read('images/Snake.
|
9
|
+
watermark = Magick::Image.read('images/Snake.png').first
|
10
10
|
watermark.scale!(64.0 / watermark.rows)
|
11
11
|
watermark = watermark.quantize(256, Magick::GRAYColorspace)
|
12
12
|
wmrows = watermark.rows
|
data/examples/constitute.rb
CHANGED
data/examples/demo.rb
CHANGED
@@ -261,7 +261,7 @@ begin
|
|
261
261
|
puts ' wave...'
|
262
262
|
temp = model.copy
|
263
263
|
temp.cur_image[:Label] = 'Wave'
|
264
|
-
temp.
|
264
|
+
temp.alpha(Magick::ActivateAlphaChannel)
|
265
265
|
temp.background_color = '#000000ff'
|
266
266
|
example << temp.wave(25, 150)
|
267
267
|
|
@@ -309,9 +309,9 @@ begin
|
|
309
309
|
|
310
310
|
# Write the result to a file
|
311
311
|
montage_image.compression = RLECompression
|
312
|
-
montage_image.
|
313
|
-
puts 'Writing image ./rm_demo_out.
|
314
|
-
montage_image.write 'rm_demo_out.
|
312
|
+
montage_image.alpha(Magick::DeactivateAlphaChannel)
|
313
|
+
puts 'Writing image ./rm_demo_out.png'
|
314
|
+
montage_image.write 'rm_demo_out.png'
|
315
315
|
|
316
316
|
# Uncomment the following lines to display image to screen
|
317
317
|
# puts "Displaying image..."
|
@@ -18,7 +18,7 @@ begin
|
|
18
18
|
gc.fill('none')
|
19
19
|
gc.rectangle(res[0], res[1], res[0] + target.columns, res[1] + target.rows)
|
20
20
|
gc.draw(img)
|
21
|
-
img.
|
21
|
+
img.alpha(Magick::DeactivateAlphaChannel)
|
22
22
|
puts "Found similar region. Writing `find_similar_region.gif'..."
|
23
23
|
img.write('find_similar_region.gif')
|
24
24
|
else
|
data/examples/histogram.rb
CHANGED
@@ -68,7 +68,7 @@ module Magick
|
|
68
68
|
blue_histogram['Label'] = 'Blue'
|
69
69
|
int_histogram = rgb_histogram.copy
|
70
70
|
int_histogram['Label'] = 'Intensity'
|
71
|
-
int_histogram.
|
71
|
+
int_histogram.alpha(Magick::ActivateAlphaChannel)
|
72
72
|
|
73
73
|
rgb_column = PixelColumn.new(HISTOGRAM_ROWS)
|
74
74
|
red_column = PixelColumn.new(HISTOGRAM_ROWS)
|
@@ -291,7 +291,7 @@ image = image.first
|
|
291
291
|
# Give the user something to look at while we're working.
|
292
292
|
name = File.basename(filename).sub(/\..*?$/, '')
|
293
293
|
$stdout.sync = true
|
294
|
-
printf "Creating #{name}_Histogram.
|
294
|
+
printf "Creating #{name}_Histogram.png"
|
295
295
|
|
296
296
|
timer = Thread.new do
|
297
297
|
loop do
|
@@ -305,7 +305,7 @@ histogram = image.histogram(Magick::Pixel.from_color('white'), Magick::Pixel.fro
|
|
305
305
|
|
306
306
|
# Write output file
|
307
307
|
histogram.compression = Magick::ZipCompression
|
308
|
-
histogram.write("./#{name}_Histogram.
|
308
|
+
histogram.write("./#{name}_Histogram.png")
|
309
309
|
|
310
310
|
Thread.kill(timer)
|
311
311
|
puts 'Done!'
|
data/examples/identify.rb
CHANGED
@@ -14,7 +14,7 @@ module Magick
|
|
14
14
|
puts "\tEndianess: #{endian}\n"
|
15
15
|
puts "\tColorspace: #{colorspace}\n"
|
16
16
|
puts "\tChannelDepth:\n"
|
17
|
-
color_space = gray? ? Magick::
|
17
|
+
color_space = gray? ? Magick::GRAYColorspace : colorspace
|
18
18
|
case color_space
|
19
19
|
when Magick::RGBColorspace
|
20
20
|
puts "\t\tRed: #{channel_depth(Magick::RedChannel)}-bits\n"
|
@@ -27,7 +27,7 @@ module Magick
|
|
27
27
|
puts "\t\tYellow: #{channel_depth(Magick::YellowChannel)}-bits\n"
|
28
28
|
puts "\t\tBlack: #{channel_depth(Magick::BlackChannel)}-bits\n"
|
29
29
|
puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
|
30
|
-
when Magick::
|
30
|
+
when Magick::GRAYColorspace
|
31
31
|
puts "\t\tGray: #{channel_depth(Magick::GrayChannel)}-bits\n"
|
32
32
|
puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
|
33
33
|
end
|
@@ -36,54 +36,54 @@ module Magick
|
|
36
36
|
case color_space
|
37
37
|
when Magick::RGBColorspace
|
38
38
|
puts "\t\tRed:\n"
|
39
|
-
puts "\t\t\tMin: " +
|
40
|
-
puts "\t\t\tMax: " +
|
41
|
-
puts "\t\t\tMean: " +
|
42
|
-
puts "\t\t\tStandard deviation: " +
|
39
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[0] / scale, channel_extrema(Magick::RedChannel)[0] / Magick::QuantumRange)
|
40
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[1] / scale, channel_extrema(Magick::RedChannel)[1] / Magick::QuantumRange)
|
41
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[0] / scale, channel_mean(Magick::RedChannel)[0] / Magick::QuantumRange)
|
42
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[1] / scale, channel_mean(Magick::RedChannel)[1] / Magick::QuantumRange)
|
43
43
|
puts "\t\tGreen:\n"
|
44
|
-
puts "\t\t\tMin: " +
|
45
|
-
puts "\t\t\tMax: " +
|
46
|
-
puts "\t\t\tMean: " +
|
47
|
-
puts "\t\t\tStandard deviation: " +
|
44
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[0] / scale, channel_extrema(Magick::GreenChannel)[0] / Magick::QuantumRange)
|
45
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[1] / scale, channel_extrema(Magick::GreenChannel)[1] / Magick::QuantumRange)
|
46
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[0] / scale, channel_mean(Magick::GreenChannel)[0] / Magick::QuantumRange)
|
47
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[1] / scale, channel_mean(Magick::GreenChannel)[1] / Magick::QuantumRange)
|
48
48
|
puts "\t\tBlue:\n"
|
49
|
-
puts "\t\t\tMin: " +
|
50
|
-
puts "\t\t\tMax: " +
|
51
|
-
puts "\t\t\tMean: " +
|
52
|
-
puts "\t\t\tStandard deviation: " +
|
49
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[0] / scale, channel_extrema(Magick::BlueChannel)[0] / Magick::QuantumRange)
|
50
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[1] / scale, channel_extrema(Magick::BlueChannel)[1] / Magick::QuantumRange)
|
51
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[0] / scale, channel_mean(Magick::BlueChannel)[0] / Magick::QuantumRange)
|
52
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[1] / scale, channel_mean(Magick::BlueChannel)[1] / Magick::QuantumRange)
|
53
53
|
when Magick::CMYKColorspace
|
54
54
|
puts "\t\tCyan:\n"
|
55
|
-
puts "\t\t\tMin: " +
|
56
|
-
puts "\t\t\tMax: " +
|
57
|
-
puts "\t\t\tMean: " +
|
58
|
-
puts "\t\t\tStandard deviation: " +
|
55
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[0] / scale, channel_extrema(Magick::CyanChannel)[0] / Magick::QuantumRange)
|
56
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[1] / scale, channel_extrema(Magick::CyanChannel)[1] / Magick::QuantumRange)
|
57
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[0] / scale, channel_mean(Magick::CyanChannel)[0] / Magick::QuantumRange)
|
58
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[1] / scale, channel_mean(Magick::CyanChannel)[1] / Magick::QuantumRange)
|
59
59
|
puts "\t\tMagenta:\n"
|
60
|
-
puts "\t\t\tMin: " +
|
61
|
-
puts "\t\t\tMax: " +
|
62
|
-
puts "\t\t\tMean: " +
|
63
|
-
puts "\t\t\tStandard deviation: " +
|
60
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[0] / scale, channel_extrema(Magick::MagentaChannel)[0] / Magick::QuantumRange)
|
61
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[1] / scale, channel_extrema(Magick::MagentaChannel)[1] / Magick::QuantumRange)
|
62
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[0] / scale, channel_mean(Magick::MagentaChannel)[0] / Magick::QuantumRange)
|
63
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[1] / scale, channel_mean(Magick::MagentaChannel)[1] / Magick::QuantumRange)
|
64
64
|
puts "\t\tYellow:\n"
|
65
|
-
puts "\t\t\tMin: " +
|
66
|
-
puts "\t\t\tMax: " +
|
67
|
-
puts "\t\t\tMean: " +
|
68
|
-
puts "\t\t\tStandard deviation: " +
|
65
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[0] / scale, channel_extrema(Magick::YellowChannel)[0] / Magick::QuantumRange)
|
66
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[1] / scale, channel_extrema(Magick::YellowChannel)[1] / Magick::QuantumRange)
|
67
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[0] / scale, channel_mean(Magick::YellowChannel)[0] / Magick::QuantumRange)
|
68
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[1] / scale, channel_mean(Magick::YellowChannel)[1] / Magick::QuantumRange)
|
69
69
|
puts "\t\tBlack:\n"
|
70
|
-
puts "\t\t\tMin: " +
|
71
|
-
puts "\t\t\tMax: " +
|
72
|
-
puts "\t\t\tMean: " +
|
73
|
-
puts "\t\t\tStandard deviation: " +
|
74
|
-
when Magick::
|
70
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[0] / scale, channel_extrema(Magick::BlackChannel)[0] / Magick::QuantumRange)
|
71
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[1] / scale, channel_extrema(Magick::BlackChannel)[1] / Magick::QuantumRange)
|
72
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[0] / scale, channel_mean(Magick::BlackChannel)[0] / Magick::QuantumRange)
|
73
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[1] / scale, channel_mean(Magick::BlackChannel)[1] / Magick::QuantumRange)
|
74
|
+
when Magick::GRAYColorspace
|
75
75
|
puts "\t\tGray:\n"
|
76
|
-
puts "\t\t\tMin: " +
|
77
|
-
puts "\t\t\tMax: " +
|
78
|
-
puts "\t\t\tMean: " +
|
79
|
-
puts "\t\t\tStandard deviation: " +
|
76
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[0] / scale, channel_extrema(Magick::GrayChannel)[0] / Magick::QuantumRange)
|
77
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[1] / scale, channel_extrema(Magick::GrayChannel)[1] / Magick::QuantumRange)
|
78
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[0] / scale, channel_mean(Magick::GrayChannel)[0] / Magick::QuantumRange)
|
79
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[1] / scale, channel_mean(Magick::GrayChannel)[1] / Magick::QuantumRange)
|
80
80
|
end
|
81
81
|
if matte
|
82
82
|
puts "\t\tOpacity:\n"
|
83
|
-
puts "\t\t\tMin: " +
|
84
|
-
puts "\t\t\tMax: " +
|
85
|
-
puts "\t\t\tMean:" +
|
86
|
-
puts "\t\t\tStandard deviation:" +
|
83
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[0] / scale, channel_extrema(Magick::OpacityChannel)[0] / Magick::QuantumRange)
|
84
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[1] / scale, channel_extrema(Magick::OpacityChannel)[1] / Magick::QuantumRange)
|
85
|
+
puts "\t\t\tMean:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[0] / scale, channel_mean(Magick::OpacityChannel)[0] / Magick::QuantumRange)
|
86
|
+
puts "\t\t\tStandard deviation:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[1] / scale, channel_mean(Magick::OpacityChannel)[1] / Magick::QuantumRange)
|
87
87
|
end
|
88
88
|
if class_type == Magick::DirectClass
|
89
89
|
puts "\tColors: #{total_colors}\n"
|
@@ -101,20 +101,20 @@ module Magick
|
|
101
101
|
chrom = chromaticity
|
102
102
|
if chrom.red_primary.x != 0.0 || chrom.green_primary.x != 0.0 || chrom.blue_primary.x != 0.0 || chrom.white_point.x != 0.0
|
103
103
|
puts "\tChromaticity:\n"
|
104
|
-
puts "\t\tred primary: (#{
|
105
|
-
puts "\t\tgreen primary: (#{
|
106
|
-
puts "\t\tblue primary: (#{
|
107
|
-
puts "\t\twhite point: (#{
|
104
|
+
puts "\t\tred primary: (#{sprintf('%g,%g', chrom.red_primary.x, chrom.red_primary.y)})\n"
|
105
|
+
puts "\t\tgreen primary: (#{sprintf('%g,%g', chrom.green_primary.x, chrom.green_primary.y)})\n"
|
106
|
+
puts "\t\tblue primary: (#{sprintf('%g,%g', chrom.blue_primary.x, chrom.blue_primary.y)})\n"
|
107
|
+
puts "\t\twhite point: (#{sprintf('%g,%g', chrom.white_point.x, chrom.white_point.y)})\n"
|
108
108
|
end
|
109
109
|
ex_info = extract_info
|
110
110
|
puts "\tTile geometry: #{ex_info.width}x#{ex_info.height}+#{ex_info.x}+#{ex_info.y}\n" if ex_info.width * ex_info.height != 0.0
|
111
|
-
puts "\tResolution: #{
|
111
|
+
puts "\tResolution: #{sprintf('%gx%g', x_resolution, y_resolution)}\n" if x_resolution != 0.0 && y_resolution != 0.0
|
112
112
|
puts "\tUnits: #{units}\n"
|
113
113
|
size = filesize
|
114
114
|
if size >= 1_048_576
|
115
|
-
puts "\tFilesize: #{
|
115
|
+
puts "\tFilesize: #{sprintf('%.1f', (size / 1_048_576.0))}mb\n"
|
116
116
|
elsif size >= 1024
|
117
|
-
puts "\tFilesize: #{
|
117
|
+
puts "\tFilesize: #{sprintf('%.0f', (size / 1024.0))}kb\n"
|
118
118
|
else
|
119
119
|
puts "\tFilesize: #{size}b\n"
|
120
120
|
end
|
data/examples/image_opacity.rb
CHANGED
data/examples/vignette.rb
CHANGED
@@ -51,8 +51,8 @@ oval = oval.blur_image(0, 20)
|
|
51
51
|
# the oval remain opaque. Each gray pixel around the border of the oval has a
|
52
52
|
# varying level of transparency depending on how dark or light it is.
|
53
53
|
|
54
|
-
ballerina.
|
55
|
-
oval.
|
54
|
+
ballerina.alpha(Magick::ActivateAlphaChannel) # Ensure the ballerina image's opacity channel is enabled.
|
55
|
+
oval.alpha(Magick::DeactivateAlphaChannel) # Force the CopyOpacityCompositeOp to use pixel intensity
|
56
56
|
# to determine how much transparency to add to the ballerina
|
57
57
|
# pixels.
|
58
58
|
|
@@ -74,5 +74,5 @@ end
|
|
74
74
|
|
75
75
|
checkerboard = Image.read('pattern:checkerboard') { self.size = "#{ballerina.columns}x#{ballerina.rows}" }
|
76
76
|
vignette = checkerboard[0].composite(ballerina, CenterGravity, OverCompositeOp)
|
77
|
-
vignette.
|
77
|
+
vignette.write('vignette.png')
|
78
78
|
exit
|
data/ext/RMagick/extconf.rb
CHANGED
@@ -9,26 +9,30 @@ module RMagick
|
|
9
9
|
require 'rmagick/version'
|
10
10
|
RMAGICK_VERS = ::Magick::VERSION
|
11
11
|
MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
|
12
|
-
MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr('.', '').to_i
|
13
12
|
|
14
13
|
attr_reader :headers
|
15
14
|
|
16
15
|
def initialize
|
17
16
|
@stdout = $stdout.dup
|
18
17
|
|
19
|
-
|
18
|
+
setup_pkg_config_path
|
20
19
|
configure_compile_options
|
21
20
|
assert_can_compile!
|
22
21
|
configure_headers
|
23
22
|
end
|
24
23
|
|
25
|
-
def
|
26
|
-
|
24
|
+
def setup_pkg_config_path
|
25
|
+
if find_executable('brew')
|
26
|
+
pkg_config_path = "#{`brew --prefix imagemagick@6`.strip}/lib/pkgconfig"
|
27
|
+
elsif find_executable('pacman')
|
28
|
+
pkg_config_path = '/usr/lib/imagemagick6/pkgconfig'
|
29
|
+
else
|
30
|
+
return
|
31
|
+
end
|
27
32
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], brew_pkg_config_path].compact.join(':')
|
33
|
+
pkg_config_paths = ENV['PKG_CONFIG_PATH'].to_s.split(':')
|
34
|
+
if File.exist?(pkg_config_path) && !pkg_config_paths.include?(pkg_config_path)
|
35
|
+
ENV['PKG_CONFIG_PATH'] = [ENV['PKG_CONFIG_PATH'], pkg_config_path].compact.join(':')
|
32
36
|
end
|
33
37
|
end
|
34
38
|
|
@@ -45,8 +49,7 @@ module RMagick
|
|
45
49
|
end
|
46
50
|
|
47
51
|
def configure_headers
|
48
|
-
@headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h]
|
49
|
-
headers << 'sys/types.h' if have_header('sys/types.h')
|
52
|
+
@headers = %w[assert.h ctype.h stdio.h stdlib.h math.h time.h sys/types.h]
|
50
53
|
|
51
54
|
if have_header('magick/MagickCore.h')
|
52
55
|
headers << 'magick/MagickCore.h'
|
@@ -98,7 +101,6 @@ module RMagick
|
|
98
101
|
$LDFLAGS = %(-L"#{dir_paths[:lib]}")
|
99
102
|
|
100
103
|
have_library('CORE_RL_magick_')
|
101
|
-
have_library('X11')
|
102
104
|
|
103
105
|
else # mswin
|
104
106
|
|
@@ -111,9 +113,10 @@ module RMagick
|
|
111
113
|
$LDFLAGS << %( -libpath:"#{dir_paths[:lib]}")
|
112
114
|
|
113
115
|
$LOCAL_LIBS = 'CORE_RL_magick_.lib'
|
114
|
-
have_library('X11')
|
115
116
|
|
116
117
|
end
|
118
|
+
|
119
|
+
$CFLAGS << (have_macro('__GNUC__') ? ' -std=gnu99' : ' -std=c99')
|
117
120
|
end
|
118
121
|
|
119
122
|
# Test for a specific value in an enum type
|
@@ -285,8 +288,7 @@ END_MINGW
|
|
285
288
|
|
286
289
|
def assert_minimum_ruby_version!
|
287
290
|
unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
|
288
|
-
|
289
|
-
version >= MIN_RUBY_VERS_NO
|
291
|
+
Gem::Version.new(RUBY_VERSION) >= Gem::Version.new(MIN_RUBY_VERS)
|
290
292
|
end
|
291
293
|
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
|
292
294
|
end
|
@@ -303,7 +305,6 @@ END_MINGW
|
|
303
305
|
end
|
304
306
|
|
305
307
|
def create_header_file
|
306
|
-
have_func('snprintf', headers)
|
307
308
|
[
|
308
309
|
'GetImageChannelEntropy', # 6.9.0-0
|
309
310
|
'SetImageGray' # 6.9.1-10
|
@@ -318,6 +319,9 @@ END_MINGW
|
|
318
319
|
if Gem::Version.new($magick_version) >= Gem::Version.new('6.8.9')
|
319
320
|
$defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9=1')
|
320
321
|
end
|
322
|
+
if Gem::Version.new($magick_version) >= Gem::Version.new('6.9.0')
|
323
|
+
$defs.push('-DIMAGEMAGICK_GREATER_THAN_EQUAL_6_9_0=1')
|
324
|
+
end
|
321
325
|
|
322
326
|
create_header
|
323
327
|
end
|
data/ext/RMagick/rmagick.c
CHANGED
@@ -179,14 +179,13 @@ MagickInfo_to_format(const MagickInfo *magick_info)
|
|
179
179
|
* @see MagickInfo_to_format
|
180
180
|
*/
|
181
181
|
VALUE
|
182
|
-
Magick_init_formats(VALUE class)
|
182
|
+
Magick_init_formats(VALUE class ATTRIBUTE_UNUSED)
|
183
183
|
{
|
184
184
|
const MagickInfo **magick_info;
|
185
185
|
size_t number_formats, x;
|
186
186
|
VALUE formats;
|
187
187
|
ExceptionInfo *exception;
|
188
188
|
|
189
|
-
class = class; // defeat "never referenced" message from icc
|
190
189
|
formats = rb_hash_new();
|
191
190
|
|
192
191
|
// IM 6.1.3 added an exception argument to GetMagickInfoList
|
data/ext/RMagick/rmagick.h
CHANGED
@@ -21,10 +21,7 @@
|
|
21
21
|
#include <ctype.h>
|
22
22
|
#include <stdlib.h>
|
23
23
|
#include <math.h>
|
24
|
-
#include <time.h>
|
25
|
-
#if defined(HAVE_SYS_TYPES_H)
|
26
24
|
#include <sys/types.h>
|
27
|
-
#endif
|
28
25
|
#include "ruby.h"
|
29
26
|
#include "ruby/io.h"
|
30
27
|
|
@@ -52,6 +49,11 @@
|
|
52
49
|
//! For quoting preprocessor symbols
|
53
50
|
#define Q(q) Q2(q)
|
54
51
|
|
52
|
+
#ifdef __GNUC__
|
53
|
+
#define ATTRIBUTE_UNUSED __attribute__((unused))
|
54
|
+
#else
|
55
|
+
#define ATTRIBUTE_UNUSED
|
56
|
+
#endif
|
55
57
|
|
56
58
|
//! Trace new image creation in bang methods
|
57
59
|
#define UPDATE_DATA_PTR(_obj_, _new_) \
|
@@ -117,6 +119,12 @@ typedef ImageInfo Info; /**< Make type name match class name */
|
|
117
119
|
typedef PixelPacket Pixel; /**< Make type name match class name */
|
118
120
|
typedef MagickPixelPacket MagickPixel;
|
119
121
|
typedef PixelPacket PixelColor;
|
122
|
+
typedef AlphaChannelType AlphaChannelOption;
|
123
|
+
typedef DistortImageMethod DistortMethod;
|
124
|
+
typedef FilterTypes FilterType;
|
125
|
+
typedef InterpolatePixelMethod PixelInterpolateMethod;
|
126
|
+
typedef ImageLayerMethod LayerMethod;
|
127
|
+
#define TransparentAlpha 0
|
120
128
|
|
121
129
|
//! Montage
|
122
130
|
typedef struct
|
@@ -286,7 +294,7 @@ EXTERN VALUE Class_QuantumExpressionOperator;
|
|
286
294
|
// Enum classes
|
287
295
|
EXTERN VALUE Class_Enum;
|
288
296
|
EXTERN VALUE Class_AlignType;
|
289
|
-
EXTERN VALUE
|
297
|
+
EXTERN VALUE Class_AlphaChannelOption;
|
290
298
|
EXTERN VALUE Class_AnchorType;
|
291
299
|
EXTERN VALUE Class_ChannelType;
|
292
300
|
EXTERN VALUE Class_ClassType;
|
@@ -296,19 +304,19 @@ EXTERN VALUE Class_CompositeOperator;
|
|
296
304
|
EXTERN VALUE Class_CompressionType;
|
297
305
|
EXTERN VALUE Class_DecorationType;
|
298
306
|
EXTERN VALUE Class_DisposeType;
|
299
|
-
EXTERN VALUE
|
307
|
+
EXTERN VALUE Class_DistortMethod;
|
300
308
|
EXTERN VALUE Class_DitherMethod;
|
301
309
|
EXTERN VALUE Class_EndianType;
|
302
|
-
EXTERN VALUE
|
310
|
+
EXTERN VALUE Class_FilterType;
|
303
311
|
EXTERN VALUE Class_GravityType;
|
304
312
|
EXTERN VALUE Class_ImageType;
|
305
313
|
EXTERN VALUE Class_InterlaceType;
|
306
|
-
EXTERN VALUE
|
307
|
-
EXTERN VALUE Class_ImageLayerMethod;
|
314
|
+
EXTERN VALUE Class_LayerMethod;
|
308
315
|
EXTERN VALUE Class_MagickFunction;
|
309
316
|
EXTERN VALUE Class_NoiseType;
|
310
317
|
EXTERN VALUE Class_OrientationType;
|
311
318
|
EXTERN VALUE Class_PaintMethod;
|
319
|
+
EXTERN VALUE Class_PixelInterpolateMethod;
|
312
320
|
EXTERN VALUE Class_PreviewType;
|
313
321
|
EXTERN VALUE Class_RenderingIntent;
|
314
322
|
EXTERN VALUE Class_ResolutionType;
|
@@ -430,6 +438,20 @@ EXTERN ID rm_ID_y; /**< "y" */
|
|
430
438
|
rb_check_frozen(self);\
|
431
439
|
Data_Get_Struct(self, class, ptr);\
|
432
440
|
ptr->attr = R_##type##_to_C_##type(val);\
|
441
|
+
return val;\
|
442
|
+
}
|
443
|
+
|
444
|
+
//! define attribute writer when attribute name is different from the field name
|
445
|
+
#define DEF_ATTR_WRITERF(class, attr, field, type) \
|
446
|
+
VALUE class##_##attr##_eq(VALUE self, VALUE val)\
|
447
|
+
{\
|
448
|
+
class *ptr;\
|
449
|
+
if (rb_obj_is_kind_of(self, Class_Image) == Qtrue) {\
|
450
|
+
(void) rm_check_destroyed(self); \
|
451
|
+
}\
|
452
|
+
rb_check_frozen(self);\
|
453
|
+
Data_Get_Struct(self, class, ptr);\
|
454
|
+
ptr->field = R_##type##_to_C_##type(val);\
|
433
455
|
return self;\
|
434
456
|
}
|
435
457
|
|
@@ -438,6 +460,11 @@ EXTERN ID rm_ID_y; /**< "y" */
|
|
438
460
|
DEF_ATTR_READER(class, attr, type)\
|
439
461
|
DEF_ATTR_WRITER(class, attr, type)
|
440
462
|
|
463
|
+
//! define attribute accessor when attribute name is different from the field name
|
464
|
+
#define DEF_ATTR_ACCESSORF(class, attr, field, type)\
|
465
|
+
DEF_ATTR_READERF(class, attr, field, type)\
|
466
|
+
DEF_ATTR_WRITERF(class, attr, field, type)
|
467
|
+
|
441
468
|
/*
|
442
469
|
* Declare attribute accessors
|
443
470
|
*/
|
@@ -456,8 +483,10 @@ EXTERN ID rm_ID_y; /**< "y" */
|
|
456
483
|
//! Define a Magick module constant
|
457
484
|
#if MAGICKCORE_QUANTUM_DEPTH == 64
|
458
485
|
#define DEF_CONST(constant) rb_define_const(Module_Magick, #constant, ULL2NUM(constant))
|
486
|
+
#define DEF_CONSTV(constant, val) rb_define_const(Module_Magick, #constant, ULL2NUM(val))
|
459
487
|
#else // MAGICKCORE_QUANTUM_DEPTH == 8, 16, 32
|
460
488
|
#define DEF_CONST(constant) rb_define_const(Module_Magick, #constant, UINT2NUM(constant))
|
489
|
+
#define DEF_CONSTV(constant, val) rb_define_const(Module_Magick, #constant, UINT2NUM(val))
|
461
490
|
#endif
|
462
491
|
|
463
492
|
|
@@ -573,6 +602,7 @@ extern VALUE ImageList_animate(int, VALUE *, VALUE);
|
|
573
602
|
extern VALUE ImageList_append(VALUE, VALUE);
|
574
603
|
extern VALUE ImageList_average(VALUE);
|
575
604
|
extern VALUE ImageList_coalesce(VALUE);
|
605
|
+
extern VALUE ImageList_combine(int, VALUE *, VALUE);
|
576
606
|
extern VALUE ImageList_composite_layers(int, VALUE *, VALUE);
|
577
607
|
extern VALUE ImageList_deconstruct(VALUE);
|
578
608
|
extern VALUE ImageList_display(VALUE);
|
@@ -627,7 +657,6 @@ ATTR_ACCESSOR(Info, orientation)
|
|
627
657
|
ATTR_ACCESSOR(Info, origin)
|
628
658
|
ATTR_ACCESSOR(Info, page)
|
629
659
|
ATTR_ACCESSOR(Info, pen)
|
630
|
-
// ATTR_ACCESSOR(Info, ping) obsolete
|
631
660
|
ATTR_ACCESSOR(Info, pointsize)
|
632
661
|
ATTR_ACCESSOR(Info, quality)
|
633
662
|
ATTR_ACCESSOR(Info, sampling_factor)
|
@@ -642,7 +671,6 @@ ATTR_ACCESSOR(Info, transparent_color)
|
|
642
671
|
ATTR_ACCESSOR(Info, undercolor)
|
643
672
|
ATTR_ACCESSOR(Info, units)
|
644
673
|
ATTR_ACCESSOR(Info, view)
|
645
|
-
//ATTR_ACCESSOR(Info, verbose)
|
646
674
|
|
647
675
|
extern VALUE Info_alloc(VALUE);
|
648
676
|
|
@@ -875,7 +903,7 @@ extern VALUE Image_map(int, VALUE *, VALUE);
|
|
875
903
|
extern VALUE Image_marshal_dump(VALUE);
|
876
904
|
extern VALUE Image_marshal_load(VALUE, VALUE);
|
877
905
|
extern VALUE Image_mask(int, VALUE *, VALUE);
|
878
|
-
extern VALUE Image_matte_flood_fill(
|
906
|
+
extern VALUE Image_matte_flood_fill(int, VALUE *, VALUE);
|
879
907
|
extern VALUE Image_median_filter(int, VALUE *, VALUE);
|
880
908
|
extern VALUE Image_minify(VALUE);
|
881
909
|
extern VALUE Image_minify_bang(VALUE);
|
@@ -995,6 +1023,7 @@ extern VALUE TextureFill_fill(VALUE, VALUE);
|
|
995
1023
|
ATTR_ACCESSOR(Pixel, red)
|
996
1024
|
ATTR_ACCESSOR(Pixel, green)
|
997
1025
|
ATTR_ACCESSOR(Pixel, blue)
|
1026
|
+
ATTR_ACCESSOR(Pixel, alpha)
|
998
1027
|
ATTR_ACCESSOR(Pixel, opacity)
|
999
1028
|
ATTR_ACCESSOR(Pixel, cyan)
|
1000
1029
|
ATTR_ACCESSOR(Pixel, magenta)
|
@@ -1032,31 +1061,31 @@ extern VALUE Enum_spaceship(VALUE, VALUE);
|
|
1032
1061
|
extern VALUE Enum_bitwise_or(VALUE, VALUE);
|
1033
1062
|
extern VALUE Enum_case_eq(VALUE, VALUE);
|
1034
1063
|
extern VALUE Enum_type_initialize(VALUE, VALUE, VALUE);
|
1064
|
+
extern VALUE Enum_find(VALUE class, int val);
|
1035
1065
|
extern VALUE Enum_type_each(VALUE);
|
1036
1066
|
extern VALUE rm_enum_new(VALUE, VALUE, VALUE);
|
1037
|
-
extern VALUE
|
1038
|
-
extern VALUE
|
1067
|
+
extern VALUE ClassType_find(ClassType);
|
1068
|
+
extern VALUE ColorspaceType_find(ColorspaceType);
|
1039
1069
|
extern const char *ComplianceType_name(ComplianceType *);
|
1040
|
-
extern VALUE
|
1041
|
-
extern VALUE
|
1042
|
-
extern VALUE
|
1043
|
-
extern VALUE
|
1044
|
-
extern VALUE
|
1045
|
-
extern VALUE
|
1046
|
-
extern VALUE
|
1047
|
-
extern VALUE
|
1048
|
-
extern VALUE
|
1049
|
-
extern VALUE
|
1050
|
-
extern VALUE
|
1051
|
-
extern VALUE
|
1052
|
-
extern VALUE
|
1053
|
-
extern VALUE ResolutionType_new(ResolutionType);
|
1070
|
+
extern VALUE ComplianceType_find(ComplianceType);
|
1071
|
+
extern VALUE CompositeOperator_find(CompositeOperator);
|
1072
|
+
extern VALUE CompressionType_find(CompressionType);
|
1073
|
+
extern VALUE DisposeType_find(DisposeType);
|
1074
|
+
extern VALUE EndianType_find(EndianType);
|
1075
|
+
extern VALUE FilterType_find(FilterType);
|
1076
|
+
extern VALUE GravityType_find(GravityType);
|
1077
|
+
extern VALUE ImageType_find(ImageType);
|
1078
|
+
extern VALUE InterlaceType_find(InterlaceType);
|
1079
|
+
extern VALUE OrientationType_find(OrientationType);
|
1080
|
+
extern VALUE PixelInterpolateMethod_find(PixelInterpolateMethod);
|
1081
|
+
extern VALUE RenderingIntent_find(RenderingIntent);
|
1082
|
+
extern VALUE ResolutionType_find(ResolutionType);
|
1054
1083
|
extern const char *StorageType_name(StorageType);
|
1055
|
-
extern VALUE
|
1084
|
+
extern VALUE StretchType_find(StretchType);
|
1056
1085
|
extern const char *StretchType_name(StretchType);
|
1057
|
-
extern VALUE
|
1086
|
+
extern VALUE StyleType_find(StyleType);
|
1058
1087
|
extern const char *StyleType_name(StyleType);
|
1059
|
-
extern VALUE
|
1088
|
+
extern VALUE VirtualPixelMethod_find(VirtualPixelMethod);
|
1060
1089
|
|
1061
1090
|
|
1062
1091
|
// rmstruct.c
|