rmagick-windows 2.16.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.editorconfig +14 -0
- data/.gitignore +23 -0
- data/.hound.yml +2 -0
- data/.rspec +1 -0
- data/.rubocop.yml +340 -0
- data/.simplecov +27 -0
- data/.travis.yml +60 -0
- data/CHANGELOG.md +915 -0
- data/CODE_OF_CONDUCT.md +13 -0
- data/CONTRIBUTING.md +50 -0
- data/Doxyfile +1514 -0
- data/Gemfile +10 -0
- data/LICENSE +20 -0
- data/README.textile +257 -0
- data/Rakefile +188 -0
- data/before_install_linux.sh +32 -0
- data/before_install_osx.sh +2 -0
- data/deprecated/RMagick.rb +6 -0
- data/doc/.cvsignore +1 -0
- data/doc/comtasks.html +287 -0
- data/doc/constants.html +1581 -0
- data/doc/css/doc.css +299 -0
- data/doc/css/popup.css +34 -0
- data/doc/css/ref.css +67 -0
- data/doc/draw.html +3272 -0
- data/doc/ex/InitialCoords.rb +22 -0
- data/doc/ex/NewCoordSys.rb +30 -0
- data/doc/ex/OrigCoordSys.rb +16 -0
- data/doc/ex/PreserveAspectRatio.rb +204 -0
- data/doc/ex/RotateScale.rb +36 -0
- data/doc/ex/Skew.rb +38 -0
- data/doc/ex/Use01.rb +15 -0
- data/doc/ex/Use02.rb +20 -0
- data/doc/ex/Use03.rb +16 -0
- data/doc/ex/ViewBox.rb +31 -0
- data/doc/ex/adaptive_threshold.rb +9 -0
- data/doc/ex/add_noise.rb +16 -0
- data/doc/ex/affine.rb +48 -0
- data/doc/ex/affine_transform.rb +20 -0
- data/doc/ex/arc.rb +49 -0
- data/doc/ex/arcpath.rb +32 -0
- data/doc/ex/arcs01.rb +28 -0
- data/doc/ex/arcs02.rb +59 -0
- data/doc/ex/average.rb +15 -0
- data/doc/ex/axes.rb +64 -0
- data/doc/ex/baseline_shift01.rb +17 -0
- data/doc/ex/bilevel_channel.rb +8 -0
- data/doc/ex/blur_image.rb +12 -0
- data/doc/ex/border.rb +10 -0
- data/doc/ex/bounding_box.rb +42 -0
- data/doc/ex/cbezier1.rb +41 -0
- data/doc/ex/cbezier2.rb +41 -0
- data/doc/ex/cbezier3.rb +41 -0
- data/doc/ex/cbezier4.rb +42 -0
- data/doc/ex/cbezier5.rb +42 -0
- data/doc/ex/cbezier6.rb +53 -0
- data/doc/ex/channel.rb +25 -0
- data/doc/ex/charcoal.rb +12 -0
- data/doc/ex/chop.rb +29 -0
- data/doc/ex/circle.rb +33 -0
- data/doc/ex/circle01.rb +16 -0
- data/doc/ex/clip_path.rb +60 -0
- data/doc/ex/coalesce.rb +57 -0
- data/doc/ex/color_fill_to_border.rb +29 -0
- data/doc/ex/color_floodfill.rb +28 -0
- data/doc/ex/color_histogram.rb +47 -0
- data/doc/ex/color_reset.rb +11 -0
- data/doc/ex/colorize.rb +16 -0
- data/doc/ex/colors.rb +64 -0
- data/doc/ex/compose_mask.rb +22 -0
- data/doc/ex/composite.rb +133 -0
- data/doc/ex/composite_layers.rb +53 -0
- data/doc/ex/composite_tiled.rb +21 -0
- data/doc/ex/contrast.rb +36 -0
- data/doc/ex/crop.rb +31 -0
- data/doc/ex/crop_with_gravity.rb +42 -0
- data/doc/ex/cubic01.rb +43 -0
- data/doc/ex/cubic02.rb +91 -0
- data/doc/ex/cycle_colormap.rb +21 -0
- data/doc/ex/dissolve.rb +12 -0
- data/doc/ex/drawcomp.rb +42 -0
- data/doc/ex/drop_shadow.rb +60 -0
- data/doc/ex/edge.rb +11 -0
- data/doc/ex/ellipse.rb +45 -0
- data/doc/ex/ellipse01.rb +21 -0
- data/doc/ex/emboss.rb +11 -0
- data/doc/ex/enhance.rb +28 -0
- data/doc/ex/equalize.rb +11 -0
- data/doc/ex/evenodd.rb +42 -0
- data/doc/ex/fill_pattern.rb +23 -0
- data/doc/ex/flatten_images.rb +36 -0
- data/doc/ex/flip.rb +11 -0
- data/doc/ex/flop.rb +11 -0
- data/doc/ex/font_styles.rb +32 -0
- data/doc/ex/fonts.rb +20 -0
- data/doc/ex/frame.rb +12 -0
- data/doc/ex/gaussian_blur.rb +11 -0
- data/doc/ex/get_multiline_type_metrics.rb +41 -0
- data/doc/ex/get_pixels.rb +47 -0
- data/doc/ex/get_type_metrics.rb +141 -0
- data/doc/ex/gradientfill.rb +27 -0
- data/doc/ex/grav.rb +45 -0
- data/doc/ex/gravity.rb +80 -0
- data/doc/ex/group.rb +26 -0
- data/doc/ex/hatchfill.rb +27 -0
- data/doc/ex/image.rb +44 -0
- data/doc/ex/images/Apple.miff +0 -0
- data/doc/ex/images/Ballerina.jpg +0 -0
- data/doc/ex/images/Ballerina3.jpg +0 -0
- data/doc/ex/images/Button_0.gif +0 -0
- data/doc/ex/images/Button_1.gif +0 -0
- data/doc/ex/images/Button_2.gif +0 -0
- data/doc/ex/images/Button_3.gif +0 -0
- data/doc/ex/images/Button_4.gif +0 -0
- data/doc/ex/images/Button_5.gif +0 -0
- data/doc/ex/images/Button_6.gif +0 -0
- data/doc/ex/images/Button_7.gif +0 -0
- data/doc/ex/images/Button_8.gif +0 -0
- data/doc/ex/images/Button_9.gif +0 -0
- data/doc/ex/images/Button_A.gif +0 -0
- data/doc/ex/images/Button_B.gif +0 -0
- data/doc/ex/images/Button_C.gif +0 -0
- data/doc/ex/images/Button_D.gif +0 -0
- data/doc/ex/images/Button_E.gif +0 -0
- data/doc/ex/images/Button_F.gif +0 -0
- data/doc/ex/images/Button_G.gif +0 -0
- data/doc/ex/images/Button_H.gif +0 -0
- data/doc/ex/images/Button_I.gif +0 -0
- data/doc/ex/images/Button_J.gif +0 -0
- data/doc/ex/images/Button_K.gif +0 -0
- data/doc/ex/images/Button_L.gif +0 -0
- data/doc/ex/images/Button_M.gif +0 -0
- data/doc/ex/images/Button_N.gif +0 -0
- data/doc/ex/images/Button_O.gif +0 -0
- data/doc/ex/images/Button_P.gif +0 -0
- data/doc/ex/images/Button_Q.gif +0 -0
- data/doc/ex/images/Button_R.gif +0 -0
- data/doc/ex/images/Button_S.gif +0 -0
- data/doc/ex/images/Button_T.gif +0 -0
- data/doc/ex/images/Button_U.gif +0 -0
- data/doc/ex/images/Button_V.gif +0 -0
- data/doc/ex/images/Button_W.gif +0 -0
- data/doc/ex/images/Button_X.gif +0 -0
- data/doc/ex/images/Button_Y.gif +0 -0
- data/doc/ex/images/Button_Z.gif +0 -0
- data/doc/ex/images/Cheetah.jpg +0 -0
- data/doc/ex/images/Coffee.wmf +0 -0
- data/doc/ex/images/Flower_Hat.jpg +0 -0
- data/doc/ex/images/Gold_Statue.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons.jpg +0 -0
- data/doc/ex/images/Hot_Air_Balloons_H.jpg +0 -0
- data/doc/ex/images/Leaf.miff +0 -0
- data/doc/ex/images/No.wmf +0 -0
- data/doc/ex/images/Polynesia.jpg +0 -0
- data/doc/ex/images/Red_Rocks.jpg +0 -0
- data/doc/ex/images/Rocks_On_Beach.miff +0 -0
- data/doc/ex/images/Shorts.jpg +0 -0
- data/doc/ex/images/Snake.wmf +0 -0
- data/doc/ex/images/Violin.jpg +0 -0
- data/doc/ex/images/Yellow_Rose.miff +0 -0
- data/doc/ex/images/big-duck.gif +0 -0
- data/doc/ex/images/duck.gif +0 -0
- data/doc/ex/images/duck0.gif +0 -0
- data/doc/ex/images/duck1.gif +0 -0
- data/doc/ex/images/duck10.gif +0 -0
- data/doc/ex/images/duck11.gif +0 -0
- data/doc/ex/images/duck12.gif +0 -0
- data/doc/ex/images/duck13.gif +0 -0
- data/doc/ex/images/duck14.gif +0 -0
- data/doc/ex/images/duck15.gif +0 -0
- data/doc/ex/images/duck2.gif +0 -0
- data/doc/ex/images/duck3.gif +0 -0
- data/doc/ex/images/duck4.gif +0 -0
- data/doc/ex/images/duck5.gif +0 -0
- data/doc/ex/images/duck6.gif +0 -0
- data/doc/ex/images/duck7.gif +0 -0
- data/doc/ex/images/duck8.gif +0 -0
- data/doc/ex/images/duck9.gif +0 -0
- data/doc/ex/images/graydient230x6.gif +0 -0
- data/doc/ex/images/image_with_profile.jpg +0 -0
- data/doc/ex/images/logo400x83.gif +0 -0
- data/doc/ex/images/model.miff +0 -0
- data/doc/ex/images/notimplemented.gif +0 -0
- data/doc/ex/images/smile.miff +0 -0
- data/doc/ex/images/spin.gif +0 -0
- data/doc/ex/implode.rb +34 -0
- data/doc/ex/level.rb +11 -0
- data/doc/ex/level_colors.rb +11 -0
- data/doc/ex/line.rb +41 -0
- data/doc/ex/line01.rb +21 -0
- data/doc/ex/mask.rb +35 -0
- data/doc/ex/matte_fill_to_border.rb +39 -0
- data/doc/ex/matte_floodfill.rb +32 -0
- data/doc/ex/matte_replace.rb +39 -0
- data/doc/ex/median_filter.rb +28 -0
- data/doc/ex/modulate.rb +11 -0
- data/doc/ex/mono.rb +23 -0
- data/doc/ex/morph.rb +25 -0
- data/doc/ex/mosaic.rb +35 -0
- data/doc/ex/motion_blur.rb +11 -0
- data/doc/ex/negate.rb +11 -0
- data/doc/ex/negate_channel.rb +9 -0
- data/doc/ex/nested_rvg.rb +21 -0
- data/doc/ex/nonzero.rb +42 -0
- data/doc/ex/normalize.rb +11 -0
- data/doc/ex/oil_paint.rb +11 -0
- data/doc/ex/opacity.rb +37 -0
- data/doc/ex/ordered_dither.rb +11 -0
- data/doc/ex/path.rb +63 -0
- data/doc/ex/pattern1.rb +25 -0
- data/doc/ex/pattern2.rb +26 -0
- data/doc/ex/polaroid.rb +27 -0
- data/doc/ex/polygon.rb +23 -0
- data/doc/ex/polygon01.rb +21 -0
- data/doc/ex/polyline.rb +22 -0
- data/doc/ex/polyline01.rb +21 -0
- data/doc/ex/posterize.rb +8 -0
- data/doc/ex/preview.rb +8 -0
- data/doc/ex/qbezierpath.rb +52 -0
- data/doc/ex/quad01.rb +34 -0
- data/doc/ex/quantize-m.rb +25 -0
- data/doc/ex/radial_blur.rb +9 -0
- data/doc/ex/raise.rb +8 -0
- data/doc/ex/random_threshold_channel.rb +13 -0
- data/doc/ex/rect01.rb +14 -0
- data/doc/ex/rect02.rb +20 -0
- data/doc/ex/rectangle.rb +34 -0
- data/doc/ex/reduce_noise.rb +28 -0
- data/doc/ex/remap.rb +11 -0
- data/doc/ex/remap_images.rb +19 -0
- data/doc/ex/resize_to_fill.rb +8 -0
- data/doc/ex/resize_to_fit.rb +8 -0
- data/doc/ex/roll.rb +9 -0
- data/doc/ex/rotate.rb +44 -0
- data/doc/ex/rotate_f.rb +14 -0
- data/doc/ex/roundrect.rb +33 -0
- data/doc/ex/rubyname.rb +30 -0
- data/doc/ex/rvg_clippath.rb +12 -0
- data/doc/ex/rvg_linecap.rb +42 -0
- data/doc/ex/rvg_linejoin.rb +40 -0
- data/doc/ex/rvg_opacity.rb +18 -0
- data/doc/ex/rvg_pattern.rb +26 -0
- data/doc/ex/rvg_stroke_dasharray.rb +11 -0
- data/doc/ex/segment.rb +11 -0
- data/doc/ex/sepiatone.rb +7 -0
- data/doc/ex/shade.rb +11 -0
- data/doc/ex/shadow.rb +30 -0
- data/doc/ex/shave.rb +15 -0
- data/doc/ex/shear.rb +10 -0
- data/doc/ex/sketch.rb +17 -0
- data/doc/ex/skewx.rb +51 -0
- data/doc/ex/skewy.rb +47 -0
- data/doc/ex/smile.rb +125 -0
- data/doc/ex/solarize.rb +11 -0
- data/doc/ex/sparse_color.rb +54 -0
- data/doc/ex/splice.rb +8 -0
- data/doc/ex/spread.rb +11 -0
- data/doc/ex/stegano.rb +55 -0
- data/doc/ex/stroke_dasharray.rb +42 -0
- data/doc/ex/stroke_fill.rb +10 -0
- data/doc/ex/stroke_linecap.rb +44 -0
- data/doc/ex/stroke_linejoin.rb +48 -0
- data/doc/ex/stroke_width.rb +49 -0
- data/doc/ex/swirl.rb +17 -0
- data/doc/ex/text.rb +37 -0
- data/doc/ex/text01.rb +16 -0
- data/doc/ex/text_align.rb +36 -0
- data/doc/ex/text_antialias.rb +37 -0
- data/doc/ex/text_styles.rb +19 -0
- data/doc/ex/text_undercolor.rb +28 -0
- data/doc/ex/texture_fill_to_border.rb +34 -0
- data/doc/ex/texture_floodfill.rb +32 -0
- data/doc/ex/texturefill.rb +24 -0
- data/doc/ex/threshold.rb +13 -0
- data/doc/ex/to_blob.rb +13 -0
- data/doc/ex/translate.rb +39 -0
- data/doc/ex/transparent.rb +38 -0
- data/doc/ex/transpose.rb +9 -0
- data/doc/ex/transverse.rb +9 -0
- data/doc/ex/tref01.rb +24 -0
- data/doc/ex/triangle01.rb +15 -0
- data/doc/ex/trim.rb +23 -0
- data/doc/ex/tspan01.rb +17 -0
- data/doc/ex/tspan02.rb +17 -0
- data/doc/ex/tspan03.rb +19 -0
- data/doc/ex/unsharp_mask.rb +28 -0
- data/doc/ex/viewex.rb +33 -0
- data/doc/ex/vignette.rb +12 -0
- data/doc/ex/watermark.rb +27 -0
- data/doc/ex/wave.rb +9 -0
- data/doc/ex/wet_floor.rb +58 -0
- data/doc/ex/writing_mode01.rb +26 -0
- data/doc/ex/writing_mode02.rb +26 -0
- data/doc/ilist.html +2056 -0
- data/doc/image1.html +4680 -0
- data/doc/image2.html +3665 -0
- data/doc/image3.html +4522 -0
- data/doc/imageattrs.html +1638 -0
- data/doc/imusage.html +514 -0
- data/doc/index.html +416 -0
- data/doc/info.html +1499 -0
- data/doc/magick.html +565 -0
- data/doc/optequiv.html +2435 -0
- data/doc/rvg.html +975 -0
- data/doc/rvgclip.html +248 -0
- data/doc/rvggroup.html +305 -0
- data/doc/rvgimage.html +289 -0
- data/doc/rvgpattern.html +475 -0
- data/doc/rvgshape.html +406 -0
- data/doc/rvgstyle.html +270 -0
- data/doc/rvgtext.html +465 -0
- data/doc/rvgtspan.html +238 -0
- data/doc/rvgtut.html +530 -0
- data/doc/rvguse.html +145 -0
- data/doc/rvgxform.html +294 -0
- data/doc/scripts/doc.js +22 -0
- data/doc/scripts/stripeTables.js +23 -0
- data/doc/struct.html +1339 -0
- data/doc/usage.html +1621 -0
- data/examples/constitute.rb +7 -0
- data/examples/crop_with_gravity.rb +42 -0
- data/examples/demo.rb +324 -0
- data/examples/describe.rb +43 -0
- data/examples/find_similar_region.rb +34 -0
- data/examples/histogram.rb +321 -0
- data/examples/identify.rb +185 -0
- data/examples/image_opacity.rb +29 -0
- data/examples/import_export.rb +31 -0
- data/examples/pattern_fill.rb +38 -0
- data/examples/rotating_text.rb +44 -0
- data/examples/spinner.rb +49 -0
- data/examples/thumbnail.rb +64 -0
- data/examples/vignette.rb +78 -0
- data/ext/RMagick/extconf.rb +548 -0
- data/ext/RMagick/rmagick.c +401 -0
- data/ext/RMagick/rmagick.h +1287 -0
- data/ext/RMagick/rmdraw.c +2022 -0
- data/ext/RMagick/rmenum.c +1235 -0
- data/ext/RMagick/rmfill.c +720 -0
- data/ext/RMagick/rmilist.c +1270 -0
- data/ext/RMagick/rmimage.c +15427 -0
- data/ext/RMagick/rminfo.c +2590 -0
- data/ext/RMagick/rmmain.c +1741 -0
- data/ext/RMagick/rmmontage.c +519 -0
- data/ext/RMagick/rmpixel.c +1114 -0
- data/ext/RMagick/rmstruct.c +1124 -0
- data/ext/RMagick/rmutil.c +1754 -0
- data/lib/rmagick.rb +1 -0
- data/lib/rmagick/version.rb +6 -0
- data/lib/rmagick_internal.rb +1947 -0
- data/lib/rvg/clippath.rb +45 -0
- data/lib/rvg/container.rb +122 -0
- data/lib/rvg/deep_equal.rb +52 -0
- data/lib/rvg/describable.rb +47 -0
- data/lib/rvg/embellishable.rb +391 -0
- data/lib/rvg/misc.rb +723 -0
- data/lib/rvg/paint.rb +50 -0
- data/lib/rvg/pathdata.rb +126 -0
- data/lib/rvg/rvg.rb +283 -0
- data/lib/rvg/stretchable.rb +165 -0
- data/lib/rvg/stylable.rb +116 -0
- data/lib/rvg/text.rb +172 -0
- data/lib/rvg/transformable.rb +126 -0
- data/lib/rvg/units.rb +63 -0
- data/rmagick.gemspec +46 -0
- data/spec/rmagick/ImageList1_spec.rb +24 -0
- data/spec/rmagick/draw_spec.rb +156 -0
- data/spec/rmagick/image/blue_shift_spec.rb +16 -0
- data/spec/rmagick/image/composite_spec.rb +140 -0
- data/spec/rmagick/image/constitute_spec.rb +15 -0
- data/spec/rmagick/image/dispatch_spec.rb +18 -0
- data/spec/rmagick/image/from_blob_spec.rb +14 -0
- data/spec/rmagick/image/ping_spec.rb +14 -0
- data/spec/rmagick/image/properties_spec.rb +29 -0
- data/spec/spec_helper.rb +4 -0
- data/test/Image1.rb +565 -0
- data/test/Image2.rb +1304 -0
- data/test/Image3.rb +1030 -0
- data/test/ImageList1.rb +806 -0
- data/test/ImageList2.rb +385 -0
- data/test/Image_attributes.rb +697 -0
- data/test/Import_Export.rb +121 -0
- data/test/Info.rb +345 -0
- data/test/Magick.rb +321 -0
- data/test/Pixel.rb +116 -0
- data/test/Preview.rb +57 -0
- data/test/cmyk.icm +0 -0
- data/test/srgb.icm +0 -0
- data/test/test_all_basic.rb +38 -0
- data/test/tmpnam_test.rb +50 -0
- data/wercker.yml +10 -0
- metadata +509 -0
@@ -0,0 +1,29 @@
|
|
1
|
+
|
2
|
+
# Ccreate a semi-transparent title for an image.
|
3
|
+
|
4
|
+
require 'rmagick'
|
5
|
+
include Magick
|
6
|
+
|
7
|
+
puts <<END_INFO
|
8
|
+
|
9
|
+
This example uses a semi-transparent background color to create a title.
|
10
|
+
View the resulting image by entering the command: display image_opacity.miff
|
11
|
+
|
12
|
+
END_INFO
|
13
|
+
|
14
|
+
balloons = Image.read('../doc/ex/images/Hot_Air_Balloons_H.jpg').first
|
15
|
+
legend = Image.new(160, 50) { self.background_color = '#ffffffc0' }
|
16
|
+
|
17
|
+
gc = Draw.new
|
18
|
+
gc.annotate(legend, 0, 0, 0, 0, 'Balloon Day!\\nFri May 2 2003') do
|
19
|
+
self.gravity = CenterGravity
|
20
|
+
self.stroke = 'transparent'
|
21
|
+
self.fill = 'white'
|
22
|
+
self.pointsize = 18
|
23
|
+
end
|
24
|
+
|
25
|
+
result = balloons.composite(legend, SouthGravity, OverCompositeOp)
|
26
|
+
|
27
|
+
puts '...Writing image_opacity.miff'
|
28
|
+
result.write 'image_opacity.miff'
|
29
|
+
exit
|
@@ -0,0 +1,31 @@
|
|
1
|
+
#
|
2
|
+
# Demonstrate the export_pixels and import_pixels methods.
|
3
|
+
#
|
4
|
+
|
5
|
+
require 'rmagick'
|
6
|
+
include Magick
|
7
|
+
|
8
|
+
puts <<END_INFO
|
9
|
+
|
10
|
+
This example demonstrates the export_pixels and import_pixels methods
|
11
|
+
by copying an image one row at a time. The result is an copy that
|
12
|
+
is identical to the original.
|
13
|
+
|
14
|
+
END_INFO
|
15
|
+
|
16
|
+
img = Image.read('../doc/ex/images/Gold_Statue.jpg').first
|
17
|
+
copy = Image.new(img.columns, img.rows)
|
18
|
+
|
19
|
+
begin
|
20
|
+
img.rows.times do |r|
|
21
|
+
scanline = img.export_pixels(0, r, img.columns, 1, 'RGB')
|
22
|
+
copy.import_pixels(0, r, img.columns, 1, 'RGB', scanline)
|
23
|
+
end
|
24
|
+
rescue NotImplementedError
|
25
|
+
$stderr.puts 'The export_pixels and import_pixels methods are not supported' \
|
26
|
+
' by this version of ImageMagick/GraphicsMagick'
|
27
|
+
exit
|
28
|
+
end
|
29
|
+
|
30
|
+
copy.write('copy.gif')
|
31
|
+
exit
|
@@ -0,0 +1,38 @@
|
|
1
|
+
|
2
|
+
# Demonstrate ImageMagick's new (5.5.7-3 and later) built-in patterns.
|
3
|
+
# Create a Fill class that can be reused to fill in new Image backgrounds.
|
4
|
+
|
5
|
+
# Usage: pattern_fill.rb <name-of-pattern>
|
6
|
+
# Try 'checkerboard' or 'verticalsaw'
|
7
|
+
|
8
|
+
require 'rmagick'
|
9
|
+
include Magick
|
10
|
+
|
11
|
+
puts <<END_INFO
|
12
|
+
|
13
|
+
This example demonstrates the PATTERN: image format, which is
|
14
|
+
new in ImageMagick 5.5.7. Specify the name of any of the
|
15
|
+
supported patterns as an argument. For example, try "checkerboard".
|
16
|
+
|
17
|
+
END_INFO
|
18
|
+
|
19
|
+
class PatternFill < Magick::TextureFill
|
20
|
+
def initialize(name='bricks')
|
21
|
+
@pat_img = Magick::Image.read("pattern:#{name}").first
|
22
|
+
super(@pat_img)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
if ARGV[0]
|
27
|
+
pattern = ARGV[0]
|
28
|
+
else
|
29
|
+
$stderr.puts 'Defaulting to checkerboard pattern.'
|
30
|
+
pattern = 'checkerboard'
|
31
|
+
end
|
32
|
+
|
33
|
+
# Create a sample image that is 100x bigger than the pattern.
|
34
|
+
attrs = Image.ping("pattern:#{pattern}").first
|
35
|
+
|
36
|
+
tryit = Image.new(10*attrs.columns, 10*attrs.rows, PatternFill.new(pattern))
|
37
|
+
tryit.write('pattern_fill.gif')
|
38
|
+
exit
|
@@ -0,0 +1,44 @@
|
|
1
|
+
# Demonstrate the Draw#rotation= method by producing
|
2
|
+
# an animated MIFF file showing a rotating text string.
|
3
|
+
|
4
|
+
require 'rmagick'
|
5
|
+
include Magick
|
6
|
+
|
7
|
+
puts <<END_INFO
|
8
|
+
Demonstrate the rotation= attribute in the Draw class
|
9
|
+
by producing an animated image. View the output image
|
10
|
+
by entering the command: animate rotating_text.miff
|
11
|
+
END_INFO
|
12
|
+
|
13
|
+
text = Draw.new
|
14
|
+
text.pointsize = 28
|
15
|
+
text.font_weight = BoldWeight
|
16
|
+
text.font_style = ItalicStyle
|
17
|
+
text.gravity = CenterGravity
|
18
|
+
|
19
|
+
# Let's make it interesting. Composite the
|
20
|
+
# rotated text over a gradient fill background.
|
21
|
+
fill = GradientFill.new(100,100,100,100,'yellow','red')
|
22
|
+
bg = Image.new(200, 200, fill)
|
23
|
+
|
24
|
+
# The "none" color is transparent.
|
25
|
+
fg = Image.new(bg.columns, bg.rows) { self.background_color = 'none' }
|
26
|
+
|
27
|
+
# Here's where we'll collect the individual frames.
|
28
|
+
animation = ImageList.new
|
29
|
+
|
30
|
+
0.step(345,15) do |degrees|
|
31
|
+
frame = fg.copy
|
32
|
+
text.annotate(frame, 0,0,0,0, 'Rotating Text') do
|
33
|
+
self.rotation = degrees
|
34
|
+
end
|
35
|
+
# Composite the text over the gradient filled background frame.
|
36
|
+
animation << bg.composite(frame, CenterGravity, DisplaceCompositeOp)
|
37
|
+
end
|
38
|
+
|
39
|
+
animation.delay = 8
|
40
|
+
|
41
|
+
#animation.animate
|
42
|
+
puts '...Writing rotating_text.gif'
|
43
|
+
animation.write('rotating_text.gif')
|
44
|
+
exit
|
data/examples/spinner.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
# Make a 32x32 animated GIF that resembles the OS X animation.
|
2
|
+
# This produces a very small (~2.6Kb) GIF file.
|
3
|
+
|
4
|
+
require 'rmagick'
|
5
|
+
|
6
|
+
puts <<END_INFO
|
7
|
+
This example creates an animated GIF that resembles the OS X "waiting" icon.
|
8
|
+
You can view the GIF with the command
|
9
|
+
|
10
|
+
animate spinner.gif
|
11
|
+
END_INFO
|
12
|
+
|
13
|
+
NFRAMES = 12 # number of frames in the animation
|
14
|
+
DIM = 32 # width & height of image in pixels
|
15
|
+
DELAY = 100.0 / (NFRAMES/2) # 2 rotations per second
|
16
|
+
|
17
|
+
# 'frame' is a single frame in the animation.
|
18
|
+
frame = Magick::Image.new(DIM, DIM) {self.background_color = 'transparent'}
|
19
|
+
|
20
|
+
# 'spinner' will contain the frames that make up the animated GIF
|
21
|
+
spinner = Magick::ImageList.new
|
22
|
+
|
23
|
+
# 'level' is the change from darkest gray to white
|
24
|
+
level = Magick::QuantumRange / 2 / NFRAMES
|
25
|
+
|
26
|
+
NFRAMES.times do |x|
|
27
|
+
gc = Magick::Draw.new
|
28
|
+
gc.translate(DIM/2, DIM/2)
|
29
|
+
gc.stroke('none')
|
30
|
+
intensity = 0.58 * Magick::QuantumRange
|
31
|
+
fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
|
32
|
+
gc.fill(fill_color)
|
33
|
+
angle = x * (360/NFRAMES)
|
34
|
+
NFRAMES.times do
|
35
|
+
gc.rotate(angle)
|
36
|
+
intensity = [intensity, Magick::QuantumRange].min
|
37
|
+
fill_color = Magick::Pixel.new(intensity, intensity, intensity).to_color
|
38
|
+
gc.fill(fill_color)
|
39
|
+
gc.roundrectangle(7, -1, 15, 0, 1, 1)
|
40
|
+
angle = -(360/NFRAMES)
|
41
|
+
intensity += level
|
42
|
+
end
|
43
|
+
spinner << frame.copy
|
44
|
+
gc.draw(spinner)
|
45
|
+
end
|
46
|
+
|
47
|
+
spinner.delay = DELAY
|
48
|
+
spinner.compression = Magick::LZWCompression
|
49
|
+
spinner.write('spinner.gif')
|
@@ -0,0 +1,64 @@
|
|
1
|
+
require 'rmagick'
|
2
|
+
include Magick
|
3
|
+
|
4
|
+
puts <<END_INFO
|
5
|
+
|
6
|
+
This example demonstrates how to make a thumbnail of an image.
|
7
|
+
An image is resized to the target size (retaining its original
|
8
|
+
aspect ratio, of course) and then "mounted" on a square background
|
9
|
+
with raised edges.
|
10
|
+
|
11
|
+
Usage:
|
12
|
+
|
13
|
+
ruby thumbnail.rb <filename <size>>
|
14
|
+
|
15
|
+
where `filename' is the name of an image file and `size' is the
|
16
|
+
size of the thumbnail in pixels. The default size is 120 pixels.
|
17
|
+
If you don't specify any arguments this script uses a default
|
18
|
+
image.
|
19
|
+
|
20
|
+
END_INFO
|
21
|
+
|
22
|
+
DEFAULT_SIZE = 120
|
23
|
+
|
24
|
+
case ARGV.length
|
25
|
+
when 2
|
26
|
+
size = ARGV[1].to_i
|
27
|
+
image = ARGV[0]
|
28
|
+
when 1
|
29
|
+
image = ARGV[0]
|
30
|
+
size = DEFAULT_SIZE
|
31
|
+
else
|
32
|
+
size = DEFAULT_SIZE
|
33
|
+
image = '../doc/ex/images/Flower_Hat.jpg'
|
34
|
+
end
|
35
|
+
|
36
|
+
geom = "#{size}x#{size}"
|
37
|
+
|
38
|
+
# Read the image and resize it. The `change_geometry' method
|
39
|
+
# computes the new image geometry and yields to a block. The
|
40
|
+
# return value of the block is the return value of the method.
|
41
|
+
|
42
|
+
img = Image.read(image)[0]
|
43
|
+
img.change_geometry!(geom) { |cols, rows| img.thumbnail! cols, rows }
|
44
|
+
|
45
|
+
# We need a background to display the thumbnail.
|
46
|
+
# Create a square, neutral gray background with raised edges.
|
47
|
+
# Make this background slightly larger than the image to allow
|
48
|
+
# for the raised border. A 3-pixel raised edge means that the
|
49
|
+
# background needs to be 6 pixels larger in each dimension.
|
50
|
+
|
51
|
+
bg = Image.new(size+6, size+6) { self.background_color = 'gray75' }
|
52
|
+
bg = bg.raise(3,3)
|
53
|
+
|
54
|
+
# Just for the purposes of this example, display the thumbnail background on
|
55
|
+
# a larger white background.
|
56
|
+
|
57
|
+
white_bg = Image.new(size+50, size+50) {self.background_color = 'white'}
|
58
|
+
white_bg = white_bg.composite(bg, CenterGravity, OverCompositeOp)
|
59
|
+
|
60
|
+
# Finally, center the thumbnail on the gray background.
|
61
|
+
thumbnail = white_bg.composite(img, CenterGravity, OverCompositeOp)
|
62
|
+
|
63
|
+
thumbnail.write('thumbnail.gif')
|
64
|
+
exit
|
@@ -0,0 +1,78 @@
|
|
1
|
+
require 'rmagick'
|
2
|
+
include Magick
|
3
|
+
|
4
|
+
puts <<END_INFO
|
5
|
+
|
6
|
+
vi-gnette (n.) vin-'yet
|
7
|
+
A picture that shades off gradually into the surrounding paper.
|
8
|
+
Merriam-Webster Dictionary
|
9
|
+
|
10
|
+
Vignettes are frequently used in formal portraiture and advertising
|
11
|
+
images. This example creates a vignette from a picture of a ballerina.
|
12
|
+
It takes a few seconds to run. Be patient.
|
13
|
+
|
14
|
+
END_INFO
|
15
|
+
|
16
|
+
ballerina = Image.read('../doc/ex/images/Ballerina3.jpg')[0]
|
17
|
+
|
18
|
+
# Note: this technique won't work with every image. To make a pretty
|
19
|
+
# vignette you need an image with a uniform, fairly dark background.
|
20
|
+
|
21
|
+
# Start by drawing a white oval on a black background. (Although you don't
|
22
|
+
# have to use an oval at all! Any shape will work. Try a rounded rectangle.)
|
23
|
+
# The black pixels correspond to pixels in the image that will become
|
24
|
+
# transparent. The white pixels correspond to pixels in the image that will
|
25
|
+
# remain unchanged. Gray pixels, introduced by the blurring below, will
|
26
|
+
# become more or less transparent depending on how dark or light the pixel is.
|
27
|
+
|
28
|
+
# The size of the oval is arbitrary - in this case it's 90% of the
|
29
|
+
# size of the image.
|
30
|
+
|
31
|
+
oval = Image.new(ballerina.columns, ballerina.rows) {self.background_color = 'black'}
|
32
|
+
gc = Draw.new
|
33
|
+
gc.stroke('white')
|
34
|
+
gc.fill('white')
|
35
|
+
gc.ellipse(ballerina.columns/2, ballerina.rows/2,
|
36
|
+
ballerina.columns/2-(ballerina.columns*0.10),
|
37
|
+
ballerina.rows/2-(ballerina.rows*0.10), 0, 360)
|
38
|
+
gc.draw(oval)
|
39
|
+
|
40
|
+
# Add a lot of blurring to the oval. I use blur_image because it's much faster
|
41
|
+
# than the gaussian_blur method and produces no observable difference. The
|
42
|
+
# exact amount of blurring is a judgment call. The higher the 2nd argument, the
|
43
|
+
# more blurring, although increasing the value above 20 doesn't seem to add any
|
44
|
+
# additional blurriness.
|
45
|
+
|
46
|
+
oval = oval.blur_image(0, 20)
|
47
|
+
|
48
|
+
# The CopyOpacityCompositeOp transforms the opacity level of each image pixel
|
49
|
+
# according to the intensity of the composite image pixels. In this case, the
|
50
|
+
# black pixels outside the oval become transparent and the white pixels inside
|
51
|
+
# the oval remain opaque. Each gray pixel around the border of the oval has a
|
52
|
+
# varying level of transparency depending on how dark or light it is.
|
53
|
+
|
54
|
+
ballerina.matte = true # Ensure the ballerina image's opacity channel is enabled.
|
55
|
+
oval.matte = false # Force the CopyOpacityCompositeOp to use pixel intensity
|
56
|
+
# to determine how much transparency to add to the ballerina
|
57
|
+
# pixels.
|
58
|
+
|
59
|
+
ballerina = ballerina.composite(oval, CenterGravity, CopyOpacityCompositeOp)
|
60
|
+
|
61
|
+
# Since the vignette has multiple levels of transparency, we can't
|
62
|
+
# save it as a GIF or a JPEG. The PNG format can handle it, though.
|
63
|
+
|
64
|
+
begin
|
65
|
+
ballerina.write('vignette.png')
|
66
|
+
rescue ImageMagickError
|
67
|
+
puts 'Write failed. No PNG support?'
|
68
|
+
# In case PNG support isn't installed, just ignore the exception.
|
69
|
+
end
|
70
|
+
|
71
|
+
# At this point the vignette is complete. However, the `display' method only
|
72
|
+
# supports 1`level of transparency. Therefore, composite the vignette over a
|
73
|
+
# standard "checkerboard" background. The resulting image will be 100% opaque.
|
74
|
+
|
75
|
+
checkerboard = Image.read('pattern:checkerboard') {self.size = "#{ballerina.columns}x#{ballerina.rows}"}
|
76
|
+
vignette = checkerboard[0].composite(ballerina, CenterGravity, OverCompositeOp)
|
77
|
+
vignette.display
|
78
|
+
exit
|
@@ -0,0 +1,548 @@
|
|
1
|
+
lib_dir = File.expand_path('../../lib', File.dirname(__FILE__))
|
2
|
+
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
3
|
+
require 'rubygems'
|
4
|
+
require 'mkmf'
|
5
|
+
require 'date'
|
6
|
+
|
7
|
+
module RMagick
|
8
|
+
class Extconf
|
9
|
+
require 'rmagick/version'
|
10
|
+
RMAGICK_VERS = ::Magick::VERSION
|
11
|
+
MIN_RUBY_VERS = ::Magick::MIN_RUBY_VERSION
|
12
|
+
MIN_RUBY_VERS_NO = MIN_RUBY_VERS.tr('.','').to_i
|
13
|
+
|
14
|
+
attr_reader :headers
|
15
|
+
def initialize
|
16
|
+
configure_compile_options
|
17
|
+
assert_can_compile!
|
18
|
+
configure_headers
|
19
|
+
end
|
20
|
+
|
21
|
+
def configured_compile_options
|
22
|
+
{
|
23
|
+
:magick_config => $magick_config,
|
24
|
+
:with_magick_wand => $with_magick_wand,
|
25
|
+
:pkg_config => $pkg_config,
|
26
|
+
:magick_version => $magick_version,
|
27
|
+
:local_libs => $LOCAL_LIBS,
|
28
|
+
:cflags => $CFLAGS,
|
29
|
+
:cppflags => $CPPFLAGS,
|
30
|
+
:ldflags => $LDFLAGS,
|
31
|
+
:defs => $defs,
|
32
|
+
:config_h => $config_h,
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
def configure_headers
|
37
|
+
#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}
|
38
|
+
@headers = %w{assert.h ctype.h stdio.h stdlib.h math.h time.h}
|
39
|
+
headers << 'stdint.h' if have_header('stdint.h') # defines uint64_t
|
40
|
+
headers << 'sys/types.h' if have_header('sys/types.h')
|
41
|
+
|
42
|
+
if have_header('wand/MagickWand.h')
|
43
|
+
headers << 'wand/MagickWand.h'
|
44
|
+
else
|
45
|
+
exit_failure "\nCan't install RMagick #{RMAGICK_VERS}. Can't find MagickWand.h."
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def configure_compile_options
|
50
|
+
# Magick-config is not available on Windows
|
51
|
+
if RUBY_PLATFORM !~ /mswin|mingw/
|
52
|
+
|
53
|
+
# Check for compiler. Extract first word so ENV['CC'] can be a program name with arguments.
|
54
|
+
config = defined?(RbConfig) ? ::RbConfig : ::Config
|
55
|
+
cc = (ENV['CC'] || config::CONFIG['CC'] || 'gcc').split(' ').first
|
56
|
+
unless find_executable(cc)
|
57
|
+
exit_failure "No C compiler found in ${ENV['PATH']}. See mkmf.log for details."
|
58
|
+
end
|
59
|
+
|
60
|
+
# ugly way to handle which config tool we're going to use...
|
61
|
+
$with_magick_wand = false
|
62
|
+
$magick_config = false
|
63
|
+
$pkg_config = false
|
64
|
+
|
65
|
+
# Check for Magick-config
|
66
|
+
if find_executable('Magick-config') && !has_graphicsmagick_libmagick_dev_compat?
|
67
|
+
$magick_config = true
|
68
|
+
$magick_version = `Magick-config --version`[/^(\d+\.\d+\.\d+)/]
|
69
|
+
elsif find_executable('pkg-config')
|
70
|
+
$pkg_config = true
|
71
|
+
$magick_version = `pkg-config MagickCore --modversion`[/^(\d+\.\d+\.\d+)/]
|
72
|
+
else
|
73
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config or pkg-config in #{ENV['PATH']}\n"
|
74
|
+
end
|
75
|
+
|
76
|
+
check_multiple_imagemagick_versions
|
77
|
+
check_partial_imagemagick_versions
|
78
|
+
|
79
|
+
# Ensure minimum ImageMagick version
|
80
|
+
# Check minimum ImageMagick version if possible
|
81
|
+
checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
|
82
|
+
Logging.message("Detected ImageMagick version: #{$magick_version}\n")
|
83
|
+
|
84
|
+
if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
|
85
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# From ImageMagick 6.9 binaries are split to two and we have to use
|
90
|
+
# MagickWand instead of MagickCore
|
91
|
+
checking_for("presence of MagickWand API (ImageMagick version >= #{Magick::MIN_WAND_VERSION})") do
|
92
|
+
$with_magick_wand = Gem::Version.new($magick_version) >= Gem::Version.new(Magick::MIN_WAND_VERSION)
|
93
|
+
if $with_magick_wand
|
94
|
+
Logging.message('Detected 6.9+ version, using MagickWand API')
|
95
|
+
else
|
96
|
+
Logging.message('Older version detected, using MagickCore API')
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
# either set flags using Magick-config, MagickWand-config or pkg-config (new Debian default)
|
101
|
+
if $with_magick_wand
|
102
|
+
if $magick_config
|
103
|
+
# Save flags
|
104
|
+
$CFLAGS = ENV['CFLAGS'].to_s + ' ' + `MagickWand-config --cflags`.chomp
|
105
|
+
$CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `MagickWand-config --cppflags`.chomp
|
106
|
+
$LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `MagickWand-config --ldflags`.chomp
|
107
|
+
$LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `MagickWand-config --libs`.chomp
|
108
|
+
end
|
109
|
+
|
110
|
+
if $pkg_config
|
111
|
+
# Save flags
|
112
|
+
$CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
|
113
|
+
$CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickWand`.chomp
|
114
|
+
$LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
|
115
|
+
$LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickWand`.chomp
|
116
|
+
end
|
117
|
+
else
|
118
|
+
if $magick_config
|
119
|
+
# Save flags
|
120
|
+
$CFLAGS = ENV['CFLAGS'].to_s + ' ' + `Magick-config --cflags`.chomp
|
121
|
+
$CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `Magick-config --cppflags`.chomp
|
122
|
+
$LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `Magick-config --ldflags`.chomp
|
123
|
+
$LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `Magick-config --libs`.chomp
|
124
|
+
end
|
125
|
+
|
126
|
+
if $pkg_config
|
127
|
+
# Save flags
|
128
|
+
$CFLAGS = ENV['CFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
|
129
|
+
$CPPFLAGS = ENV['CPPFLAGS'].to_s + ' ' + `pkg-config --cflags MagickCore`.chomp
|
130
|
+
$LDFLAGS = ENV['LDFLAGS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
|
131
|
+
$LOCAL_LIBS = ENV['LIBS'].to_s + ' ' + `pkg-config --libs MagickCore`.chomp
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
if RUBY_PLATFORM =~ /darwin/ # osx
|
136
|
+
set_archflags_for_osx
|
137
|
+
end
|
138
|
+
|
139
|
+
elsif RUBY_PLATFORM =~ /mingw/ # mingw
|
140
|
+
|
141
|
+
`magick identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
|
142
|
+
abort 'Unable to get ImageMagick version' unless $1
|
143
|
+
$magick_version = $1
|
144
|
+
unless have_library('CORE_RL_magick_')
|
145
|
+
search_paths_for_library_for_mingw
|
146
|
+
end
|
147
|
+
have_library('X11')
|
148
|
+
|
149
|
+
else # mswin
|
150
|
+
|
151
|
+
`magick identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
|
152
|
+
abort 'Unable to get ImageMagick version' unless $1
|
153
|
+
$magick_version = $1
|
154
|
+
$CFLAGS = '-W3'
|
155
|
+
$CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}
|
156
|
+
# The /link option is required by the Makefile but causes warnings in the mkmf.log file.
|
157
|
+
$LDFLAGS = %Q{/link /LIBPATH:"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Lib" /LIBPATH:"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\lib" /LIBPATH:"C:\\ruby\\lib"}
|
158
|
+
$LOCAL_LIBS = 'CORE_RL_magick_.lib'
|
159
|
+
have_library('X11')
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
# Test for a specific value in an enum type
|
165
|
+
def have_enum_value(enum, value, headers=nil, &b)
|
166
|
+
checking_for "#{enum}.#{value}" do
|
167
|
+
if try_compile(<<"SRC", &b)
|
168
|
+
#{COMMON_HEADERS}
|
169
|
+
#{cpp_include(headers)}
|
170
|
+
/*top*/
|
171
|
+
int main() { #{enum} t = #{value}; t = t; return 0; }
|
172
|
+
SRC
|
173
|
+
$defs.push(format('-DHAVE_ENUM_%s', value.upcase))
|
174
|
+
true
|
175
|
+
else
|
176
|
+
false
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
# Test for multiple values of the same enum type
|
182
|
+
def have_enum_values(enum, values, headers=nil, &b)
|
183
|
+
values.each do |value|
|
184
|
+
have_enum_value(enum, value, headers, &b)
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
def has_graphicsmagick_libmagick_dev_compat?
|
189
|
+
config_path = `which Magick-config`.chomp
|
190
|
+
if File.exist?(config_path) &&
|
191
|
+
File.symlink?(config_path) &&
|
192
|
+
File.readlink(config_path) =~ /GraphicsMagick/
|
193
|
+
msg = 'Found a graphicsmagick-libmagick-dev-compat installation.'
|
194
|
+
Logging.message msg
|
195
|
+
message msg+"\n"
|
196
|
+
true
|
197
|
+
else
|
198
|
+
false
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
def exit_failure(msg)
|
203
|
+
Logging.message msg
|
204
|
+
message msg+"\n"
|
205
|
+
exit(1)
|
206
|
+
end
|
207
|
+
|
208
|
+
# Seems like lots of people have multiple versions of ImageMagick installed.
|
209
|
+
def check_multiple_imagemagick_versions
|
210
|
+
versions = []
|
211
|
+
path = ENV['PATH'].split(File::PATH_SEPARATOR)
|
212
|
+
path.each do |dir|
|
213
|
+
file = File.join(dir, 'Magick-config')
|
214
|
+
if File.executable? file
|
215
|
+
vers = `#{file} --version`.chomp.strip
|
216
|
+
prefix = `#{file} --prefix`.chomp.strip
|
217
|
+
versions << [vers, prefix, dir]
|
218
|
+
end
|
219
|
+
end
|
220
|
+
versions.uniq!
|
221
|
+
if versions.size > 1
|
222
|
+
msg = "\nWarning: Found more than one ImageMagick installation. This could cause problems at runtime.\n"
|
223
|
+
versions.each do |vers, prefix, dir|
|
224
|
+
msg << " #{dir}/Magick-config reports version #{vers} is installed in #{prefix}\n"
|
225
|
+
end
|
226
|
+
msg << "Using #{versions[0][0]} from #{versions[0][1]}.\n\n"
|
227
|
+
Logging.message msg
|
228
|
+
message msg
|
229
|
+
end
|
230
|
+
end
|
231
|
+
|
232
|
+
# Ubuntu (maybe other systems) comes with a partial installation of
|
233
|
+
# ImageMagick in the prefix /usr (some libraries, no includes, and no
|
234
|
+
# binaries). This causes problems when /usr/lib is in the path (e.g., using
|
235
|
+
# the default Ruby installation).
|
236
|
+
def check_partial_imagemagick_versions
|
237
|
+
prefix = config_string('prefix') || ''
|
238
|
+
matches = [
|
239
|
+
prefix+'/lib/lib?agick*',
|
240
|
+
prefix+'/include/ImageMagick',
|
241
|
+
prefix+'/bin/Magick-config',
|
242
|
+
].map do |file_glob|
|
243
|
+
Dir.glob(file_glob)
|
244
|
+
end
|
245
|
+
matches.delete_if { |arr| arr.empty? }
|
246
|
+
if 0 < matches.length && matches.length < 3
|
247
|
+
msg = "\nWarning: Found a partial ImageMagick installation. Your operating system likely has some built-in ImageMagick libraries but not all of ImageMagick. This will most likely cause problems at both compile and runtime.\nFound partial installation at: "+prefix+"\n"
|
248
|
+
Logging.message msg
|
249
|
+
message msg
|
250
|
+
end
|
251
|
+
end
|
252
|
+
|
253
|
+
# issue #169
|
254
|
+
# set ARCHFLAGS appropriately for OSX
|
255
|
+
def set_archflags_for_osx
|
256
|
+
archflags = []
|
257
|
+
fullpath = `which convert`
|
258
|
+
fileinfo = `file #{fullpath}`
|
259
|
+
|
260
|
+
# default ARCHFLAGS
|
261
|
+
archs = $ARCH_FLAG.scan(/-arch\s+(\S+)/).flatten
|
262
|
+
|
263
|
+
archs.each do |arch|
|
264
|
+
if fileinfo.include?(arch)
|
265
|
+
archflags << "-arch #{arch}"
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
if archflags.length != 0
|
270
|
+
$ARCH_FLAG = archflags.join(' ')
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
274
|
+
def search_paths_for_library_for_mingw
|
275
|
+
msg = 'searching PATH for the ImageMagick library...'
|
276
|
+
Logging.message msg
|
277
|
+
message msg+"\n"
|
278
|
+
|
279
|
+
found_lib = false
|
280
|
+
|
281
|
+
paths = ENV['PATH'].split(File::PATH_SEPARATOR)
|
282
|
+
paths.each do |dir|
|
283
|
+
lib = File.join(dir, 'lib')
|
284
|
+
lib_file = File.join(lib, 'CORE_RL_magick_.lib')
|
285
|
+
if File.exist?(lib_file)
|
286
|
+
$CPPFLAGS = %Q{-I"#{File.join(dir, 'include')}"}
|
287
|
+
$LDFLAGS = %Q{-L"#{lib}"}
|
288
|
+
found_lib = have_library('CORE_RL_magick_')
|
289
|
+
break if found_lib
|
290
|
+
end
|
291
|
+
end
|
292
|
+
|
293
|
+
unless found_lib
|
294
|
+
exit_failure <<END_MINGW
|
295
|
+
Can't install RMagick #{RMAGICK_VERS}.
|
296
|
+
Can't find the ImageMagick library.
|
297
|
+
Retry with '--with-opt-dir' option.
|
298
|
+
Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
|
299
|
+
e.g.
|
300
|
+
gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
|
301
|
+
END_MINGW
|
302
|
+
end
|
303
|
+
end
|
304
|
+
|
305
|
+
def assert_can_compile!
|
306
|
+
assert_not_windows!
|
307
|
+
assert_minimum_ruby_version!
|
308
|
+
assert_has_dev_libs!
|
309
|
+
end
|
310
|
+
|
311
|
+
def assert_not_windows!
|
312
|
+
if RUBY_PLATFORM =~ /mswin/
|
313
|
+
abort <<END_MSWIN
|
314
|
+
+----------------------------------------------------------------------------+
|
315
|
+
| This rmagick gem is for use only on Linux, BSD, OS X, and similar systems |
|
316
|
+
| that have a gnu or similar toolchain installed. The rmagick-win32 gem is a |
|
317
|
+
| pre-compiled version of RMagick bundled with ImageMagick for use on |
|
318
|
+
| Microsoft Windows systems. The rmagick-win32 gem is available on RubyForge.|
|
319
|
+
| See http://rmagick.rubyforge.org/install-faq.html for more information. |
|
320
|
+
+----------------------------------------------------------------------------+
|
321
|
+
END_MSWIN
|
322
|
+
end
|
323
|
+
end
|
324
|
+
|
325
|
+
def assert_minimum_ruby_version!
|
326
|
+
unless checking_for("Ruby version >= #{MIN_RUBY_VERS}") do
|
327
|
+
version = RUBY_VERSION.tr('.','').to_i
|
328
|
+
version >= MIN_RUBY_VERS_NO
|
329
|
+
end
|
330
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Ruby #{MIN_RUBY_VERS} or later required.\n"
|
331
|
+
end
|
332
|
+
end
|
333
|
+
|
334
|
+
def assert_has_dev_libs!
|
335
|
+
if RUBY_PLATFORM !~ /mswin|mingw/
|
336
|
+
|
337
|
+
# check for pkg-config if Magick-config doesn't exist
|
338
|
+
if $magick_config && `Magick-config --libs`[/\bl\s*(MagickCore|Magick)6?\b/]
|
339
|
+
elsif $pkg_config && `pkg-config --libs MagickCore`[/\bl\s*(MagickCore|Magick)6?\b/]
|
340
|
+
else
|
341
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. " \
|
342
|
+
"Can't find the ImageMagick library or one of the dependent libraries. " \
|
343
|
+
"Check the mkmf.log file for more detailed information.\n"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
end
|
347
|
+
|
348
|
+
def create_header_file
|
349
|
+
have_func('snprintf', headers)
|
350
|
+
['AcquireImage', # 6.4.1
|
351
|
+
'AffinityImage', # 6.4.3-6
|
352
|
+
'AffinityImages', # 6.4.3-6
|
353
|
+
'AutoGammaImageChannel', # 6.5.5-1
|
354
|
+
'AutoLevelImageChannel', # 6.5.5-1
|
355
|
+
'BlueShiftImage', # 6.5.4-3
|
356
|
+
'ColorMatrixImage', # 6.6.1-0
|
357
|
+
'ConstituteComponentTerminus', # 6.5.7-9
|
358
|
+
'DeskewImage', # 6.4.2-5
|
359
|
+
'DestroyConstitute', # 6.5.7-9(deprecated)
|
360
|
+
'EncipherImage', # 6.3.8-6
|
361
|
+
'EqualizeImageChannel', # 6.3.6-9
|
362
|
+
'EvaluateImages', # 6.8.6-4
|
363
|
+
'FloodfillPaintImage', # 6.3.7
|
364
|
+
'FunctionImageChannel', # 6.4.8-8
|
365
|
+
'GetAuthenticIndexQueue', # 6.4.5-6
|
366
|
+
'GetAuthenticPixels', # 6.4.5-6
|
367
|
+
'GetImageAlphaChannel', # 6.3.9-2
|
368
|
+
'GetMagickFeatures', # 6.5.7-1
|
369
|
+
'GetVirtualPixels', # 6.4.5-6
|
370
|
+
'LevelImageColors', # 6.4.2
|
371
|
+
'LevelColorsImageChannel', # 6.5.6-4
|
372
|
+
'LevelizeImageChannel', # 6.4.2
|
373
|
+
'LiquidRescaleImage', # 6.3.8-2
|
374
|
+
'MagickLibAddendum', # 6.5.9-1
|
375
|
+
'OpaquePaintImageChannel', # 6.3.7-10
|
376
|
+
'QueueAuthenticPixels', # 6.4.5-6
|
377
|
+
'RemapImage', # 6.4.4-0
|
378
|
+
'RemapImages', # 6.4.4-0
|
379
|
+
'RemoveImageArtifact', # 6.3.6
|
380
|
+
'RotationalBlurImage', # 6.8.8-9
|
381
|
+
'RotationalBlurImageChannel', # 6.8.8-9
|
382
|
+
'SelectiveBlurImageChannel', # 6.5.0-3
|
383
|
+
'SetImageAlphaChannel', # 6.3.6-9
|
384
|
+
'SetImageArtifact', # 6.3.6
|
385
|
+
'SetMagickMemoryMethods', # 6.4.1
|
386
|
+
'SparseColorImage', # 6.3.6-?
|
387
|
+
'StatisticImage', # 6.6.8-6
|
388
|
+
'SyncAuthenticPixels', # 6.4.5-6
|
389
|
+
'TransformImageColorspace', # 6.5.1
|
390
|
+
'TransparentPaintImage', # 6.3.7-10
|
391
|
+
'TransparentPaintImageChroma' # 6.4.5-6
|
392
|
+
].each do |func|
|
393
|
+
have_func(func, headers)
|
394
|
+
end
|
395
|
+
|
396
|
+
checking_for('QueryMagickColorname() new signature') do
|
397
|
+
if try_compile(<<"SRC")
|
398
|
+
#{COMMON_HEADERS}
|
399
|
+
#{cpp_include(headers)}
|
400
|
+
/*top*/
|
401
|
+
int main() {
|
402
|
+
MagickBooleanType okay;
|
403
|
+
Image *image;
|
404
|
+
MagickPixelPacket *color;
|
405
|
+
char *name;
|
406
|
+
ExceptionInfo *exception;
|
407
|
+
okay = QueryMagickColorname(image, color, SVGCompliance, name, exception);
|
408
|
+
return 0;
|
409
|
+
}
|
410
|
+
SRC
|
411
|
+
$defs.push('-DHAVE_NEW_QUERYMAGICKCOLORNAME')
|
412
|
+
true
|
413
|
+
else
|
414
|
+
false
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
have_struct_member('Image', 'type', headers) # ???
|
419
|
+
have_struct_member('DrawInfo', 'kerning', headers) # 6.4.7-8
|
420
|
+
have_struct_member('DrawInfo', 'interline_spacing', headers) # 6.5.5-8
|
421
|
+
have_struct_member('DrawInfo', 'interword_spacing', headers) # 6.4.8-0
|
422
|
+
have_type('DitherMethod', headers) # 6.4.2
|
423
|
+
have_type('MagickFunction', headers) # 6.4.8-8
|
424
|
+
have_type('ImageLayerMethod', headers) # 6.3.6 replaces MagickLayerMethod
|
425
|
+
have_type('long double', headers)
|
426
|
+
#have_type("unsigned long long", headers)
|
427
|
+
#have_type("uint64_t", headers)
|
428
|
+
#have_type("__int64", headers)
|
429
|
+
#have_type("uintmax_t", headers)
|
430
|
+
#check_sizeof("unsigned long", headers)
|
431
|
+
#check_sizeof("Image *", headers)
|
432
|
+
|
433
|
+
have_enum_values('AlphaChannelType', ['CopyAlphaChannel', # 6.4.3-7
|
434
|
+
'BackgroundAlphaChannel', # 6.5.2-5
|
435
|
+
'RemoveAlphaChannel'], headers) # 6.7.5-1
|
436
|
+
have_enum_values('CompositeOperator', ['BlurCompositeOp', # 6.5.3-7
|
437
|
+
'DistortCompositeOp', # 6.5.3-10
|
438
|
+
'LinearBurnCompositeOp', # 6.5.4-3
|
439
|
+
'LinearDodgeCompositeOp', # 6.5.4-3
|
440
|
+
'MathematicsCompositeOp', # 6.5.4-3
|
441
|
+
'PegtopLightCompositeOp', # 6.5.4-3
|
442
|
+
'PinLightCompositeOp', # 6.5.4-3
|
443
|
+
'VividLightCompositeOp'], headers) # 6.5.4-3
|
444
|
+
have_enum_values('CompressionType', ['DXT1Compression', # 6.3.9-3
|
445
|
+
'DXT3Compression', # 6.3.9-3
|
446
|
+
'DXT5Compression', # 6.3.9-3
|
447
|
+
'ZipSCompression', # 6.5.5-4
|
448
|
+
'PizCompression', # 6.5.5-4
|
449
|
+
'Pxr24Compression', # 6.5.5-4
|
450
|
+
'B44Compression', # 6.5.5-4
|
451
|
+
'B44ACompression'], headers) # 6.5.5-4
|
452
|
+
|
453
|
+
have_enum_values('DistortImageMethod', ['BarrelDistortion', # 6.4.2-5
|
454
|
+
'BarrelInverseDistortion', # 6.4.3-8
|
455
|
+
'BilinearForwardDistortion', # 6.5.1-2
|
456
|
+
'BilinearReverseDistortion', # 6.5.1-2
|
457
|
+
'DePolarDistortion', # 6.4.2-6
|
458
|
+
'PolarDistortion', # 6.4.2-6
|
459
|
+
'PolynomialDistortion', # 6.4.2-4
|
460
|
+
'ShepardsDistortion'], headers) # 6.4.2-4
|
461
|
+
have_enum_value('DitherMethod', 'NoDitherMethod', headers) # 6.4.3
|
462
|
+
have_enum_values('FilterTypes', ['KaiserFilter', # 6.3.6
|
463
|
+
'WelshFilter', # 6.3.6-4
|
464
|
+
'ParzenFilter', # 6.3.6-4
|
465
|
+
'LagrangeFilter', # 6.3.7-2
|
466
|
+
'BohmanFilter', # 6.3.7-2
|
467
|
+
'BartlettFilter', # 6.3.7-2
|
468
|
+
'SentinelFilter'], headers) # 6.3.7-2
|
469
|
+
have_enum_values('MagickEvaluateOperator', ['PowEvaluateOperator', # 6.4.1-9
|
470
|
+
'LogEvaluateOperator', # 6.4.2
|
471
|
+
'ThresholdEvaluateOperator', # 6.4.3
|
472
|
+
'ThresholdBlackEvaluateOperator', # 6.4.3
|
473
|
+
'ThresholdWhiteEvaluateOperator', # 6.4.3
|
474
|
+
'GaussianNoiseEvaluateOperator', # 6.4.3
|
475
|
+
'ImpulseNoiseEvaluateOperator', # 6.4.3
|
476
|
+
'LaplacianNoiseEvaluateOperator', # 6.4.3
|
477
|
+
'MultiplicativeNoiseEvaluateOperator', # 6.4.3
|
478
|
+
'PoissonNoiseEvaluateOperator', # 6.4.3
|
479
|
+
'UniformNoiseEvaluateOperator', # 6.4.3
|
480
|
+
'CosineEvaluateOperator', # 6.4.8-5
|
481
|
+
'SineEvaluateOperator', # 6.4.8-5
|
482
|
+
'AddModulusEvaluateOperator'], # 6.4.8-5
|
483
|
+
headers)
|
484
|
+
have_enum_values('MagickFunction', ['ArcsinFunction', # 6.5.2-8
|
485
|
+
'ArctanFunction', # 6.5.2-8
|
486
|
+
'PolynomialFunction', # 6.4.8-8
|
487
|
+
'SinusoidFunction'], headers) # 6.4.8-8
|
488
|
+
have_enum_values('ImageLayerMethod', ['FlattenLayer', # 6.3.6-2
|
489
|
+
'MergeLayer', # 6.3.6
|
490
|
+
'MosaicLayer', # 6.3.6-2
|
491
|
+
'TrimBoundsLayer' ], headers) # 6.4.3-8
|
492
|
+
have_enum_values('VirtualPixelMethod', ['HorizontalTileVirtualPixelMethod', # 6.4.2-6
|
493
|
+
'VerticalTileVirtualPixelMethod', # 6.4.2-6
|
494
|
+
'HorizontalTileEdgeVirtualPixelMethod', # 6.5.0-1
|
495
|
+
'VerticalTileEdgeVirtualPixelMethod', # 6.5.0-1
|
496
|
+
'CheckerTileVirtualPixelMethod'], # 6.5.0-1
|
497
|
+
headers)
|
498
|
+
|
499
|
+
headers = ['ruby.h', 'ruby/io.h']
|
500
|
+
|
501
|
+
have_func('rb_frame_this_func', headers)
|
502
|
+
|
503
|
+
# Miscellaneous constants
|
504
|
+
$defs.push("-DRUBY_VERSION_STRING=\"ruby #{RUBY_VERSION}\"")
|
505
|
+
$defs.push("-DRMAGICK_VERSION_STRING=\"RMagick #{RMAGICK_VERS}\"")
|
506
|
+
|
507
|
+
create_header
|
508
|
+
end
|
509
|
+
|
510
|
+
def create_makefile_file
|
511
|
+
create_header_file
|
512
|
+
# Prior to 1.8.5 mkmf duplicated the symbols on the command line and in the
|
513
|
+
# extconf.h header. Suppress that behavior by removing the symbol array.
|
514
|
+
$defs = []
|
515
|
+
|
516
|
+
# Force re-compilation if the generated Makefile changed.
|
517
|
+
$config_h = 'Makefile rmagick.h'
|
518
|
+
|
519
|
+
create_makefile('RMagick2')
|
520
|
+
print_summary
|
521
|
+
end
|
522
|
+
|
523
|
+
def print_summary
|
524
|
+
summary = <<"END_SUMMARY"
|
525
|
+
|
526
|
+
|
527
|
+
#{'=' * 70}
|
528
|
+
#{DateTime.now.strftime('%a %d%b%y %T')}
|
529
|
+
This installation of RMagick #{RMAGICK_VERS} is configured for
|
530
|
+
Ruby #{RUBY_VERSION} (#{RUBY_PLATFORM}) and ImageMagick #{$magick_version}
|
531
|
+
#{'=' * 70}
|
532
|
+
|
533
|
+
|
534
|
+
END_SUMMARY
|
535
|
+
|
536
|
+
Logging.message summary
|
537
|
+
message summary
|
538
|
+
end
|
539
|
+
end
|
540
|
+
end
|
541
|
+
|
542
|
+
extconf = RMagick::Extconf.new
|
543
|
+
at_exit do
|
544
|
+
msg = "Configured compile options: #{extconf.configured_compile_options}"
|
545
|
+
Logging.message msg
|
546
|
+
message msg+"\n"
|
547
|
+
end
|
548
|
+
extconf.create_makefile_file
|