rmagick-windows 2.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|