rmagick 2.15.3 → 2.15.4
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of rmagick might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/.editorconfig +14 -0
- data/.rubocop.yml +27 -3
- data/.travis.yml +9 -6
- data/CHANGELOG.md +4 -0
- data/CONTRIBUTING.md +10 -0
- data/README.textile +4 -0
- data/before_install_linux.sh +4 -4
- data/doc/ex/gravity.rb +2 -1
- data/ext/RMagick/extconf.rb +60 -17
- data/lib/rmagick/version.rb +1 -1
- data/lib/rvg/clippath.rb +37 -36
- data/lib/rvg/container.rb +106 -107
- data/lib/rvg/deep_equal.rb +46 -48
- data/lib/rvg/describable.rb +35 -36
- data/lib/rvg/embellishable.rb +384 -380
- data/lib/rvg/misc.rb +705 -690
- data/lib/rvg/paint.rb +39 -40
- data/lib/rvg/pathdata.rb +120 -121
- data/lib/rvg/rvg.rb +212 -209
- data/lib/rvg/stretchable.rb +159 -158
- data/lib/rvg/stylable.rb +99 -100
- data/lib/rvg/text.rb +0 -1
- data/lib/rvg/transformable.rb +110 -110
- data/lib/rvg/units.rb +58 -58
- data/rmagick.gemspec +1 -1
- 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 +3 -0
- data/test/Image1.rb +524 -718
- data/test/Image2.rb +1262 -1262
- data/test/Image3.rb +973 -973
- data/test/ImageList2.rb +341 -341
- data/test/Image_attributes.rb +678 -678
- data/test/Info.rb +336 -336
- data/test/Magick.rb +245 -242
- data/test/Pixel.rb +105 -105
- data/test/Preview.rb +42 -42
- metadata +21 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 79bd6595ef81cd3743a21521e9a4bed46dbcf52b
|
4
|
+
data.tar.gz: 659d7eff32093a2a9d1738509a0c4c3376466d29
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 72eb476772660c07483bf8748716d1a95412c3d64988c65385dee9b48b4177a9e42beb583a031233689446fb3aa2987d1da672ed18fe88bf96618ea28da5fb6e
|
7
|
+
data.tar.gz: b67cb2bcccb97b2e4ef53b65fdfabde8cacf18dfcba388d49a476d6f96d27d2685aeef6e15e1268aa68465277e3752a45fe4f7c1bbc26bb8ebad091056953ca4
|
data/.editorconfig
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
# EditorConfig helps developers define and maintain consistent coding styles between different editors and IDEs
|
2
|
+
# @see http://editorconfig.org
|
3
|
+
root = true
|
4
|
+
|
5
|
+
[*]
|
6
|
+
end_of_line = lf
|
7
|
+
charset = utf-8
|
8
|
+
trim_trailing_whitespace = true
|
9
|
+
insert_final_newline = true
|
10
|
+
indent_style = spaces
|
11
|
+
tab_width = 2
|
12
|
+
|
13
|
+
[{*.{rb,yml,sh,md}]
|
14
|
+
indent_size = 2
|
data/.rubocop.yml
CHANGED
@@ -14,9 +14,6 @@ Style/Lambda:
|
|
14
14
|
Style/StringLiterals:
|
15
15
|
EnforcedStyle: single_quotes
|
16
16
|
|
17
|
-
Style/MultilineOperationIndentation:
|
18
|
-
EnforcedStyle: indented
|
19
|
-
|
20
17
|
Style/DotPosition:
|
21
18
|
EnforcedStyle: leading
|
22
19
|
|
@@ -27,6 +24,9 @@ Style/DotPosition:
|
|
27
24
|
Lint/BlockAlignment:
|
28
25
|
Enabled: false
|
29
26
|
|
27
|
+
Lint/FormatParameterMismatch:
|
28
|
+
Enabled: false
|
29
|
+
|
30
30
|
# Offense count: 1
|
31
31
|
Lint/HandleExceptions:
|
32
32
|
Enabled: false
|
@@ -93,10 +93,16 @@ Metrics/ParameterLists:
|
|
93
93
|
Metrics/PerceivedComplexity:
|
94
94
|
Max: 41
|
95
95
|
|
96
|
+
Performance/StringReplacement:
|
97
|
+
Enabled: false
|
98
|
+
|
96
99
|
# Offense count: 4
|
97
100
|
Style/AccessorMethodName:
|
98
101
|
Enabled: false
|
99
102
|
|
103
|
+
Style/AlignArray:
|
104
|
+
Enabled: false
|
105
|
+
|
100
106
|
# Offense count: 3
|
101
107
|
# Cop supports --auto-correct.
|
102
108
|
# Configuration parameters: EnforcedStyle, SupportedStyles.
|
@@ -126,6 +132,9 @@ Style/ClassAndModuleChildren:
|
|
126
132
|
Style/ClosingParenthesisIndentation:
|
127
133
|
Enabled: false
|
128
134
|
|
135
|
+
Style/CollectionMethods:
|
136
|
+
Enabled: false
|
137
|
+
|
129
138
|
# Offense count: 5
|
130
139
|
# Cop supports --auto-correct.
|
131
140
|
Style/CommentIndentation:
|
@@ -139,6 +148,12 @@ Style/ConstantName:
|
|
139
148
|
Style/Documentation:
|
140
149
|
Enabled: false
|
141
150
|
|
151
|
+
Style/EmptyLinesAroundBlockBody:
|
152
|
+
Enabled: false
|
153
|
+
|
154
|
+
Style/ExtraSpacing:
|
155
|
+
Enabled: false
|
156
|
+
|
142
157
|
# Offense count: 23
|
143
158
|
# Configuration parameters: Exclude.
|
144
159
|
Style/FileName:
|
@@ -165,6 +180,12 @@ Style/GuardClause:
|
|
165
180
|
Style/IfUnlessModifier:
|
166
181
|
Enabled: false
|
167
182
|
|
183
|
+
Style/IndentArray:
|
184
|
+
Enabled: false
|
185
|
+
|
186
|
+
Style/IndentationConsistency:
|
187
|
+
Enabled: false
|
188
|
+
|
168
189
|
# Offense count: 1049
|
169
190
|
# Cop supports --auto-correct.
|
170
191
|
# Configuration parameters: Width.
|
@@ -227,6 +248,9 @@ Style/PredicateName:
|
|
227
248
|
Style/RegexpLiteral:
|
228
249
|
Enabled: false
|
229
250
|
|
251
|
+
Style/RescueEnsureAlignment:
|
252
|
+
Enabled: false
|
253
|
+
|
230
254
|
# Offense count: 2
|
231
255
|
Style/RescueModifier:
|
232
256
|
Enabled: false
|
data/.travis.yml
CHANGED
@@ -3,10 +3,11 @@ language: ruby
|
|
3
3
|
os:
|
4
4
|
- linux
|
5
5
|
|
6
|
+
sudo: required
|
7
|
+
|
6
8
|
env:
|
7
9
|
# Currently successful release
|
8
10
|
- IMAGEMAGICK_VERSION=6.6.9-10
|
9
|
-
- IMAGEMAGICK_VERSION=6.6.9-10 STYLE_CHECKS=true
|
10
11
|
# Ubuntu's current stable release
|
11
12
|
- IMAGEMAGICK_VERSION=6.7.7-10
|
12
13
|
# Latest 6.7 release
|
@@ -30,8 +31,6 @@ rvm:
|
|
30
31
|
|
31
32
|
matrix:
|
32
33
|
exclude:
|
33
|
-
- rvm: 1.8
|
34
|
-
env: IMAGEMAGICK_VERSION=6.6.9-10 STYLE_CHECKS=true
|
35
34
|
- rvm: 1.8
|
36
35
|
env: IMAGEMAGICK_VERSION=6.7.9-10
|
37
36
|
- rvm: 1.8
|
@@ -53,12 +52,16 @@ matrix:
|
|
53
52
|
- rvm: 2.0
|
54
53
|
env: IMAGEMAGICK_VERSION=6.8.9-10 CONFIGURE_OPTIONS=--enable-hdri
|
55
54
|
allow_failures:
|
56
|
-
- rvm: 1.8
|
57
|
-
- rvm: 2.2
|
58
|
-
- env: IMAGEMAGICK_VERSION=6.6.9-10 STYLE_CHECKS=true
|
59
55
|
- env: IMAGEMAGICK_VERSION=6.7.7-10
|
60
56
|
- env: IMAGEMAGICK_VERSION=6.7.9-10
|
57
|
+
rvm: 2.1
|
58
|
+
- env: IMAGEMAGICK_VERSION=6.7.9-10
|
59
|
+
rvm: 2.2
|
60
|
+
- env: IMAGEMAGICK_VERSION=6.8.9-10
|
61
|
+
rvm: 2.1
|
61
62
|
- env: IMAGEMAGICK_VERSION=6.8.9-10 CONFIGURE_OPTIONS=--enable-hdri
|
63
|
+
rvm: 2.1
|
64
|
+
- env: IMAGEMAGICK_VERSION=latest
|
62
65
|
|
63
66
|
notifications:
|
64
67
|
webhooks:
|
data/CHANGELOG.md
CHANGED
@@ -3,6 +3,10 @@
|
|
3
3
|
All notable changes to this project are documented in this file.
|
4
4
|
This project adheres to [Semantic Versioning](http://semver.org/).
|
5
5
|
|
6
|
+
## RMagick 2.15.4
|
7
|
+
|
8
|
+
- Improved C extension building process - @u338steven
|
9
|
+
|
6
10
|
## RMagick 2.15.3
|
7
11
|
|
8
12
|
- Fixed ImageMagick version detection on Windows - @maisumakun
|
data/CONTRIBUTING.md
CHANGED
@@ -37,4 +37,14 @@ You are also welcome to convert existing Test/Unit tests to RSpec.
|
|
37
37
|
Committing
|
38
38
|
----------
|
39
39
|
|
40
|
+
All work for a next release is done in the `develop` branch. Please create your branch off of it.
|
41
|
+
|
40
42
|
It is better if you follow [Git Style Guide](https://github.com/agis-/git-style-guide).
|
43
|
+
|
44
|
+
|
45
|
+
Pull Requests
|
46
|
+
-------------
|
47
|
+
|
48
|
+
Please choose the `rmagick/rmagick` repo and the `develop` branch as the destination for your pull request.
|
49
|
+
|
50
|
+
NOTE: GitHub suggests `rmagick-temp/rmagick` repo by default. **This is incorrect.** Please switch to `rmagick/rmagick`. It should be the next repo in the drop-down list.
|
data/README.textile
CHANGED
@@ -32,6 +32,10 @@ Ruby must be able to build C-Extensions (e.g. MRI, Rubinius, not JRuby)
|
|
32
32
|
|
33
33
|
*ImageMagick* Version 6.4.9 or later. You can get ImageMagick from "www.imagemagick.org":http://www.imagemagick.org.
|
34
34
|
|
35
|
+
On Ubuntu, you can run:
|
36
|
+
|
37
|
+
bc. sudo apt-get install libmagickwand-dev
|
38
|
+
|
35
39
|
h2(#install). Installing RMagick
|
36
40
|
|
37
41
|
h4. Installing via Bundler
|
data/before_install_linux.sh
CHANGED
@@ -5,13 +5,13 @@ sudo apt-get install -y build-essential libx11-dev libxext-dev zlib1g-dev libpng
|
|
5
5
|
sudo apt-get build-dep -y imagemagick
|
6
6
|
case $IMAGEMAGICK_VERSION in
|
7
7
|
latest)
|
8
|
-
wget http://www.imagemagick.org/download/ImageMagick.tar.
|
9
|
-
tar -
|
8
|
+
wget http://www.imagemagick.org/download/ImageMagick.tar.xz
|
9
|
+
tar -xf ImageMagick.tar.xz
|
10
10
|
cd ImageMagick-*
|
11
11
|
;;
|
12
12
|
*)
|
13
|
-
wget http://www.imagemagick.org/download/releases/ImageMagick-${IMAGEMAGICK_VERSION}.tar.
|
14
|
-
tar -
|
13
|
+
wget http://www.imagemagick.org/download/releases/ImageMagick-${IMAGEMAGICK_VERSION}.tar.xz
|
14
|
+
tar -xf ImageMagick-${IMAGEMAGICK_VERSION}.tar.xz
|
15
15
|
cd ImageMagick-${IMAGEMAGICK_VERSION}
|
16
16
|
;;
|
17
17
|
esac
|
data/doc/ex/gravity.rb
CHANGED
data/ext/RMagick/extconf.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
lib_dir = File.expand_path('../../lib', File.dirname(__FILE__))
|
2
2
|
$LOAD_PATH.unshift(lib_dir) unless $LOAD_PATH.include?(lib_dir)
|
3
|
+
require 'rubygems'
|
3
4
|
require 'mkmf'
|
4
5
|
require 'date'
|
5
6
|
|
@@ -60,10 +61,12 @@ module RMagick
|
|
60
61
|
$pkg_config = false
|
61
62
|
|
62
63
|
# Check for Magick-config
|
63
|
-
if find_executable('Magick-config')
|
64
|
+
if find_executable('Magick-config') && !has_graphicsmagick_libmagick_dev_compat?
|
64
65
|
$magick_config = true
|
66
|
+
$magick_version = `Magick-config --version`[/^(\d+\.\d+\.\d+)/]
|
65
67
|
elsif find_executable('pkg-config')
|
66
68
|
$pkg_config = true
|
69
|
+
$magick_version = `pkg-config MagickCore --modversion`[/^(\d+\.\d+\.\d+)/]
|
67
70
|
else
|
68
71
|
exit_failure "Can't install RMagick #{RMAGICK_VERS}. Can't find Magick-config or pkg-config in #{ENV['PATH']}\n"
|
69
72
|
end
|
@@ -74,15 +77,10 @@ module RMagick
|
|
74
77
|
# Ensure minimum ImageMagick version
|
75
78
|
# Check minimum ImageMagick version if possible
|
76
79
|
checking_for("outdated ImageMagick version (<= #{Magick::MIN_IM_VERSION})") do
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
Logging.message("Detected ImageMagick version: #{version}\n")
|
82
|
-
|
83
|
-
if Gem::Version.new(version) < Gem::Version.new(Magick::MIN_IM_VERSION)
|
84
|
-
exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
|
85
|
-
end
|
80
|
+
Logging.message("Detected ImageMagick version: #{$magick_version}\n")
|
81
|
+
|
82
|
+
if Gem::Version.new($magick_version) < Gem::Version.new(Magick::MIN_IM_VERSION)
|
83
|
+
exit_failure "Can't install RMagick #{RMAGICK_VERS}. You must have ImageMagick #{Magick::MIN_IM_VERSION} or later.\n"
|
86
84
|
end
|
87
85
|
end
|
88
86
|
|
@@ -109,25 +107,25 @@ module RMagick
|
|
109
107
|
|
110
108
|
elsif RUBY_PLATFORM =~ /mingw/ # mingw
|
111
109
|
|
112
|
-
`
|
110
|
+
`identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
|
113
111
|
abort 'Unable to get ImageMagick version' unless $1
|
114
112
|
$magick_version = $1
|
115
|
-
|
116
|
-
|
117
|
-
else
|
118
|
-
$LOCAL_LIBS = '-lCORE_RL_magick_ -lX11'
|
113
|
+
unless have_library('CORE_RL_magick_')
|
114
|
+
search_paths_for_library_for_mingw
|
119
115
|
end
|
116
|
+
have_library('X11')
|
120
117
|
|
121
118
|
else # mswin
|
122
119
|
|
123
|
-
`
|
120
|
+
`identify -version` =~ /Version: ImageMagick (\d+\.\d+\.\d+)-+\d+ /
|
124
121
|
abort 'Unable to get ImageMagick version' unless $1
|
125
122
|
$magick_version = $1
|
126
123
|
$CFLAGS = '-W3'
|
127
124
|
$CPPFLAGS = %Q{-I"C:\\Program Files\\Microsoft Platform SDK for Windows Server 2003 R2\\Include" -I"C:\\Program Files\\ImageMagick-#{$magick_version}-Q8\\include"}
|
128
125
|
# The /link option is required by the Makefile but causes warnings in the mkmf.log file.
|
129
126
|
$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"}
|
130
|
-
$LOCAL_LIBS = 'CORE_RL_magick_.lib
|
127
|
+
$LOCAL_LIBS = 'CORE_RL_magick_.lib'
|
128
|
+
have_library('X11')
|
131
129
|
|
132
130
|
end
|
133
131
|
end
|
@@ -156,6 +154,20 @@ SRC
|
|
156
154
|
end
|
157
155
|
end
|
158
156
|
|
157
|
+
def has_graphicsmagick_libmagick_dev_compat?
|
158
|
+
config_path = `which Magick-config`.chomp
|
159
|
+
if File.exist?(config_path) &&
|
160
|
+
File.symlink?(config_path) &&
|
161
|
+
File.readlink(config_path) =~ /GraphicsMagick/
|
162
|
+
msg = 'Found a graphicsmagick-libmagick-dev-compat installation.'
|
163
|
+
Logging.message msg
|
164
|
+
message msg+"\n"
|
165
|
+
true
|
166
|
+
else
|
167
|
+
false
|
168
|
+
end
|
169
|
+
end
|
170
|
+
|
159
171
|
def exit_failure(msg)
|
160
172
|
Logging.message msg
|
161
173
|
message msg+"\n"
|
@@ -228,6 +240,37 @@ SRC
|
|
228
240
|
end
|
229
241
|
end
|
230
242
|
|
243
|
+
def search_paths_for_library_for_mingw
|
244
|
+
msg = 'searching PATH for the ImageMagick library...'
|
245
|
+
Logging.message msg
|
246
|
+
message msg+"\n"
|
247
|
+
|
248
|
+
found_lib = false
|
249
|
+
|
250
|
+
paths = ENV['PATH'].split(File::PATH_SEPARATOR)
|
251
|
+
paths.each do |dir|
|
252
|
+
lib = File.join(dir, 'lib')
|
253
|
+
lib_file = File.join(lib, 'CORE_RL_magick_.lib')
|
254
|
+
if File.exist?(lib_file)
|
255
|
+
$CPPFLAGS = %Q{-I"#{File.join(dir, 'include')}"}
|
256
|
+
$LDFLAGS = %Q{-L"#{lib}"}
|
257
|
+
found_lib = have_library('CORE_RL_magick_')
|
258
|
+
break if found_lib
|
259
|
+
end
|
260
|
+
end
|
261
|
+
|
262
|
+
unless found_lib
|
263
|
+
exit_failure <<END_MINGW
|
264
|
+
Can't install RMagick #{RMAGICK_VERS}.
|
265
|
+
Can't find the ImageMagick library.
|
266
|
+
Retry with '--with-opt-dir' option.
|
267
|
+
Usage: gem install rmagick -- '--with-opt-dir=\"[path to ImageMagick]\"'
|
268
|
+
e.g.
|
269
|
+
gem install rmagick -- '--with-opt-dir=\"C:\Program Files\ImageMagick-6.9.1-Q16\"'
|
270
|
+
END_MINGW
|
271
|
+
end
|
272
|
+
end
|
273
|
+
|
231
274
|
def assert_can_compile!
|
232
275
|
assert_not_windows!
|
233
276
|
assert_minimum_ruby_version!
|
data/lib/rmagick/version.rb
CHANGED
data/lib/rvg/clippath.rb
CHANGED
@@ -3,42 +3,43 @@
|
|
3
3
|
# Copyright (C) 2009 Timothy P. Hunter
|
4
4
|
#++
|
5
5
|
module Magick
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
6
|
+
class RVG
|
7
|
+
class ClipPath
|
8
|
+
include ShapeConstructors
|
9
|
+
include UseConstructors
|
10
|
+
include TextConstructors
|
11
|
+
include Describable
|
12
|
+
include Stylable
|
13
|
+
include Duplicatable
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
@clip_path_units = clip_path_units
|
30
|
-
@content = Content.new
|
31
|
-
yield(self) if block_given?
|
32
|
-
end
|
15
|
+
# Create a clipping path. Within the block create an outline
|
16
|
+
# from one or more paths, basic shapes, text objects, or +use+.
|
17
|
+
# Everything drawn within the outline will be displayed.
|
18
|
+
# Anything drawn outside the outline will not.
|
19
|
+
#
|
20
|
+
# If the clipping path contains a +use+, it
|
21
|
+
# must directly reference path, basic shape, or text objects.
|
22
|
+
#
|
23
|
+
# Attach the clipping path to an object with the :clip_path style.
|
24
|
+
def initialize(clip_path_units = 'userSpaceOnUse')
|
25
|
+
super()
|
26
|
+
unless ['userSpaceOnUse', 'objectBoundingBox'].include?(clip_path_units)
|
27
|
+
fail ArgumentError, "undefined value for clip path units: #{clip_path_units}"
|
28
|
+
end
|
33
29
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
30
|
+
@clip_path_units = clip_path_units
|
31
|
+
@content = Content.new
|
32
|
+
yield(self) if block_given?
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_primitives(gc, style) #:nodoc:
|
36
|
+
name = __id__.to_s
|
37
|
+
gc.define_clip_path(name) do
|
38
|
+
gc.clip_units(@clip_path_units)
|
39
|
+
@content.each { |element| element.add_primitives(gc) }
|
40
|
+
end
|
41
|
+
gc.clip_path(name)
|
42
|
+
end
|
43
|
+
end # class ClipPath
|
44
|
+
end # class RVG
|
44
45
|
end # module Magick
|
data/lib/rvg/container.rb
CHANGED
@@ -2,122 +2,121 @@
|
|
2
2
|
# $Id: container.rb,v 1.5 2009/02/28 23:52:13 rmagick Exp $
|
3
3
|
# Copyright (C) 2009 Timothy P. Hunter
|
4
4
|
#++
|
5
|
-
|
6
5
|
module Magick
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
end
|
27
|
-
end
|
28
|
-
copy.freeze if frozen?
|
29
|
-
h[me] = copy
|
30
|
-
end
|
31
|
-
copy
|
6
|
+
class RVG
|
7
|
+
# Content is simply an Array with a deep_copy method.
|
8
|
+
# When unit-testing, it also has a deep_equal method.
|
9
|
+
class Content < Array #:nodoc:
|
10
|
+
def deep_copy(h = {})
|
11
|
+
me = __id__
|
12
|
+
copy = h[me]
|
13
|
+
unless copy
|
14
|
+
copy = self.class.new
|
15
|
+
each do |c|
|
16
|
+
copy << case
|
17
|
+
when c.nil?
|
18
|
+
nil
|
19
|
+
when c.respond_to?(:deep_copy)
|
20
|
+
c.deep_copy(h)
|
21
|
+
when c.respond_to?(:dup)
|
22
|
+
c.dup rescue c
|
23
|
+
else
|
24
|
+
c
|
32
25
|
end
|
33
|
-
|
26
|
+
end
|
27
|
+
copy.freeze if frozen?
|
28
|
+
h[me] = copy
|
29
|
+
end
|
30
|
+
copy
|
31
|
+
end
|
32
|
+
end # class Content
|
34
33
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
34
|
+
# Define a collection of shapes, text, etc. that can be reused.
|
35
|
+
# Group objects are _containers_. That is, styles and transforms defined
|
36
|
+
# on the group are used by contained objects such as shapes, text, and
|
37
|
+
# nested groups unless overridden by a nested container or the object itself.
|
38
|
+
# Groups can be reused with the RVG::UseConstructors#use method.
|
39
|
+
# Create groups within
|
40
|
+
# containers with the RVG::StructureConstructors#g method.
|
41
|
+
#
|
42
|
+
# Example:
|
43
|
+
# # All elements in the group will be translated by 50 in the
|
44
|
+
# # x-direction and 10 in the y-direction.
|
45
|
+
# rvg.g.translate(50, 10).styles(:stroke=>'red',:fill=>'none') do |grp|
|
46
|
+
# # The line will be red.
|
47
|
+
# grp.line(10,10, 20,20)
|
48
|
+
# # The circle will be blue.
|
49
|
+
# grp.circle(10, 20, 20).styles(:stroke=>'blue')
|
50
|
+
# end
|
51
|
+
class Group
|
52
|
+
include Stylable
|
53
|
+
include Transformable
|
54
|
+
include Embellishable
|
55
|
+
include Describable
|
56
|
+
include Duplicatable
|
58
57
|
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
58
|
+
def initialize
|
59
|
+
super
|
60
|
+
@content = Content.new
|
61
|
+
yield(self) if block_given?
|
62
|
+
end
|
64
63
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
64
|
+
def add_primitives(gc) #:nodoc:
|
65
|
+
gc.push
|
66
|
+
add_transform_primitives(gc)
|
67
|
+
add_style_primitives(gc)
|
68
|
+
@content.each { |element| element.add_primitives(gc) }
|
69
|
+
gc.pop
|
70
|
+
end
|
72
71
|
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
72
|
+
# Translate container according to #use arguments
|
73
|
+
def ref(x, y, width, height) #:nodoc:
|
74
|
+
translate(x, y) if x != 0 || y != 0
|
75
|
+
end
|
77
76
|
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
77
|
+
# Append an arbitrary object to the group's content. Called
|
78
|
+
# by #use to insert a non-container object into a group.
|
79
|
+
def <<(obj) #:nodoc:
|
80
|
+
@content << obj
|
81
|
+
end
|
82
|
+
end # class Group
|
84
83
|
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
84
|
+
# A Use object allows the re-use of RVG and RVG::Group
|
85
|
+
# objects within a container. Create a Use object with the
|
86
|
+
# RVG::UseConstructors#use method.
|
87
|
+
class Use
|
88
|
+
include Stylable
|
89
|
+
include Transformable
|
90
|
+
include Duplicatable
|
92
91
|
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
92
|
+
# In a container, Use objects are created indirectly via the
|
93
|
+
# RVG::UseConstructors#use method.
|
94
|
+
# The +x+ and +y+ arguments
|
95
|
+
# can be used to specify an additional translation for
|
96
|
+
# the group. The +width+ and +height+ arguments specify
|
97
|
+
# a width and height for referenced RVG objects.
|
98
|
+
def initialize(element, x = 0, y = 0, width = nil, height = nil)
|
99
|
+
super()
|
101
100
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
101
|
+
# If the element is not a group, defs, symbol, or rvg,
|
102
|
+
# wrap a group around it so it can get a transform and
|
103
|
+
# possibly a new viewport.
|
104
|
+
if !element.respond_to?(:ref)
|
105
|
+
@element = Group.new
|
106
|
+
@element << element.deep_copy
|
107
|
+
else
|
108
|
+
@element = element.deep_copy
|
109
|
+
end
|
110
|
+
@element.ref(x, y, width, height)
|
111
|
+
end
|
113
112
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
113
|
+
def add_primitives(gc) #:nodoc:
|
114
|
+
gc.push
|
115
|
+
add_transform_primitives(gc)
|
116
|
+
add_style_primitives(gc)
|
117
|
+
@element.add_primitives(gc)
|
118
|
+
gc.pop
|
119
|
+
end
|
120
|
+
end # class Use
|
121
|
+
end # class RVG
|
123
122
|
end # module Magick
|