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,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
|