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,126 @@
|
|
1
|
+
#--
|
2
|
+
# $Id: transformable.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
|
3
|
+
# Copyright (C) 2009 Timothy P. Hunter
|
4
|
+
#++
|
5
|
+
module Magick
|
6
|
+
class RVG
|
7
|
+
# Transforms is an Array with a deep_copy method.
|
8
|
+
# During unit-testing it also has a deep_equal method.
|
9
|
+
class Transforms < Array #:nodoc:
|
10
|
+
def deep_copy(h = nil)
|
11
|
+
copy = self.class.new
|
12
|
+
each { |transform| copy << [transform[0], transform[1].dup] }
|
13
|
+
copy
|
14
|
+
end
|
15
|
+
end # class Transform
|
16
|
+
|
17
|
+
# Transformations are operations on the coordinate system.
|
18
|
+
# All the transformations defined within a container (an RVG object
|
19
|
+
# or a group) are applied before drawing any shapes or text.
|
20
|
+
# All transformations are applied in the order they were
|
21
|
+
# defined. <em>Note:</em> This means that
|
22
|
+
# g.translate(10,20).scale(2)
|
23
|
+
# is not the same as
|
24
|
+
# g.scale(2).translate(10,20)
|
25
|
+
module Transformable
|
26
|
+
private
|
27
|
+
|
28
|
+
# Apply transforms in the same order they were specified!
|
29
|
+
def add_transform_primitives(gc)
|
30
|
+
@transforms.each { |transform| gc.__send__(transform[0], *transform[1]) }
|
31
|
+
end
|
32
|
+
|
33
|
+
def initialize(*args, &block)
|
34
|
+
super()
|
35
|
+
@transforms = Transforms.new
|
36
|
+
end
|
37
|
+
|
38
|
+
public
|
39
|
+
|
40
|
+
# Applies the transformation matrix [sx, rx, ry, sy, tx, ty]
|
41
|
+
def matrix(sx, rx, ry, sy, tx, ty)
|
42
|
+
begin
|
43
|
+
@transforms << [:affine, [Float(sx), Float(rx), Float(ry), Float(sy), Float(tx), Float(ty)]]
|
44
|
+
rescue ArgumentError
|
45
|
+
raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{rx.class}, #{ry.class}, #{sy.class}, #{sx.class}, #{sx.class}, #{tx.class}, #{ty.class})"
|
46
|
+
end
|
47
|
+
yield(self) if block_given?
|
48
|
+
self
|
49
|
+
end
|
50
|
+
|
51
|
+
# Add <tt>tx</tt> to all x-coordinates and <tt>ty</tt>
|
52
|
+
# to all y-coordinates. If <tt>ty</tt> is omitted it defaults
|
53
|
+
# to <tt>tx</tt>.
|
54
|
+
def translate(tx, ty = nil)
|
55
|
+
ty ||= tx
|
56
|
+
begin
|
57
|
+
@transforms << [:translate, [Float(tx), Float(ty)]]
|
58
|
+
rescue ArgumentError
|
59
|
+
raise ArgumentError, "arguments must be convertable to float (got #{tx.class}, #{ty.class})"
|
60
|
+
end
|
61
|
+
yield(self) if block_given?
|
62
|
+
self
|
63
|
+
end
|
64
|
+
|
65
|
+
# Multiply the x-coordinates by <tt>sx</tt> and the y-coordinates
|
66
|
+
# by <tt>sy</tt>. If <tt>sy</tt> is omitted it defaults to <tt>sx</tt>.
|
67
|
+
def scale(sx, sy = nil)
|
68
|
+
sy ||= sx
|
69
|
+
begin
|
70
|
+
@transforms << [:scale, [Float(sx), Float(sy)]]
|
71
|
+
rescue ArgumentError
|
72
|
+
raise ArgumentError, "arguments must be convertable to float (got #{sx.class}, #{sy.class})"
|
73
|
+
end
|
74
|
+
yield(self) if block_given?
|
75
|
+
self
|
76
|
+
end
|
77
|
+
|
78
|
+
# This method can take either of two argument lists:
|
79
|
+
# [rotate(angle)] rotate by <tt>angle</tt> degrees
|
80
|
+
# [rotate(angle, cx, cy)] rotate by <tt>angle</tt> degrees about
|
81
|
+
# the point [<tt>cx</tt>, <tt>cy</tt>].
|
82
|
+
def rotate(angle, *args)
|
83
|
+
begin
|
84
|
+
case args.length
|
85
|
+
when 0
|
86
|
+
@transforms << [:rotate, [Float(angle)]]
|
87
|
+
when 2
|
88
|
+
cx = Float(args[0])
|
89
|
+
cy = Float(args[1])
|
90
|
+
@transforms << [:translate, [cx, cy]]
|
91
|
+
@transforms << [:rotate, [angle]]
|
92
|
+
@transforms << [:translate, [-cx, -cy]]
|
93
|
+
else
|
94
|
+
fail ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
|
95
|
+
end
|
96
|
+
rescue ArgumentError
|
97
|
+
raise ArgumentError, "arguments must be convertable to float (got #{[angle, *args].collect {|a| a.class}.join(', ')})"
|
98
|
+
end
|
99
|
+
yield(self) if block_given?
|
100
|
+
self
|
101
|
+
end
|
102
|
+
|
103
|
+
# Skew the X-axis by <tt>angle</tt> degrees.
|
104
|
+
def skewX(angle)
|
105
|
+
begin
|
106
|
+
@transforms << [:skewx, [Float(angle)]]
|
107
|
+
rescue ArgumentError
|
108
|
+
raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
|
109
|
+
end
|
110
|
+
yield(self) if block_given?
|
111
|
+
self
|
112
|
+
end
|
113
|
+
|
114
|
+
# Skew the Y-axis by <tt>angle</tt> degrees.
|
115
|
+
def skewY(angle)
|
116
|
+
begin
|
117
|
+
@transforms << [:skewy, [Float(angle)]]
|
118
|
+
rescue ArgumentError
|
119
|
+
raise ArgumentError, "argument must be convertable to float (got #{angle.class})"
|
120
|
+
end
|
121
|
+
yield(self) if block_given?
|
122
|
+
self
|
123
|
+
end
|
124
|
+
end # module Transformable
|
125
|
+
end # class RVG
|
126
|
+
end # module Magick
|
data/lib/rvg/units.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# $Id: units.rb,v 1.5 2009/02/28 23:52:28 rmagick Exp $
|
2
|
+
# Copyright (C) 2009 Timothy P. Hunter
|
3
|
+
module Magick
|
4
|
+
class RVG
|
5
|
+
# Define RVG.dpi and RVG.dpi=. Add conversions to Fixnum and Float classes
|
6
|
+
class << self
|
7
|
+
attr_reader :dpi
|
8
|
+
def dpi=(n)
|
9
|
+
unless defined?(@dpi)
|
10
|
+
[Float, Fixnum].each do |c|
|
11
|
+
c.class_eval <<-END_DEFS
|
12
|
+
# the default measurement - 1px is 1 pixel
|
13
|
+
def px
|
14
|
+
self
|
15
|
+
end
|
16
|
+
# inches
|
17
|
+
def in
|
18
|
+
self * ::Magick::RVG.dpi
|
19
|
+
end
|
20
|
+
# millimeters
|
21
|
+
def mm
|
22
|
+
self * ::Magick::RVG.dpi / 25.4
|
23
|
+
end
|
24
|
+
# centimeters
|
25
|
+
def cm
|
26
|
+
self * ::Magick::RVG.dpi / 2.54
|
27
|
+
end
|
28
|
+
# points
|
29
|
+
def pt
|
30
|
+
self * ::Magick::RVG.dpi / 72.0
|
31
|
+
end
|
32
|
+
# picas
|
33
|
+
def pc
|
34
|
+
self * ::Magick::RVG.dpi / 6.0
|
35
|
+
end
|
36
|
+
# percentage of the argument
|
37
|
+
def pct(of)
|
38
|
+
self * Float(of) / 100.0
|
39
|
+
end
|
40
|
+
# the default is deg
|
41
|
+
def deg
|
42
|
+
self
|
43
|
+
end
|
44
|
+
# radians -> degrees
|
45
|
+
def rad
|
46
|
+
self * 180.0 / Math::PI
|
47
|
+
end
|
48
|
+
# grads -> degrees
|
49
|
+
def grad
|
50
|
+
self * 9.0 / 10.0
|
51
|
+
end
|
52
|
+
END_DEFS
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
@dpi = Float(n)
|
57
|
+
return @dpi
|
58
|
+
rescue ArgumentError
|
59
|
+
raise TypeError, "Can't convert `#{n}' to Float"
|
60
|
+
end
|
61
|
+
end # class << self
|
62
|
+
end # class RVG
|
63
|
+
end # module Magick
|
data/rmagick.gemspec
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'date'
|
2
|
+
require 'English'
|
3
|
+
require './lib/rmagick/version'
|
4
|
+
|
5
|
+
def v(version)
|
6
|
+
Gem::Version.new(version)
|
7
|
+
end
|
8
|
+
|
9
|
+
# RUBY = v(RUBY_VERSION.dup)
|
10
|
+
|
11
|
+
Gem::Specification.new do |s|
|
12
|
+
s.name = 'rmagick-windows'
|
13
|
+
s.version = Magick::VERSION
|
14
|
+
s.date = Date.today.to_s
|
15
|
+
s.summary = 'Ruby binding to ImageMagick'
|
16
|
+
s.description = 'RMagick is an interface between Ruby and ImageMagick. Fix for windows.'
|
17
|
+
s.authors = ['Tim Hunter', 'Omer Bar-or', 'Benjamin Thomas', 'Moncef Maiza', 'Cedric Zuger']
|
18
|
+
s.email = 'github@benjaminfleischer.com'
|
19
|
+
s.homepage = 'https://github.com/czuger/rmagick'
|
20
|
+
s.license = 'MIT'
|
21
|
+
|
22
|
+
tracked_files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
23
|
+
file_exclusion_regex = %r{(\Alib/rvg/to_c.rb)}
|
24
|
+
files = tracked_files.reject{|file| file[file_exclusion_regex] }
|
25
|
+
test_files = files.grep(%r{^(test|spec|features)/})
|
26
|
+
executables = files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
27
|
+
|
28
|
+
s.files = files
|
29
|
+
s.test_files = test_files
|
30
|
+
s.executables = executables
|
31
|
+
s.require_paths << 'ext' << 'deprecated'
|
32
|
+
|
33
|
+
s.rubyforge_project = 'rmagick'
|
34
|
+
s.extensions = %w{ext/RMagick/extconf.rb}
|
35
|
+
s.has_rdoc = false
|
36
|
+
s.required_ruby_version = ">= #{Magick::MIN_RUBY_VERSION}"
|
37
|
+
s.requirements << "ImageMagick #{Magick::MIN_IM_VERSION} or later"
|
38
|
+
|
39
|
+
s.add_development_dependency 'rake-compiler'
|
40
|
+
s.add_development_dependency 'rspec', '~> 3'
|
41
|
+
s.add_development_dependency 'rubocop', '~> 0.33.0'
|
42
|
+
|
43
|
+
# if RUBY >= v('2.2.0')
|
44
|
+
# s.add_development_dependency 'test-unit', '~> 2'
|
45
|
+
# end
|
46
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
RSpec.describe Magick::ImageList do
|
2
|
+
describe 'images_from_imagelist' do
|
3
|
+
it 'works with identical instances' do
|
4
|
+
expect do
|
5
|
+
img = Magick::Image.new(1, 1)
|
6
|
+
list = Magick::ImageList.new
|
7
|
+
list << img << img
|
8
|
+
res = list.append(false)
|
9
|
+
expect(res.columns).to eq(2)
|
10
|
+
expect(res.rows).to eq(1)
|
11
|
+
end.not_to raise_error
|
12
|
+
|
13
|
+
expect do
|
14
|
+
img = Magick::Image.new(1, 1)
|
15
|
+
img2 = Magick::Image.new(3, 3)
|
16
|
+
list = Magick::ImageList.new
|
17
|
+
list.concat([img, img2, img, img2, img])
|
18
|
+
res = list.append(false)
|
19
|
+
expect(res.columns).to eq(9)
|
20
|
+
expect(res.rows).to eq(3)
|
21
|
+
end.not_to raise_error
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,156 @@
|
|
1
|
+
class Magick::Draw
|
2
|
+
def self._dummy_img_
|
3
|
+
@@_dummy_img_
|
4
|
+
end
|
5
|
+
end
|
6
|
+
|
7
|
+
RSpec.describe Magick::Draw do
|
8
|
+
let(:draw) { Magick::Draw.new }
|
9
|
+
|
10
|
+
describe '._dummy_img_' do
|
11
|
+
it 'works' do
|
12
|
+
# initially this variable is not defined.
|
13
|
+
expect { Magick::Draw._dummy_img_ }.to raise_error(NameError)
|
14
|
+
|
15
|
+
# cause it to become defined. save the object id.
|
16
|
+
draw.get_type_metrics('ABCDEF')
|
17
|
+
dummy = nil
|
18
|
+
expect { dummy = Magick::Draw._dummy_img_ }.not_to raise_error
|
19
|
+
|
20
|
+
expect(dummy).to be_instance_of(Magick::Image)
|
21
|
+
|
22
|
+
# ensure that it is always the same object
|
23
|
+
draw.get_type_metrics('ABCDEF')
|
24
|
+
dummy2 = nil
|
25
|
+
expect { dummy2 = Magick::Draw._dummy_img_ }.not_to raise_error
|
26
|
+
expect(dummy).to eq dummy2
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe '#kerning=' do
|
31
|
+
it 'assigns without raising an error' do
|
32
|
+
expect { draw.kerning = 1 }.not_to raise_error
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe '#kerning' do
|
37
|
+
it 'accepts a valid parameter without raising an error' do
|
38
|
+
expect { draw.kerning(1) }.not_to raise_error
|
39
|
+
end
|
40
|
+
|
41
|
+
it 'raises an error when given an invalid parameter' do
|
42
|
+
expect { draw.kerning('a') }.to raise_error(ArgumentError)
|
43
|
+
expect { draw.kerning([]) }.to raise_error(TypeError)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
describe '#interline_spacing=' do
|
48
|
+
it 'assigns without raising an error' do
|
49
|
+
expect { draw.interline_spacing = 1 }.not_to raise_error
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#interline_spacing' do
|
54
|
+
it 'accepts a valid parameter without raising an error' do
|
55
|
+
expect { draw.interline_spacing(1) }.not_to raise_error
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'raises an error when given an invalid parameter' do
|
59
|
+
expect { draw.interline_spacing('a') }.to raise_error(ArgumentError)
|
60
|
+
expect { draw.interline_spacing([]) }.to raise_error(TypeError)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe '#interword_spacing=' do
|
65
|
+
it 'assigns without raising an error' do
|
66
|
+
expect { draw.interword_spacing = 1 }.not_to raise_error
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
describe '#interword_spacing' do
|
71
|
+
it 'accepts a valid parameter without raising an error' do
|
72
|
+
expect { draw.interword_spacing(1) }.not_to raise_error
|
73
|
+
end
|
74
|
+
|
75
|
+
it 'raises an error when given an invalid parameter' do
|
76
|
+
expect { draw.interword_spacing('a') }.to raise_error(ArgumentError)
|
77
|
+
expect { draw.interword_spacing([]) }.to raise_error(TypeError)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe '#marshal_dump', '#marshal_load' do
|
82
|
+
it 'marshals without an error' do
|
83
|
+
skip 'this spec fails on some versions of ImageMagick'
|
84
|
+
rose = Magick::Image.read('rose:').first
|
85
|
+
granite = Magick::Image.read('granite:').first
|
86
|
+
s = granite.to_blob { self.format = 'miff' }
|
87
|
+
granite = Magick::Image.from_blob(s).first
|
88
|
+
blue_stroke = Magick::Image.new(20,20) { self.background_color = 'blue' }
|
89
|
+
s = blue_stroke.to_blob { self.format = 'miff' }
|
90
|
+
blue_stroke = Magick::Image.from_blob(s).first
|
91
|
+
|
92
|
+
draw.affine = Magick::AffineMatrix.new(1, 2, 3, 4, 5, 6)
|
93
|
+
draw.decorate = Magick::LineThroughDecoration
|
94
|
+
draw.encoding = 'AdobeCustom'
|
95
|
+
draw.gravity = Magick::CenterGravity
|
96
|
+
draw.fill = Magick::Pixel.from_color('red')
|
97
|
+
draw.stroke = Magick::Pixel.from_color('blue')
|
98
|
+
draw.stroke_width = 5
|
99
|
+
draw.fill_pattern = granite
|
100
|
+
draw.stroke_pattern = blue_stroke
|
101
|
+
draw.text_antialias = true
|
102
|
+
draw.font = 'Arial-Bold'
|
103
|
+
draw.font_family = 'arial'
|
104
|
+
draw.font_style = Magick::ItalicStyle
|
105
|
+
draw.font_stretch = Magick::CondensedStretch
|
106
|
+
draw.font_weight = Magick::BoldWeight
|
107
|
+
draw.pointsize = 12
|
108
|
+
draw.density = '72x72'
|
109
|
+
draw.align = Magick::CenterAlign
|
110
|
+
draw.undercolor = Magick::Pixel.from_color('green')
|
111
|
+
draw.kerning = 10.5
|
112
|
+
draw.interword_spacing = 3.75
|
113
|
+
|
114
|
+
draw.circle(20, 25, 20, 28)
|
115
|
+
dumped = nil
|
116
|
+
expect { dumped = Marshal.dump(draw) }.not_to raise_error
|
117
|
+
expect { Marshal.load(dumped) }.not_to raise_error
|
118
|
+
end
|
119
|
+
end
|
120
|
+
|
121
|
+
describe '#fill_pattern' do
|
122
|
+
it 'accepts an Image argument' do
|
123
|
+
img = Magick::Image.new(20,20)
|
124
|
+
expect { draw.fill_pattern = img }.not_to raise_error
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'accepts an ImageList argument' do
|
128
|
+
img = Magick::Image.new(20,20)
|
129
|
+
ilist = Magick::ImageList.new
|
130
|
+
ilist << img
|
131
|
+
expect { draw.fill_pattern = ilist }.not_to raise_error
|
132
|
+
end
|
133
|
+
|
134
|
+
it 'does not accept arbitrary arguments' do
|
135
|
+
expect { draw.fill_pattern = 1 }.to raise_error(NoMethodError)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
describe '#stroke_pattern' do
|
140
|
+
it 'accepts an Image argument' do
|
141
|
+
img = Magick::Image.new(20,20)
|
142
|
+
expect { draw.stroke_pattern = img }.not_to raise_error
|
143
|
+
end
|
144
|
+
|
145
|
+
it 'accepts an ImageList argument' do
|
146
|
+
img = Magick::Image.new(20,20)
|
147
|
+
ilist = Magick::ImageList.new
|
148
|
+
ilist << img
|
149
|
+
expect { draw.stroke_pattern = ilist }.not_to raise_error
|
150
|
+
end
|
151
|
+
|
152
|
+
it 'does not accept arbitrary arguments' do
|
153
|
+
expect { draw.stroke_pattern = 1 }.to raise_error(NoMethodError)
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
RSpec.describe Magick::Image, '#blue_shift' do
|
2
|
+
|
3
|
+
let(:img) { Magick::Image.read(IMAGES_DIR+'/Button_0.gif').first }
|
4
|
+
|
5
|
+
it 'returns a new Image' do
|
6
|
+
res = img.blue_shift
|
7
|
+
expect(res).to be_instance_of(Magick::Image)
|
8
|
+
expect(res).not_to eq img
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'accepts one argument' do
|
12
|
+
expect { img.blue_shift(2) }.not_to raise_error
|
13
|
+
expect { img.blue_shift(2, 3) }.to raise_error(ArgumentError)
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
@@ -0,0 +1,140 @@
|
|
1
|
+
RSpec.describe Magick::Image, '#composite' do
|
2
|
+
|
3
|
+
let(:img1) { Magick::Image.read(IMAGES_DIR+'/Button_0.gif').first }
|
4
|
+
let(:img2) { Magick::Image.read(IMAGES_DIR+'/Button_1.gif').first }
|
5
|
+
let(:composite_ops) do
|
6
|
+
[
|
7
|
+
Magick::UndefinedCompositeOp,
|
8
|
+
Magick::NoCompositeOp,
|
9
|
+
Magick::AddCompositeOp,
|
10
|
+
Magick::AtopCompositeOp,
|
11
|
+
Magick::BumpmapCompositeOp,
|
12
|
+
Magick::ClearCompositeOp,
|
13
|
+
Magick::ColorizeCompositeOp,
|
14
|
+
Magick::CopyBlueCompositeOp,
|
15
|
+
Magick::CopyCompositeOp,
|
16
|
+
Magick::CopyGreenCompositeOp,
|
17
|
+
Magick::CopyOpacityCompositeOp,
|
18
|
+
Magick::CopyRedCompositeOp,
|
19
|
+
Magick::CopyCyanCompositeOp,
|
20
|
+
Magick::CopyMagentaCompositeOp,
|
21
|
+
Magick::CopyYellowCompositeOp,
|
22
|
+
Magick::CopyBlackCompositeOp,
|
23
|
+
Magick::DarkenCompositeOp,
|
24
|
+
Magick::DifferenceCompositeOp,
|
25
|
+
Magick::DisplaceCompositeOp,
|
26
|
+
Magick::DissolveCompositeOp,
|
27
|
+
Magick::DstAtopCompositeOp,
|
28
|
+
Magick::DstCompositeOp,
|
29
|
+
Magick::DstInCompositeOp,
|
30
|
+
Magick::DstOutCompositeOp,
|
31
|
+
Magick::DstOverCompositeOp,
|
32
|
+
Magick::HueCompositeOp,
|
33
|
+
Magick::InCompositeOp,
|
34
|
+
Magick::LightenCompositeOp,
|
35
|
+
Magick::LuminizeCompositeOp,
|
36
|
+
Magick::MinusCompositeOp,
|
37
|
+
Magick::ModulateCompositeOp,
|
38
|
+
Magick::MultiplyCompositeOp,
|
39
|
+
Magick::OutCompositeOp,
|
40
|
+
Magick::OverCompositeOp,
|
41
|
+
Magick::OverlayCompositeOp,
|
42
|
+
Magick::PlusCompositeOp,
|
43
|
+
Magick::ReplaceCompositeOp,
|
44
|
+
Magick::SaturateCompositeOp,
|
45
|
+
Magick::ScreenCompositeOp,
|
46
|
+
Magick::SrcAtopCompositeOp,
|
47
|
+
Magick::SrcCompositeOp,
|
48
|
+
Magick::SrcInCompositeOp,
|
49
|
+
Magick::SrcOutCompositeOp,
|
50
|
+
Magick::SrcOverCompositeOp,
|
51
|
+
Magick::SubtractCompositeOp,
|
52
|
+
Magick::ThresholdCompositeOp,
|
53
|
+
Magick::XorCompositeOp,
|
54
|
+
Magick::BlendCompositeOp,
|
55
|
+
Magick::ColorBurnCompositeOp,
|
56
|
+
Magick::ColorDodgeCompositeOp,
|
57
|
+
Magick::ExclusionCompositeOp,
|
58
|
+
Magick::HardLightCompositeOp,
|
59
|
+
Magick::SoftLightCompositeOp
|
60
|
+
]
|
61
|
+
end
|
62
|
+
let(:gravity) do
|
63
|
+
[
|
64
|
+
Magick::NorthEastGravity,
|
65
|
+
Magick::EastGravity,
|
66
|
+
Magick::SouthWestGravity,
|
67
|
+
Magick::SouthGravity,
|
68
|
+
Magick::SouthEastGravity
|
69
|
+
]
|
70
|
+
end
|
71
|
+
|
72
|
+
it 'raises an error given invalid arguments' do
|
73
|
+
expect { img1.composite }.to raise_error(ArgumentError)
|
74
|
+
expect { img1.composite(img2) }.to raise_error(ArgumentError)
|
75
|
+
expect do
|
76
|
+
img1.composite(img2, Magick::NorthWestGravity)
|
77
|
+
end.to raise_error(ArgumentError)
|
78
|
+
expect { img1.composite(2) }.to raise_error(ArgumentError)
|
79
|
+
expect { img1.composite(img2, 2) }.to raise_error(ArgumentError)
|
80
|
+
end
|
81
|
+
|
82
|
+
context 'when given 3 arguments' do
|
83
|
+
it 'works when 2nd argument is a gravity' do
|
84
|
+
composite_ops.each do |op|
|
85
|
+
gravity.each do |grav|
|
86
|
+
expect { img1.composite(img2, grav, op) }.not_to raise_error
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
it 'raises an error when 2nd argument is not a gravity' do
|
92
|
+
expect do
|
93
|
+
img1.composite(img2, 2, Magick::OverCompositeOp)
|
94
|
+
end.to raise_error(TypeError)
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
context 'when given 4 arguments' do
|
99
|
+
it 'works when 4th argument is a composite operator' do
|
100
|
+
# there are way too many CompositeOperators to test them all, so just try
|
101
|
+
# few representative ops
|
102
|
+
composite_ops.each do |op|
|
103
|
+
expect { img1.composite(img2, 0, 0, op) }.not_to raise_error
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
it 'returns a new Magick::Image object' do
|
108
|
+
res = img1.composite(img2, 0, 0, Magick::OverCompositeOp)
|
109
|
+
expect(res).to be_instance_of(Magick::Image)
|
110
|
+
end
|
111
|
+
|
112
|
+
it 'raises an error when 4th argument is not a composite operator' do
|
113
|
+
expect { img1.composite(img2, 0, 0, 2) }.to raise_error(TypeError)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when given 5 arguments' do
|
118
|
+
it 'works when 2nd argument is gravity and 5th is a composite operator' do
|
119
|
+
composite_ops.each do |op|
|
120
|
+
gravity.each do |grav|
|
121
|
+
expect { img1.composite(img2, grav, 0, 0, op) }.not_to raise_error
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
it 'raises an error when 2nd argument is not a gravity' do
|
127
|
+
expect do
|
128
|
+
img1.composite(img2, 0, 0, 2, Magick::OverCompositeOp)
|
129
|
+
end.to raise_error(TypeError)
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'raises an error when the image has been destroyed' do
|
134
|
+
img2.destroy!
|
135
|
+
expect do
|
136
|
+
img1.composite(img2, Magick::CenterGravity, Magick::OverCompositeOp)
|
137
|
+
end.to raise_error(Magick::DestroyedImageError)
|
138
|
+
end
|
139
|
+
|
140
|
+
end
|