rmagick 1.15.17 → 2.0.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.
- data/ChangeLog +78 -25
- data/README.html +117 -188
- data/README.txt +116 -181
- data/build_tarball.rake +205 -0
- data/doc/comtasks.html +2 -2
- data/doc/constants.html +118 -44
- data/doc/draw.html +57 -99
- data/doc/ex/adaptive_threshold.rb +1 -10
- data/doc/ex/add_noise.rb +4 -5
- data/doc/ex/axes.rb +1 -1
- data/doc/ex/bilevel_channel.rb +2 -13
- data/doc/ex/bounding_box.rb +3 -4
- data/doc/ex/channel.rb +6 -7
- data/doc/ex/clip_path.rb +11 -5
- data/doc/ex/color_histogram.rb +8 -20
- data/doc/ex/composite_layers.rb +53 -0
- data/doc/ex/fill_pattern.rb +26 -0
- data/doc/ex/get_multiline_type_metrics.rb +26 -37
- data/doc/ex/get_type_metrics.rb +25 -25
- data/doc/ex/images/notimplemented.gif +0 -0
- data/doc/ex/level.rb +1 -1
- data/doc/ex/matte_floodfill.rb +5 -6
- data/doc/ex/matte_replace.rb +5 -6
- data/doc/ex/negate_channel.rb +0 -10
- data/doc/ex/opacity.rb +3 -5
- data/doc/ex/polaroid.rb +4 -1
- data/doc/ex/posterize.rb +1 -12
- data/doc/ex/preview.rb +1 -8
- data/doc/ex/radial_blur.rb +1 -11
- data/doc/ex/raise.rb +1 -4
- data/doc/ex/random_threshold_channel.rb +4 -9
- data/doc/ex/sepiatone.rb +2 -9
- data/doc/ex/shadow.rb +12 -18
- data/doc/ex/sketch.rb +2 -9
- data/doc/ex/smile.rb +7 -7
- data/doc/ex/splice.rb +3 -10
- data/doc/ex/stegano.rb +5 -0
- data/doc/ex/threshold.rb +2 -2
- data/doc/ex/transpose.rb +1 -8
- data/doc/ex/transverse.rb +1 -8
- data/doc/ex/trim.rb +1 -2
- data/doc/ex/viewex.rb +4 -5
- data/doc/ex/vignette.rb +1 -8
- data/doc/ex/watermark.rb +1 -0
- data/doc/ex/wet_floor.rb +8 -14
- data/doc/ilist.html +301 -110
- data/doc/image1.html +362 -258
- data/doc/image2.html +429 -286
- data/doc/image3.html +418 -192
- data/doc/imageattrs.html +100 -39
- data/doc/imusage.html +26 -21
- data/doc/index.html +52 -93
- data/doc/info.html +160 -64
- data/doc/magick.html +37 -71
- data/doc/optequiv.html +155 -61
- data/doc/rvg.html +3 -3
- data/doc/rvgclip.html +2 -2
- data/doc/rvggroup.html +2 -2
- data/doc/rvgimage.html +3 -3
- data/doc/rvgpattern.html +3 -3
- data/doc/rvgshape.html +2 -2
- data/doc/rvgstyle.html +2 -2
- data/doc/rvgtext.html +2 -2
- data/doc/rvgtspan.html +4 -4
- data/doc/rvgtut.html +4 -4
- data/doc/rvguse.html +3 -3
- data/doc/rvgxform.html +2 -2
- data/doc/struct.html +26 -29
- data/doc/usage.html +99 -48
- data/examples/crop_with_gravity.rb +46 -0
- data/examples/demo.rb +2 -2
- data/examples/histogram.rb +11 -11
- data/examples/identify.rb +45 -45
- data/examples/spinner.rb +3 -2
- data/ext/RMagick/MANIFEST +7 -8
- data/ext/RMagick/extconf.rb +242 -0
- data/ext/RMagick/rmagick.h +136 -222
- data/ext/RMagick/rmdraw.c +226 -229
- data/ext/RMagick/rmfill.c +69 -118
- data/ext/RMagick/rmilist.c +234 -94
- data/ext/RMagick/rmimage.c +1719 -2564
- data/ext/RMagick/rminfo.c +433 -619
- data/ext/RMagick/rmmain.c +249 -487
- data/ext/RMagick/rmutil.c +344 -563
- data/lib/RMagick.rb +414 -358
- data/lib/rvg/clippath.rb +2 -2
- data/lib/rvg/container.rb +2 -2
- data/lib/rvg/describable.rb +2 -2
- data/lib/rvg/embellishable.rb +2 -2
- data/lib/rvg/misc.rb +3 -3
- data/lib/rvg/paint.rb +2 -7
- data/lib/rvg/pathdata.rb +2 -2
- data/lib/rvg/rvg.rb +2 -2
- data/lib/rvg/stretchable.rb +2 -14
- data/lib/rvg/stylable.rb +2 -2
- data/lib/rvg/text.rb +2 -2
- data/lib/rvg/transformable.rb +2 -2
- data/lib/rvg/units.rb +2 -2
- data/{metaconfig.in → metaconfig} +0 -1
- data/post-setup.rb +1 -1
- data/rmagick.gemspec +6 -9
- metadata +41 -49
- data/Makefile.in +0 -42
- data/configure +0 -12358
- data/configure.ac +0 -791
- data/ext/RMagick/extconf.rb.in +0 -25
- data/ext/RMagick/rmagick_config.h.in +0 -285
- data/gem_extconf.rb +0 -42
@@ -0,0 +1,46 @@
|
|
1
|
+
#! /usr/local/bin/ruby -w
|
2
|
+
|
3
|
+
#=======================================================#
|
4
|
+
# Thanks to Robert Wagner for the idea of allowing a #
|
5
|
+
# GravityType instead of the x- and y-offset arguments! #
|
6
|
+
#=======================================================#
|
7
|
+
|
8
|
+
# Demo the use of the GravityType argument to Image#crop.
|
9
|
+
|
10
|
+
require 'RMagick'
|
11
|
+
include Magick
|
12
|
+
|
13
|
+
shorts = Image.read('../doc/ex/images/Shorts.jpg').first
|
14
|
+
|
15
|
+
regwidth = shorts.columns/2
|
16
|
+
regheight = shorts.rows/2
|
17
|
+
|
18
|
+
mask = Image.new(regwidth, regheight) { self.background_color = 'white'}
|
19
|
+
mask.opacity = 0.50 * TransparentOpacity
|
20
|
+
|
21
|
+
black = Image.new(shorts.columns, shorts.rows) {self.background_color = 'black'}
|
22
|
+
pairs = ImageList.new
|
23
|
+
|
24
|
+
[NorthWestGravity, NorthGravity, NorthEastGravity,
|
25
|
+
WestGravity, CenterGravity, EastGravity,
|
26
|
+
SouthWestGravity, SouthGravity, SouthEastGravity].each do |gravity|
|
27
|
+
pattern = shorts.composite(mask, gravity, OverCompositeOp)
|
28
|
+
cropped = shorts.crop(gravity, regwidth, regheight)
|
29
|
+
result = black.composite(cropped, gravity, OverCompositeOp)
|
30
|
+
result.border_color = "white"
|
31
|
+
pairs << pattern
|
32
|
+
pairs << result
|
33
|
+
end
|
34
|
+
|
35
|
+
# Montage into a single image
|
36
|
+
montage = pairs.montage {
|
37
|
+
self.geometry = "#{pairs.columns}x#{pairs.rows}+0+0"
|
38
|
+
self.tile = "6x3"
|
39
|
+
self.border_width = 1
|
40
|
+
}
|
41
|
+
montage.write('crop_with_gravity.miff')
|
42
|
+
#montage.display
|
43
|
+
|
44
|
+
|
45
|
+
|
46
|
+
|
data/examples/demo.rb
CHANGED
@@ -17,12 +17,12 @@ Font = "Helvetica"
|
|
17
17
|
begin
|
18
18
|
puts "Read images..."
|
19
19
|
|
20
|
-
model = ImageList.new("images/model.miff")
|
20
|
+
model = ImageList.new("../doc/ex/images/model.miff")
|
21
21
|
model.border_color = "black"
|
22
22
|
model.background_color = "black"
|
23
23
|
model.cur_image[:Label] = "RMagick"
|
24
24
|
|
25
|
-
smile = ImageList.new("images/smile.miff")
|
25
|
+
smile = ImageList.new("../doc/ex/images/smile.miff")
|
26
26
|
smile.border_color = "black"
|
27
27
|
smile.cur_image[:Label] = "Smile"
|
28
28
|
|
data/examples/histogram.rb
CHANGED
@@ -9,14 +9,14 @@ class PixelColumn < Array
|
|
9
9
|
super
|
10
10
|
fill {Magick::Pixel.new}
|
11
11
|
end
|
12
|
-
|
12
|
+
|
13
13
|
def reset(bg)
|
14
14
|
each {|pixel| pixel.reset(bg)}
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
18
|
module Magick
|
19
|
-
|
19
|
+
|
20
20
|
class Pixel
|
21
21
|
def reset(bg)
|
22
22
|
self.red = bg.red
|
@@ -25,7 +25,7 @@ module Magick
|
|
25
25
|
self.opacity = bg.opacity
|
26
26
|
end
|
27
27
|
end
|
28
|
-
|
28
|
+
|
29
29
|
class Image
|
30
30
|
|
31
31
|
private
|
@@ -82,28 +82,28 @@ module Magick
|
|
82
82
|
|
83
83
|
yf = Float(y)
|
84
84
|
if yf >= HISTOGRAM_ROWS - (red[x] * scale)
|
85
|
-
red_column[y].red =
|
85
|
+
red_column[y].red = QuantumRange
|
86
86
|
red_column[y].green = 0
|
87
87
|
red_column[y].blue = 0
|
88
|
-
rgb_column[y].red =
|
88
|
+
rgb_column[y].red = QuantumRange
|
89
89
|
end
|
90
90
|
if yf >= HISTOGRAM_ROWS - (green[x] * scale)
|
91
|
-
green_column[y].green =
|
91
|
+
green_column[y].green = QuantumRange
|
92
92
|
green_column[y].red = 0
|
93
93
|
green_column[y].blue = 0
|
94
|
-
rgb_column[y].green =
|
94
|
+
rgb_column[y].green = QuantumRange
|
95
95
|
end
|
96
96
|
if yf >= HISTOGRAM_ROWS - (blue[x] * scale)
|
97
|
-
blue_column[y].blue =
|
97
|
+
blue_column[y].blue = QuantumRange
|
98
98
|
blue_column[y].red = 0
|
99
99
|
blue_column[y].green = 0
|
100
|
-
rgb_column[y].blue =
|
100
|
+
rgb_column[y].blue = QuantumRange
|
101
101
|
end
|
102
102
|
if yf >= HISTOGRAM_ROWS - (int[x] * scale)
|
103
103
|
int_column[y].opacity = TransparentOpacity
|
104
104
|
end
|
105
105
|
end
|
106
|
-
|
106
|
+
|
107
107
|
rgb_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, rgb_column)
|
108
108
|
red_histogram.store_pixels( x, 0, 1, HISTOGRAM_ROWS, red_column)
|
109
109
|
green_histogram.store_pixels(x, 0, 1, HISTOGRAM_ROWS, green_column)
|
@@ -228,7 +228,7 @@ Colors: #{number_colors}
|
|
228
228
|
# Scale to chart size. When computing the scale, add some "air" between
|
229
229
|
# the max frequency and the top of the histogram. This makes a prettier chart.
|
230
230
|
# The RGBA and intensity histograms are all drawn to the same scale.
|
231
|
-
|
231
|
+
|
232
232
|
max = [red.max, green.max, blue.max, alpha.max, int.max].max
|
233
233
|
scale = HISTOGRAM_ROWS / (max*AIR_FACTOR)
|
234
234
|
|
data/examples/identify.rb
CHANGED
@@ -12,11 +12,11 @@ module Magick
|
|
12
12
|
puts "\tGeometry: #{columns}x#{rows}\n"
|
13
13
|
puts "\tClass: #{class_type.to_s}\n"
|
14
14
|
puts "\tType: #{image_type.to_s}\n"
|
15
|
-
puts "\tEndianess: #{endian}\n"
|
15
|
+
puts "\tEndianess: #{endian}\n"
|
16
16
|
puts "\tColorspace: #{colorspace}\n"
|
17
17
|
puts "\tChannelDepth:\n"
|
18
18
|
color_space = gray? ? Magick::GrayColorspace : colorspace
|
19
|
-
case color_space
|
19
|
+
case color_space
|
20
20
|
when Magick::RGBColorspace
|
21
21
|
puts "\t\tRed: #{channel_depth(Magick::RedChannel)}-bits\n"
|
22
22
|
puts "\t\tGreen: #{channel_depth(Magick::GreenChannel)}-bits\n"
|
@@ -32,59 +32,59 @@ module Magick
|
|
32
32
|
puts "\t\tGray: #{channel_depth(Magick::GrayChannel)}-bits\n"
|
33
33
|
puts "\t\tOpacity: #{channel_depth(Magick::OpacityChannel)}-bits\n" if matte
|
34
34
|
end
|
35
|
-
scale = Magick::
|
35
|
+
scale = Magick::QuantumRange / (Magick::QuantumRange >> (Magick::QuantumDepth-channel_depth))
|
36
36
|
puts "\tChannel statistics:\n"
|
37
37
|
case color_space
|
38
38
|
when Magick::RGBColorspace
|
39
39
|
puts "\t\tRed:\n"
|
40
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[0]/scale, channel_extrema(Magick::RedChannel)[0]/Magick::
|
41
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[1]/scale, channel_extrema(Magick::RedChannel)[1]/Magick::
|
42
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[0]/scale, channel_mean(Magick::RedChannel)[0]/Magick::
|
43
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[1]/scale, channel_mean(Magick::RedChannel)[1]/Magick::
|
40
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[0]/scale, channel_extrema(Magick::RedChannel)[0]/Magick::QuantumRange)
|
41
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::RedChannel)[1]/scale, channel_extrema(Magick::RedChannel)[1]/Magick::QuantumRange)
|
42
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[0]/scale, channel_mean(Magick::RedChannel)[0]/Magick::QuantumRange)
|
43
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::RedChannel)[1]/scale, channel_mean(Magick::RedChannel)[1]/Magick::QuantumRange)
|
44
44
|
puts "\t\tGreen:\n"
|
45
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[0]/scale, channel_extrema(Magick::GreenChannel)[0]/Magick::
|
46
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[1]/scale, channel_extrema(Magick::GreenChannel)[1]/Magick::
|
47
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[0]/scale, channel_mean(Magick::GreenChannel)[0]/Magick::
|
48
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[1]/scale, channel_mean(Magick::GreenChannel)[1]/Magick::
|
45
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[0]/scale, channel_extrema(Magick::GreenChannel)[0]/Magick::QuantumRange)
|
46
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GreenChannel)[1]/scale, channel_extrema(Magick::GreenChannel)[1]/Magick::QuantumRange)
|
47
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[0]/scale, channel_mean(Magick::GreenChannel)[0]/Magick::QuantumRange)
|
48
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GreenChannel)[1]/scale, channel_mean(Magick::GreenChannel)[1]/Magick::QuantumRange)
|
49
49
|
puts "\t\tBlue:\n"
|
50
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[0]/scale, channel_extrema(Magick::BlueChannel)[0]/Magick::
|
51
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[1]/scale, channel_extrema(Magick::BlueChannel)[1]/Magick::
|
52
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[0]/scale, channel_mean(Magick::BlueChannel)[0]/Magick::
|
53
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[1]/scale, channel_mean(Magick::BlueChannel)[1]/Magick::
|
50
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[0]/scale, channel_extrema(Magick::BlueChannel)[0]/Magick::QuantumRange)
|
51
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlueChannel)[1]/scale, channel_extrema(Magick::BlueChannel)[1]/Magick::QuantumRange)
|
52
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[0]/scale, channel_mean(Magick::BlueChannel)[0]/Magick::QuantumRange)
|
53
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlueChannel)[1]/scale, channel_mean(Magick::BlueChannel)[1]/Magick::QuantumRange)
|
54
54
|
when Magick::CMYKColorspace
|
55
55
|
puts "\t\tCyan:\n"
|
56
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[0]/scale, channel_extrema(Magick::CyanChannel)[0]/Magick::
|
57
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[1]/scale, channel_extrema(Magick::CyanChannel)[1]/Magick::
|
58
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[0]/scale, channel_mean(Magick::CyanChannel)[0]/Magick::
|
59
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[1]/scale, channel_mean(Magick::CyanChannel)[1]/Magick::
|
56
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[0]/scale, channel_extrema(Magick::CyanChannel)[0]/Magick::QuantumRange)
|
57
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::CyanChannel)[1]/scale, channel_extrema(Magick::CyanChannel)[1]/Magick::QuantumRange)
|
58
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[0]/scale, channel_mean(Magick::CyanChannel)[0]/Magick::QuantumRange)
|
59
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::CyanChannel)[1]/scale, channel_mean(Magick::CyanChannel)[1]/Magick::QuantumRange)
|
60
60
|
puts "\t\tMagenta:\n"
|
61
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[0]/scale, channel_extrema(Magick::MagentaChannel)[0]/Magick::
|
62
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[1]/scale, channel_extrema(Magick::MagentaChannel)[1]/Magick::
|
63
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[0]/scale, channel_mean(Magick::MagentaChannel)[0]/Magick::
|
64
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[1]/scale, channel_mean(Magick::MagentaChannel)[1]/Magick::
|
61
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[0]/scale, channel_extrema(Magick::MagentaChannel)[0]/Magick::QuantumRange)
|
62
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::MagentaChannel)[1]/scale, channel_extrema(Magick::MagentaChannel)[1]/Magick::QuantumRange)
|
63
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[0]/scale, channel_mean(Magick::MagentaChannel)[0]/Magick::QuantumRange)
|
64
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::MagentaChannel)[1]/scale, channel_mean(Magick::MagentaChannel)[1]/Magick::QuantumRange)
|
65
65
|
puts "\t\tYellow:\n"
|
66
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[0]/scale, channel_extrema(Magick::YellowChannel)[0]/Magick::
|
67
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[1]/scale, channel_extrema(Magick::YellowChannel)[1]/Magick::
|
68
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[0]/scale, channel_mean(Magick::YellowChannel)[0]/Magick::
|
69
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[1]/scale, channel_mean(Magick::YellowChannel)[1]/Magick::
|
66
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[0]/scale, channel_extrema(Magick::YellowChannel)[0]/Magick::QuantumRange)
|
67
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::YellowChannel)[1]/scale, channel_extrema(Magick::YellowChannel)[1]/Magick::QuantumRange)
|
68
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[0]/scale, channel_mean(Magick::YellowChannel)[0]/Magick::QuantumRange)
|
69
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::YellowChannel)[1]/scale, channel_mean(Magick::YellowChannel)[1]/Magick::QuantumRange)
|
70
70
|
puts "\t\tBlack:\n"
|
71
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[0]/scale, channel_extrema(Magick::BlackChannel)[0]/Magick::
|
72
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[1]/scale, channel_extrema(Magick::BlackChannel)[1]/Magick::
|
73
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[0]/scale, channel_mean(Magick::BlackChannel)[0]/Magick::
|
74
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[1]/scale, channel_mean(Magick::BlackChannel)[1]/Magick::
|
71
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[0]/scale, channel_extrema(Magick::BlackChannel)[0]/Magick::QuantumRange)
|
72
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::BlackChannel)[1]/scale, channel_extrema(Magick::BlackChannel)[1]/Magick::QuantumRange)
|
73
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[0]/scale, channel_mean(Magick::BlackChannel)[0]/Magick::QuantumRange)
|
74
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::BlackChannel)[1]/scale, channel_mean(Magick::BlackChannel)[1]/Magick::QuantumRange)
|
75
75
|
when Magick::GrayColorspace
|
76
76
|
puts "\t\tGray:\n"
|
77
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[0]/scale, channel_extrema(Magick::GrayChannel)[0]/Magick::
|
78
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[1]/scale, channel_extrema(Magick::GrayChannel)[1]/Magick::
|
79
|
-
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[0]/scale, channel_mean(Magick::GrayChannel)[0]/Magick::
|
80
|
-
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[1]/scale, channel_mean(Magick::GrayChannel)[1]/Magick::
|
77
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[0]/scale, channel_extrema(Magick::GrayChannel)[0]/Magick::QuantumRange)
|
78
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::GrayChannel)[1]/scale, channel_extrema(Magick::GrayChannel)[1]/Magick::QuantumRange)
|
79
|
+
puts "\t\t\tMean: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[0]/scale, channel_mean(Magick::GrayChannel)[0]/Magick::QuantumRange)
|
80
|
+
puts "\t\t\tStandard deviation: " + sprintf("%g (%g)\n", channel_mean(Magick::GrayChannel)[1]/scale, channel_mean(Magick::GrayChannel)[1]/Magick::QuantumRange)
|
81
81
|
end
|
82
82
|
if matte
|
83
83
|
puts "\t\tOpacity:\n"
|
84
|
-
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[0]/scale, channel_extrema(Magick::OpacityChannel)[0]/Magick::
|
85
|
-
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[1]/scale, channel_extrema(Magick::OpacityChannel)[1]/Magick::
|
86
|
-
puts "\t\t\tMean:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[0]/scale, channel_mean(Magick::OpacityChannel)[0]/Magick::
|
87
|
-
puts "\t\t\tStandard deviation:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[1]/scale, channel_mean(Magick::OpacityChannel)[1]/Magick::
|
84
|
+
puts "\t\t\tMin: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[0]/scale, channel_extrema(Magick::OpacityChannel)[0]/Magick::QuantumRange)
|
85
|
+
puts "\t\t\tMax: " + sprintf("%u (%g)\n", channel_extrema(Magick::OpacityChannel)[1]/scale, channel_extrema(Magick::OpacityChannel)[1]/Magick::QuantumRange)
|
86
|
+
puts "\t\t\tMean:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[0]/scale, channel_mean(Magick::OpacityChannel)[0]/Magick::QuantumRange)
|
87
|
+
puts "\t\t\tStandard deviation:" + sprintf("%u (%g)\n", channel_mean(Magick::OpacityChannel)[1]/scale, channel_mean(Magick::OpacityChannel)[1]/Magick::QuantumRange)
|
88
88
|
end
|
89
89
|
if class_type == Magick::DirectClass
|
90
90
|
puts "\tColors: #{total_colors}\n"
|
@@ -157,21 +157,21 @@ module Magick
|
|
157
157
|
exif_attrs.each do |attr|
|
158
158
|
puts "\t\t#{attr[0]}: #{attr[1]}\n"
|
159
159
|
end
|
160
|
-
end
|
160
|
+
end
|
161
161
|
end
|
162
162
|
puts "\tTainted: True\n" if changed?
|
163
163
|
puts "\tTainted: False\n" unless changed?
|
164
164
|
puts "\tVersion: #{Magick::Version}\n"
|
165
165
|
puts "\t #{Magick::Magick_version}\n"
|
166
|
-
end
|
166
|
+
end
|
167
167
|
end
|
168
168
|
end
|
169
169
|
|
170
170
|
if ARGV.length == 0
|
171
171
|
puts <<-'END_USAGE'
|
172
|
-
This example displays information about the specified image file(s)
|
173
|
-
that is similar to ImageMagick/GraphicsMagick's identify command.
|
174
|
-
|
172
|
+
This example displays information about the specified image file(s)
|
173
|
+
that is similar to ImageMagick/GraphicsMagick's identify command.
|
174
|
+
|
175
175
|
Usage:
|
176
176
|
ruby identify.rb filename [filename...]
|
177
177
|
END_USAGE
|
@@ -183,5 +183,5 @@ ilist.each do |img|
|
|
183
183
|
img.identify
|
184
184
|
end
|
185
185
|
|
186
|
-
exit
|
186
|
+
exit
|
187
187
|
|
data/examples/spinner.rb
CHANGED
@@ -22,18 +22,19 @@ frame = Magick::Image.new(DIM, DIM) {self.background_color = 'transparent'}
|
|
22
22
|
spinner = Magick::ImageList.new
|
23
23
|
|
24
24
|
# 'level' is the change from darkest gray to white
|
25
|
-
level = Magick::
|
25
|
+
level = Magick::QuantumRange / 2 / NFRAMES
|
26
26
|
|
27
27
|
NFRAMES.times do |x|
|
28
28
|
gc = Magick::Draw.new
|
29
29
|
gc.translate(DIM/2, DIM/2)
|
30
30
|
gc.stroke('none')
|
31
|
-
intensity = 0.58 * Magick::
|
31
|
+
intensity = 0.58 * Magick::QuantumRange
|
32
32
|
fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
|
33
33
|
gc.fill(fill_color)
|
34
34
|
angle = x * (360/NFRAMES)
|
35
35
|
NFRAMES.times do
|
36
36
|
gc.rotate(angle)
|
37
|
+
intensity = [intensity, Magick::QuantumRange].min
|
37
38
|
fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
|
38
39
|
gc.fill(fill_color)
|
39
40
|
gc.roundrectangle(7, -1, 15, 0, 1, 1)
|
data/ext/RMagick/MANIFEST
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
MANIFEST for RMagick-
|
1
|
+
MANIFEST for RMagick-2.0.0 - 09:19:16 12/27/07
|
2
2
|
|
3
3
|
doc/ilist.html
|
4
4
|
doc/scripts/stripeTables.js
|
@@ -101,6 +101,7 @@ doc/ex/motion_blur.rb
|
|
101
101
|
doc/ex/viewex.rb
|
102
102
|
doc/ex/line01.rb
|
103
103
|
doc/ex/swirl.rb
|
104
|
+
doc/ex/fill_pattern.rb
|
104
105
|
doc/ex/qbezierpath.rb
|
105
106
|
doc/ex/get_type_metrics.rb
|
106
107
|
doc/ex/border.rb
|
@@ -225,6 +226,7 @@ doc/ex/equalize.rb
|
|
225
226
|
doc/ex/map.rb
|
226
227
|
doc/ex/get_pixels.rb
|
227
228
|
doc/ex/polyline.rb
|
229
|
+
doc/ex/composite_layers.rb
|
228
230
|
doc/ex/text01.rb
|
229
231
|
doc/ex/crop.rb
|
230
232
|
doc/ex/quantize-m.rb
|
@@ -290,18 +292,18 @@ doc/magick.html
|
|
290
292
|
doc/rvgxform.html
|
291
293
|
doc/rvguse.html
|
292
294
|
doc/rvgstyle.html
|
295
|
+
ext/RMagick/extconf.rb
|
293
296
|
ext/RMagick/rminfo.c
|
294
297
|
ext/RMagick/rmmain.c
|
295
298
|
ext/RMagick/rmfill.c
|
296
299
|
ext/RMagick/rmimage.c
|
297
|
-
ext/RMagick/rmagick_config.h.in
|
298
300
|
ext/RMagick/rmdraw.c
|
299
301
|
ext/RMagick/rmilist.c
|
300
302
|
ext/RMagick/MANIFEST
|
301
303
|
ext/RMagick/rmutil.c
|
302
304
|
ext/RMagick/rmagick.h
|
303
|
-
ext/RMagick/extconf.rb.in
|
304
305
|
post-setup.rb
|
306
|
+
examples/crop_with_gravity.rb
|
305
307
|
examples/describe.rb
|
306
308
|
examples/thumbnail.rb
|
307
309
|
examples/find_similar_region.rb
|
@@ -331,15 +333,12 @@ lib/rvg/transformable.rb
|
|
331
333
|
lib/rvg/deep_equal.rb
|
332
334
|
lib/rvg/rvg.rb
|
333
335
|
lib/rvg/stretchable.rb
|
334
|
-
gem_extconf.rb
|
335
336
|
README-Mac-OSX.txt
|
336
337
|
post-clean.rb
|
337
|
-
metaconfig.in
|
338
338
|
post-install.rb
|
339
|
+
build_tarball.rake
|
339
340
|
ChangeLog
|
340
341
|
rmagick.gemspec
|
341
342
|
uninstall.rb
|
342
|
-
|
343
|
+
metaconfig
|
343
344
|
README.html
|
344
|
-
configure.ac
|
345
|
-
configure
|
@@ -0,0 +1,242 @@
|
|
1
|
+
require "mkmf"
|
2
|
+
require "date"
|
3
|
+
|
4
|
+
RMAGICK_VERS = "2.0.0"
|
5
|
+
MIN_RUBY_VERS = "1.8.2"
|
6
|
+
MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr(".","").to_i
|
7
|
+
MIN_IM_VERS = "6.3.0"
|
8
|
+
MIN_IM_VERS_NO = MIN_IM_VERS.tr(".","").to_i
|
9
|
+
|
10
|
+
SUMMARY = <<"END_SUMMARY"
|
11
|
+
|
12
|
+
|
13
|
+
#{"=" * 70}
|
14
|
+
#{DateTime.now.strftime("%a %d%b%y %T")}
|
15
|
+
This installation of RMagick #{RMAGICK_VERS} is configured
|
16
|
+
for Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{`Magick-config --version`.chomp}.
|
17
|
+
#{"=" * 70}
|
18
|
+
|
19
|
+
|
20
|
+
END_SUMMARY
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
# Test for a specific value in an enum type
|
26
|
+
def have_enum_value(enum, value, headers=nil, &b)
|
27
|
+
checking_for "#{enum}.#{value}" do
|
28
|
+
if try_compile(<<"SRC", &b)
|
29
|
+
#{COMMON_HEADERS}
|
30
|
+
#{cpp_include(headers)}
|
31
|
+
/*top*/
|
32
|
+
int main() { #{enum} t = #{value}; t = t; return 0; }
|
33
|
+
SRC
|
34
|
+
$defs.push(format("-DHAVE_ENUM_%s", value.upcase))
|
35
|
+
true
|
36
|
+
else
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
def have_new_rb_cvar_set(headers=nil, &b)
|
46
|
+
checking_for "rb_cvar_set with 3 arguments" do
|
47
|
+
if try_compile(<<"SRC", &b)
|
48
|
+
#{COMMON_HEADERS}
|
49
|
+
#{cpp_include(headers)}
|
50
|
+
/*top*/
|
51
|
+
int main() { rb_cvar_set(rb_cArray, rb_intern("x"), INT2FIX(0)); return 0; }
|
52
|
+
SRC
|
53
|
+
$defs.push("-DHAVE_NEW_RB_CVAR_SET")
|
54
|
+
true
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
|
64
|
+
# Test for multiple values of the same enum type
|
65
|
+
def have_enum_values(enum, values, headers=nil, &b)
|
66
|
+
values.each do |value|
|
67
|
+
have_enum_value(enum, value, headers, &b)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
def exit_failure(msg)
|
75
|
+
Logging::message msg
|
76
|
+
message msg+"\n"
|
77
|
+
exit(1)
|
78
|
+
end
|
79
|
+
|
80
|
+
|
81
|
+
|
82
|
+
|
83
|
+
unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
|
84
|
+
version = RUBY_VERSION.tr(".","").to_i
|
85
|
+
version >= MIN_RUBY_VERS_NO
|
86
|
+
end
|
87
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
|
88
|
+
end
|
89
|
+
|
90
|
+
|
91
|
+
# Check for Magick-config
|
92
|
+
unless find_executable("Magick-config")
|
93
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config in #{ENV['PATH']}\n"
|
94
|
+
end
|
95
|
+
|
96
|
+
|
97
|
+
# Ensure minimum ImageMagick version
|
98
|
+
unless checking_for("ImageMagick version >= #{MIN_IM_VERS}") do
|
99
|
+
version = `Magick-config --version`.chomp.tr(".","").to_i
|
100
|
+
version >= MIN_IM_VERS_NO
|
101
|
+
end
|
102
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{MIN_IM_VERS} or later.\n"
|
103
|
+
end
|
104
|
+
|
105
|
+
# Ensure ImageMagick is not configured for HDRI
|
106
|
+
unless checking_for("HDRI disabled version of ImageMagick") do
|
107
|
+
not (`Magick-config --version`["HDRI"])
|
108
|
+
end
|
109
|
+
exit_failure "\nCan't install RMagick #{RMAGICK_VERS}."+
|
110
|
+
"\nRMagick does not work when ImageMagick is configured for High Dynamic Range Images."+
|
111
|
+
"\nDon't use the --enable-hdri option when configuring ImageMagick.\n"
|
112
|
+
end
|
113
|
+
|
114
|
+
# Save flags
|
115
|
+
$CFLAGS = ENV["CFLAGS"].to_s + " " + `Magick-config --cflags`.chomp
|
116
|
+
$CPPFLAGS = `Magick-config --cppflags`.chomp
|
117
|
+
$LDFLAGS = `Magick-config --ldflags`.chomp
|
118
|
+
$LOCAL_LIBS = `Magick-config --libs`.chomp
|
119
|
+
|
120
|
+
#headers = %w{assert.h ctype.h errno.h float.h limits.h math.h stdarg.h stddef.h stdint.h stdio.h stdlib.h string.h time.h}
|
121
|
+
headers = %w{assert.h ctype.h stdint.h stdio.h stdlib.h math.h time.h}
|
122
|
+
headers << "sys/types.h" if have_header("sys/types.h")
|
123
|
+
|
124
|
+
|
125
|
+
unless have_header("magick/MagickCore.h")
|
126
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find MagickCore.h.\n"
|
127
|
+
else
|
128
|
+
headers << "magick/MagickCore.h"
|
129
|
+
end
|
130
|
+
|
131
|
+
unless have_library("Magick", "InitializeMagick", headers)
|
132
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. " +
|
133
|
+
"Can't find libMagick or one of the dependent libraries. " +
|
134
|
+
"Check the mkmf.log file for more detailed information.\n"
|
135
|
+
end
|
136
|
+
|
137
|
+
have_func("snprintf", headers)
|
138
|
+
|
139
|
+
|
140
|
+
["AcquireQuantumMemory", # 6.3.5-9
|
141
|
+
"ClutImageChannel", # 6.3.5-8
|
142
|
+
"CompositeLayers", # 6.3.3-?
|
143
|
+
"ConvertHSLToRGB", # 6.3.5-9
|
144
|
+
"ConvertRGBToHSL", # 6.3.5-9
|
145
|
+
"DistortImage", # 6.3.5
|
146
|
+
"EqualizeImageChannel", # 6.3.6-9
|
147
|
+
"ExcerptImage", # 6.3.5-8
|
148
|
+
"ExtentImage", # 6.3.1
|
149
|
+
"GetImageProperty", # 6.3.1
|
150
|
+
"GetNextImageProperty", # 6.3.1
|
151
|
+
"IsHistogramImage", # 6.3.5
|
152
|
+
"LinearStretchImage", # 6.3.1
|
153
|
+
"MagickCoreGenesis", # 6.3.4
|
154
|
+
"PolaroidImage", # 6.3.1-6
|
155
|
+
"RecolorImage", # 6.3.1-3
|
156
|
+
"ResetImagePage", # 6.3.3
|
157
|
+
"ResizeQuantumMemory", # 6.3.5-9
|
158
|
+
"SetImageAlphaChannel", # 6.3.6-9
|
159
|
+
"SetImageProperty", # 6.3.1
|
160
|
+
"SetImageRegistry", # 6.3.4-?
|
161
|
+
"SyncImageProfiles", # 6.3.2
|
162
|
+
].each do |func|
|
163
|
+
have_func(func, headers)
|
164
|
+
end
|
165
|
+
|
166
|
+
|
167
|
+
have_type("AlphaChannelType", headers) # 6.3.5
|
168
|
+
have_type("ImageLayerMethod", headers) # 6.3.6 replaces MagickLayerMethod
|
169
|
+
have_type("long double", headers)
|
170
|
+
have_type("unsigned long long", headers)
|
171
|
+
have_type("uint64_t", headers)
|
172
|
+
have_type("__int64", headers)
|
173
|
+
check_sizeof("Image *", headers)
|
174
|
+
|
175
|
+
|
176
|
+
have_enum_values("CompositeOperator", ["ChangeMaskCompositeOp", # 6.3.3
|
177
|
+
"LinearLightCompositeOp", # 6.3.5
|
178
|
+
"DivideCompositeOp"], headers) # 6.3.5
|
179
|
+
have_enum_values("DistortImageMethod", ["ArcDistortion", # 6.3.5-5
|
180
|
+
"PerspectiveProjectionDistortion"], headers) # 6.3.5-9
|
181
|
+
have_enum_values("FilterTypes", ["KaiserFilter", # 6.3.6
|
182
|
+
"SentinelFilter", # 6.3.6
|
183
|
+
"WelshFilter", # 6.3.6-4
|
184
|
+
"ParzenFilter", # 6.3.6-4
|
185
|
+
"LagrangeFilter", # 6.3.7-2
|
186
|
+
"BohmanFilter", # 6.3.7-2
|
187
|
+
"BartlettFilter"], headers) # 6.3.7-2
|
188
|
+
have_enum_value("InterpolatePixelMethod", "SplineInterpolatePixel", headers) # 6.3.5
|
189
|
+
have_enum_values("InterlaceType", ["GIFInterlace", # 6.3.4
|
190
|
+
"JPEGInterlace", # 6.3.4
|
191
|
+
"PNGInterlace"], headers) # 6.3.4
|
192
|
+
have_enum_values("MagickLayerMethod", ["OptimizeTransLayer", # 6.3.3-4
|
193
|
+
"RemoveDupsLayer", # 6.3.3-6
|
194
|
+
"RemoveZeroLayer", # 6.3.3-6
|
195
|
+
"CompositeLayer", # 6.3.3-6
|
196
|
+
"FlattenLayer", # 6.3.6-2
|
197
|
+
"MergeLayer", # 6.3.6
|
198
|
+
"MosaicLayer", # 6.3.6-2
|
199
|
+
"OptimizeImageLayer"], headers) # 6.3.3-?
|
200
|
+
have_enum_value("MetricType", "MeanErrorPerPixelMetric", headers) # 6.3.4-?
|
201
|
+
have_enum_value("NoiseType", "RandomNoise", headers) # 6.3.5-0
|
202
|
+
have_enum_values("VirtualPixelMethod", ["MaskVirtualPixelMethod", # 6.3.3
|
203
|
+
"BlackVirtualPixelMethod", # 6.3.5
|
204
|
+
"GrayVirtualPixelMethod", # 6.3.5
|
205
|
+
"WhiteVirtualPixelMethod"], headers) # 6.3.5
|
206
|
+
|
207
|
+
|
208
|
+
# Now test Ruby 1.9.0 features. intern.h depends on stdarg.h.
|
209
|
+
if have_header("stdarg.h")
|
210
|
+
$CPPFLAGS << " -DHAVE_STDARG_PROTOTYPES=1"
|
211
|
+
end
|
212
|
+
|
213
|
+
headers = ["ruby.h", "rubyio.h"]
|
214
|
+
|
215
|
+
if have_header("intern.h")
|
216
|
+
headers << "intern.h"
|
217
|
+
elsif have_header("ruby/intern.h")
|
218
|
+
headers << "ruby/intern.h"
|
219
|
+
else
|
220
|
+
exit_failure "Can't find intern.h"
|
221
|
+
end
|
222
|
+
have_func("rb_frame_this_func", headers)
|
223
|
+
have_new_rb_cvar_set(headers)
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
# Miscellaneous constants
|
228
|
+
$defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
|
229
|
+
$defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
|
230
|
+
|
231
|
+
create_header()
|
232
|
+
# Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the
|
233
|
+
# extconf.h header. Suppress that behavior by removing the symbol array.
|
234
|
+
$defs = []
|
235
|
+
|
236
|
+
# Force re-compilation if the generated Makefile changed.
|
237
|
+
$config_h = "Makefile rmagick.h"
|
238
|
+
|
239
|
+
create_makefile("RMagick2")
|
240
|
+
|
241
|
+
Logging::message SUMMARY
|
242
|
+
message SUMMARY
|