rmagick 5.4.4 → 6.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.devcontainer/ImageMagick6/devcontainer.json +1 -1
- data/.devcontainer/devcontainer.json +1 -1
- data/.github/workflows/ci.yml +41 -31
- data/.gitignore +1 -0
- data/.rubocop.yml +36 -9
- data/.rubocop_todo.yml +369 -187
- data/CHANGELOG.md +77 -0
- data/Gemfile +14 -0
- data/README.md +3 -3
- data/Rakefile +12 -1
- data/before_install_linux.sh +1 -11
- data/before_install_osx.sh +5 -7
- data/ext/RMagick/extconf.rb +58 -68
- data/ext/RMagick/rmagick.h +7 -12
- data/ext/RMagick/rmdraw.cpp +10 -20
- data/ext/RMagick/rmfill.cpp +4 -4
- data/ext/RMagick/rmilist.cpp +10 -2
- data/ext/RMagick/rmimage.cpp +342 -344
- data/ext/RMagick/rminfo.cpp +22 -21
- data/ext/RMagick/rmkinfo.cpp +5 -18
- data/ext/RMagick/rmmain.cpp +42 -91
- data/ext/RMagick/rmmontage.cpp +5 -5
- data/ext/RMagick/rmpixel.cpp +3 -3
- data/ext/RMagick/rmutil.cpp +58 -89
- data/lib/rmagick/version.rb +3 -3
- data/lib/rmagick.rb +1 -1
- data/lib/rmagick_internal.rb +111 -103
- data/lib/rvg/container.rb +3 -3
- data/lib/rvg/embellishable.rb +7 -3
- data/lib/rvg/misc.rb +15 -15
- data/lib/rvg/rvg.rb +6 -6
- data/lib/rvg/stretchable.rb +2 -2
- data/lib/rvg/stylable.rb +2 -2
- data/lib/rvg/transformable.rb +1 -1
- data/lib/rvg/units.rb +1 -0
- data/rmagick.gemspec +2 -15
- data/sig/rmagick/_draw_common_methods.rbs +64 -0
- data/sig/rmagick/_image_common_methods.rbs +387 -0
- data/sig/rmagick/draw.rbs +38 -0
- data/sig/rmagick/draw_attribute.rbs +28 -0
- data/sig/rmagick/enum.rbs +820 -0
- data/sig/rmagick/error.rbs +11 -0
- data/sig/rmagick/fill.rbs +21 -0
- data/sig/rmagick/geometry.rbs +14 -0
- data/sig/rmagick/image.rbs +196 -0
- data/sig/rmagick/image_list.rbs +183 -0
- data/sig/rmagick/iptc.rbs +101 -0
- data/sig/rmagick/kernel_info.rbs +12 -0
- data/sig/rmagick/optional_method_arguments.rbs +10 -0
- data/sig/rmagick/pixel.rbs +46 -0
- data/sig/rmagick/struct.rbs +90 -0
- data/sig/rmagick.rbs +43 -0
- data/sig/rvg/clippath.rbs +34 -0
- data/sig/rvg/container.rbs +78 -0
- data/sig/rvg/deep_equal.rbs +48 -0
- data/sig/rvg/describable.rbs +30 -0
- data/sig/rvg/embellishable.rbs +226 -0
- data/sig/rvg/misc.rbs +145 -0
- data/sig/rvg/paint.rbs +55 -0
- data/sig/rvg/pathdata.rbs +77 -0
- data/sig/rvg/rvg.rbs +125 -0
- data/sig/rvg/stretchable.rbs +56 -0
- data/sig/rvg/stylable.rbs +66 -0
- data/sig/rvg/text.rbs +118 -0
- data/sig/rvg/transformable.rbs +59 -0
- data/sig/rvg/units.rbs +33 -0
- metadata +38 -134
data/lib/rmagick_internal.rb
CHANGED
@@ -10,7 +10,7 @@
|
|
10
10
|
# to the classes.
|
11
11
|
#==============================================================================
|
12
12
|
|
13
|
-
if RUBY_PLATFORM
|
13
|
+
if RUBY_PLATFORM.match?(/mingw/i)
|
14
14
|
begin
|
15
15
|
require 'ruby_installer'
|
16
16
|
ENV['PATH'].split(File::PATH_SEPARATOR).grep(/ImageMagick/i).each do |path|
|
@@ -51,11 +51,11 @@ module Magick
|
|
51
51
|
# p Magick.formats
|
52
52
|
# => {"3FR"=>" r-+", "3G2"=>" r-+", "3GP"=>" r-+", "A"=>"*rw+",
|
53
53
|
# ...
|
54
|
-
def formats
|
54
|
+
def formats(&block)
|
55
55
|
formats = init_formats
|
56
56
|
|
57
|
-
if
|
58
|
-
formats.each
|
57
|
+
if block
|
58
|
+
formats.each(&block)
|
59
59
|
self
|
60
60
|
else
|
61
61
|
formats
|
@@ -140,7 +140,7 @@ module Magick
|
|
140
140
|
|
141
141
|
# Convert object to a geometry string
|
142
142
|
def to_s
|
143
|
-
str =
|
143
|
+
str = +''
|
144
144
|
if @width > 0
|
145
145
|
fmt = @width.truncate == @width ? '%d' : '%.2f'
|
146
146
|
str << sprintf(fmt, @width)
|
@@ -226,18 +226,29 @@ module Magick
|
|
226
226
|
private
|
227
227
|
|
228
228
|
def enquote(str)
|
229
|
-
|
229
|
+
str = to_string(str)
|
230
|
+
if str.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(str)
|
230
231
|
str
|
231
232
|
else
|
232
233
|
'"' + str + '"'
|
233
234
|
end
|
234
235
|
end
|
235
236
|
|
236
|
-
def
|
237
|
-
return if opacity.is_a?(String) && opacity
|
237
|
+
def to_opacity(opacity)
|
238
|
+
return opacity if opacity.is_a?(String) && opacity.end_with?('%')
|
238
239
|
|
239
240
|
value = Float(opacity)
|
240
241
|
Kernel.raise ArgumentError, 'opacity must be >= 0 and <= 1.0' if value < 0 || value > 1.0
|
242
|
+
|
243
|
+
value
|
244
|
+
end
|
245
|
+
|
246
|
+
def to_string(obj)
|
247
|
+
return obj if obj.is_a?(String)
|
248
|
+
return obj.to_s if obj.is_a?(Symbol)
|
249
|
+
return obj.to_str if obj.respond_to?(:to_str)
|
250
|
+
|
251
|
+
Kernel.raise TypeError, "no implicit conversion of #{obj.class} into String"
|
241
252
|
end
|
242
253
|
|
243
254
|
public
|
@@ -266,7 +277,7 @@ module Magick
|
|
266
277
|
|
267
278
|
# Draw a bezier curve.
|
268
279
|
def bezier(*points)
|
269
|
-
if points.
|
280
|
+
if points.empty?
|
270
281
|
Kernel.raise ArgumentError, 'no points specified'
|
271
282
|
elsif points.length.odd?
|
272
283
|
Kernel.raise ArgumentError, 'odd number of arguments specified'
|
@@ -281,17 +292,19 @@ module Magick
|
|
281
292
|
|
282
293
|
# Invoke a clip-path defined by def_clip_path.
|
283
294
|
def clip_path(name)
|
284
|
-
primitive "clip-path #{name}"
|
295
|
+
primitive "clip-path #{to_string(name)}"
|
285
296
|
end
|
286
297
|
|
287
298
|
# Define the clipping rule.
|
288
299
|
def clip_rule(rule)
|
300
|
+
rule = to_string(rule)
|
289
301
|
Kernel.raise ArgumentError, "Unknown clipping rule #{rule}" unless %w[evenodd nonzero].include?(rule.downcase)
|
290
302
|
primitive "clip-rule #{rule}"
|
291
303
|
end
|
292
304
|
|
293
305
|
# Define the clip units
|
294
306
|
def clip_units(unit)
|
307
|
+
unit = to_string(unit)
|
295
308
|
Kernel.raise ArgumentError, "Unknown clip unit #{unit}" unless %w[userspace userspaceonuse objectboundingbox].include?(unit.downcase)
|
296
309
|
primitive "clip-units #{unit}"
|
297
310
|
end
|
@@ -320,7 +333,7 @@ module Magick
|
|
320
333
|
# (pop) graphic-context".
|
321
334
|
def define_clip_path(name)
|
322
335
|
push('defs')
|
323
|
-
push("clip-path
|
336
|
+
push("clip-path #{enquote(name)}")
|
324
337
|
push('graphic-context')
|
325
338
|
yield
|
326
339
|
ensure
|
@@ -340,7 +353,7 @@ module Magick
|
|
340
353
|
# Let anything through, but the only defined argument
|
341
354
|
# is "UTF-8". All others are apparently ignored.
|
342
355
|
def encoding(encoding)
|
343
|
-
primitive "encoding #{encoding}"
|
356
|
+
primitive "encoding #{to_string(encoding)}"
|
344
357
|
end
|
345
358
|
|
346
359
|
# Specify object fill, a color name or pattern name
|
@@ -352,22 +365,23 @@ module Magick
|
|
352
365
|
|
353
366
|
# Specify fill opacity (use "xx%" to indicate percentage)
|
354
367
|
def fill_opacity(opacity)
|
355
|
-
|
368
|
+
opacity = to_opacity(opacity)
|
356
369
|
primitive "fill-opacity #{opacity}"
|
357
370
|
end
|
358
371
|
|
359
372
|
def fill_rule(rule)
|
373
|
+
rule = to_string(rule)
|
360
374
|
Kernel.raise ArgumentError, "Unknown fill rule #{rule}" unless %w[evenodd nonzero].include?(rule.downcase)
|
361
375
|
primitive "fill-rule #{rule}"
|
362
376
|
end
|
363
377
|
|
364
378
|
# Specify text drawing font
|
365
379
|
def font(name)
|
366
|
-
primitive "font
|
380
|
+
primitive "font #{enquote(name)}"
|
367
381
|
end
|
368
382
|
|
369
383
|
def font_family(name)
|
370
|
-
primitive "font-family
|
384
|
+
primitive "font-family #{enquote(name)}"
|
371
385
|
end
|
372
386
|
|
373
387
|
def font_stretch(stretch)
|
@@ -405,38 +419,17 @@ module Magick
|
|
405
419
|
|
406
420
|
# IM 6.5.5-8 and later
|
407
421
|
def interline_spacing(space)
|
408
|
-
|
409
|
-
Float(space)
|
410
|
-
rescue ArgumentError
|
411
|
-
Kernel.raise ArgumentError, 'invalid value for interline_spacing'
|
412
|
-
rescue TypeError
|
413
|
-
Kernel.raise TypeError, "can't convert #{space.class} into Float"
|
414
|
-
end
|
415
|
-
primitive "interline-spacing #{space}"
|
422
|
+
primitive "interline-spacing #{Float(space)}"
|
416
423
|
end
|
417
424
|
|
418
425
|
# IM 6.4.8-3 and later
|
419
426
|
def interword_spacing(space)
|
420
|
-
|
421
|
-
Float(space)
|
422
|
-
rescue ArgumentError
|
423
|
-
Kernel.raise ArgumentError, 'invalid value for interword_spacing'
|
424
|
-
rescue TypeError
|
425
|
-
Kernel.raise TypeError, "can't convert #{space.class} into Float"
|
426
|
-
end
|
427
|
-
primitive "interword-spacing #{space}"
|
427
|
+
primitive "interword-spacing #{Float(space)}"
|
428
428
|
end
|
429
429
|
|
430
430
|
# IM 6.4.8-3 and later
|
431
431
|
def kerning(space)
|
432
|
-
|
433
|
-
Float(space)
|
434
|
-
rescue ArgumentError
|
435
|
-
Kernel.raise ArgumentError, 'invalid value for kerning'
|
436
|
-
rescue TypeError
|
437
|
-
Kernel.raise TypeError, "can't convert #{space.class} into Float"
|
438
|
-
end
|
439
|
-
primitive "kerning #{space}"
|
432
|
+
primitive "kerning #{Float(space)}"
|
440
433
|
end
|
441
434
|
|
442
435
|
# Draw a line
|
@@ -447,7 +440,7 @@ module Magick
|
|
447
440
|
# Specify drawing fill and stroke opacities. If the value is a string
|
448
441
|
# ending with a %, the number will be multiplied by 0.01.
|
449
442
|
def opacity(opacity)
|
450
|
-
|
443
|
+
opacity = to_opacity(opacity)
|
451
444
|
primitive "opacity #{opacity}"
|
452
445
|
end
|
453
446
|
|
@@ -455,7 +448,7 @@ module Magick
|
|
455
448
|
# primitive requires that the commands be surrounded by quotes or
|
456
449
|
# apostrophes. Here we simply use apostrophes.
|
457
450
|
def path(cmds)
|
458
|
-
primitive "path
|
451
|
+
primitive "path #{enquote(cmds)}"
|
459
452
|
end
|
460
453
|
|
461
454
|
# Define a pattern. In the block, call primitive methods to
|
@@ -463,7 +456,7 @@ module Magick
|
|
463
456
|
# as the argument to the 'fill' or 'stroke' methods
|
464
457
|
def pattern(name, x, y, width, height)
|
465
458
|
push('defs')
|
466
|
-
push("pattern #{name} " + sprintf('%g %g %g %g', x, y, width, height))
|
459
|
+
push("pattern #{to_string(name)} " + sprintf('%g %g %g %g', x, y, width, height))
|
467
460
|
push('graphic-context')
|
468
461
|
yield
|
469
462
|
ensure
|
@@ -486,7 +479,7 @@ module Magick
|
|
486
479
|
|
487
480
|
# Draw a polygon
|
488
481
|
def polygon(*points)
|
489
|
-
if points.
|
482
|
+
if points.empty?
|
490
483
|
Kernel.raise ArgumentError, 'no points specified'
|
491
484
|
elsif points.length.odd?
|
492
485
|
Kernel.raise ArgumentError, 'odd number of points specified'
|
@@ -496,7 +489,7 @@ module Magick
|
|
496
489
|
|
497
490
|
# Draw a polyline
|
498
491
|
def polyline(*points)
|
499
|
-
if points.
|
492
|
+
if points.empty?
|
500
493
|
Kernel.raise ArgumentError, 'no points specified'
|
501
494
|
elsif points.length.odd?
|
502
495
|
Kernel.raise ArgumentError, 'odd number of points specified'
|
@@ -511,11 +504,10 @@ module Magick
|
|
511
504
|
# pop('pattern')
|
512
505
|
|
513
506
|
def pop(*what)
|
514
|
-
if what.
|
507
|
+
if what.empty?
|
515
508
|
primitive 'pop graphic-context'
|
516
509
|
else
|
517
|
-
|
518
|
-
primitive 'pop ' + what.map(&:to_s).join(' ')
|
510
|
+
primitive 'pop ' + what.map { |x| to_string(x) }.join(' ')
|
519
511
|
end
|
520
512
|
end
|
521
513
|
|
@@ -525,11 +517,10 @@ module Magick
|
|
525
517
|
# push('gradient')
|
526
518
|
# push('pattern')
|
527
519
|
def push(*what)
|
528
|
-
if what.
|
520
|
+
if what.empty?
|
529
521
|
primitive 'push graphic-context'
|
530
522
|
else
|
531
|
-
|
532
|
-
primitive 'push ' + what.map(&:to_s).join(' ')
|
523
|
+
primitive 'push ' + what.map { |x| to_string(x) }.join(' ')
|
533
524
|
end
|
534
525
|
end
|
535
526
|
|
@@ -582,10 +573,10 @@ module Magick
|
|
582
573
|
|
583
574
|
# Specify a stroke dash pattern
|
584
575
|
def stroke_dasharray(*list)
|
585
|
-
if list.
|
576
|
+
if list.empty?
|
586
577
|
primitive 'stroke-dasharray none'
|
587
578
|
else
|
588
|
-
list.each do |x|
|
579
|
+
list.map! { |x| Float(x) }.each do |x|
|
589
580
|
Kernel.raise ArgumentError, "dash array elements must be > 0 (#{x} given)" if x <= 0
|
590
581
|
end
|
591
582
|
primitive "stroke-dasharray #{list.join(',')}"
|
@@ -598,16 +589,19 @@ module Magick
|
|
598
589
|
end
|
599
590
|
|
600
591
|
def stroke_linecap(value)
|
592
|
+
value = to_string(value)
|
601
593
|
Kernel.raise ArgumentError, "Unknown linecap type: #{value}" unless %w[butt round square].include?(value.downcase)
|
602
594
|
primitive "stroke-linecap #{value}"
|
603
595
|
end
|
604
596
|
|
605
597
|
def stroke_linejoin(value)
|
598
|
+
value = to_string(value)
|
606
599
|
Kernel.raise ArgumentError, "Unknown linejoin type: #{value}" unless %w[round miter bevel].include?(value.downcase)
|
607
600
|
primitive "stroke-linejoin #{value}"
|
608
601
|
end
|
609
602
|
|
610
603
|
def stroke_miterlimit(value)
|
604
|
+
value = Float(value)
|
611
605
|
Kernel.raise ArgumentError, 'miterlimit must be >= 1' if value < 1
|
612
606
|
primitive "stroke-miterlimit #{value}"
|
613
607
|
end
|
@@ -615,7 +609,7 @@ module Magick
|
|
615
609
|
# Specify opacity of stroke drawing color
|
616
610
|
# (use "xx%" to indicate percentage)
|
617
611
|
def stroke_opacity(opacity)
|
618
|
-
|
612
|
+
opacity = to_opacity(opacity)
|
619
613
|
primitive "stroke-opacity #{opacity}"
|
620
614
|
end
|
621
615
|
|
@@ -626,8 +620,9 @@ module Magick
|
|
626
620
|
|
627
621
|
# Draw text at position x,y. Add quotes to text that is not already quoted.
|
628
622
|
def text(x, y, text)
|
629
|
-
|
630
|
-
|
623
|
+
text = to_string(text)
|
624
|
+
Kernel.raise ArgumentError, 'missing text argument' if text.empty?
|
625
|
+
if text.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(text)
|
631
626
|
# text already quoted
|
632
627
|
elsif !text['\'']
|
633
628
|
text = '\'' + text + '\''
|
@@ -674,6 +669,7 @@ module Magick
|
|
674
669
|
|
675
670
|
# Define IPTC record number:dataset tags for use with Image#get_iptc_dataset
|
676
671
|
module IPTC
|
672
|
+
# rubocop:disable Naming/ConstantName
|
677
673
|
module Envelope
|
678
674
|
Model_Version = '1:00'
|
679
675
|
Destination = '1:05'
|
@@ -771,6 +767,7 @@ module Magick
|
|
771
767
|
module Post_ObjectData_Descriptor
|
772
768
|
Confirmed_ObjectData_Size = '9:10'
|
773
769
|
end
|
770
|
+
# rubocop:enable Naming/ConstantName
|
774
771
|
end # module Magick::IPTC
|
775
772
|
|
776
773
|
# Ruby-level Magick::Image methods
|
@@ -842,9 +839,9 @@ module Magick
|
|
842
839
|
# arrays.
|
843
840
|
def get_exif_by_entry(*entry)
|
844
841
|
ary = []
|
845
|
-
if entry.
|
842
|
+
if entry.empty?
|
846
843
|
exif_data = self['EXIF:*']
|
847
|
-
exif_data
|
844
|
+
exif_data&.split("\n")&.each { |exif| ary.push(exif.split('=')) }
|
848
845
|
else
|
849
846
|
get_exif_by_entry # ensure properties is populated with exif data
|
850
847
|
entry.each do |name|
|
@@ -858,14 +855,12 @@ module Magick
|
|
858
855
|
# Retrieve EXIF data by tag number or all tag/value pairs. The return value is a hash.
|
859
856
|
def get_exif_by_number(*tag)
|
860
857
|
hash = {}
|
861
|
-
if tag.
|
858
|
+
if tag.empty?
|
862
859
|
exif_data = self['EXIF:!']
|
863
|
-
|
864
|
-
|
865
|
-
|
866
|
-
|
867
|
-
hash[tag] = value
|
868
|
-
end
|
860
|
+
exif_data&.split("\n")&.each do |exif|
|
861
|
+
tag, value = exif.split('=')
|
862
|
+
tag = tag[1, 4].hex
|
863
|
+
hash[tag] = value
|
869
864
|
end
|
870
865
|
else
|
871
866
|
get_exif_by_number # ensure properties is populated with exif data
|
@@ -1080,13 +1075,13 @@ module Magick
|
|
1080
1075
|
%i[red green blue opacity].each do |c|
|
1081
1076
|
module_eval <<-END_EVAL, __FILE__, __LINE__ + 1
|
1082
1077
|
def #{c}
|
1083
|
-
|
1078
|
+
return collect { |p| p.#{c} }
|
1084
1079
|
end
|
1085
1080
|
def #{c}=(v)
|
1086
|
-
|
1087
|
-
|
1088
|
-
|
1089
|
-
|
1081
|
+
each { |p| p.#{c} = v }
|
1082
|
+
changed
|
1083
|
+
notify_observers(self)
|
1084
|
+
v
|
1090
1085
|
end
|
1091
1086
|
END_EVAL
|
1092
1087
|
end
|
@@ -1293,10 +1288,10 @@ module Magick
|
|
1293
1288
|
# Allow scene to be set to nil
|
1294
1289
|
def scene=(n)
|
1295
1290
|
if n.nil?
|
1296
|
-
Kernel.raise IndexError, 'scene number out of bounds' unless @images.
|
1291
|
+
Kernel.raise IndexError, 'scene number out of bounds' unless @images.empty?
|
1297
1292
|
@scene = nil
|
1298
1293
|
return
|
1299
|
-
elsif @images.
|
1294
|
+
elsif @images.empty?
|
1300
1295
|
Kernel.raise IndexError, 'scene number out of bounds'
|
1301
1296
|
end
|
1302
1297
|
|
@@ -1310,17 +1305,11 @@ module Magick
|
|
1310
1305
|
%w[& + - |].each do |op|
|
1311
1306
|
module_eval <<-END_BINOPS, __FILE__, __LINE__ + 1
|
1312
1307
|
def #{op}(other)
|
1308
|
+
assert_image_array(other)
|
1313
1309
|
ilist = self.class.new
|
1314
|
-
|
1315
|
-
a = other #{op} @images
|
1316
|
-
rescue TypeError
|
1317
|
-
Kernel.raise ArgumentError, "Magick::ImageList expected, got " + other.class.to_s
|
1318
|
-
end
|
1310
|
+
a = other #{op} @images
|
1319
1311
|
current = get_current()
|
1320
|
-
a.each
|
1321
|
-
assert_image image
|
1322
|
-
ilist << image
|
1323
|
-
end
|
1312
|
+
a.each { |image| ilist << image }
|
1324
1313
|
ilist.set_current current
|
1325
1314
|
return ilist
|
1326
1315
|
end
|
@@ -1349,16 +1338,18 @@ module Magick
|
|
1349
1338
|
# return if A.scene != B.scene
|
1350
1339
|
# return A.length <=> B.length
|
1351
1340
|
def <=>(other)
|
1352
|
-
|
1341
|
+
return unless other.is_a? self.class
|
1342
|
+
|
1353
1343
|
size = [length, other.length].min
|
1354
1344
|
size.times do |x|
|
1355
1345
|
r = self[x] <=> other[x]
|
1356
1346
|
return r unless r.zero?
|
1357
1347
|
end
|
1348
|
+
|
1358
1349
|
return 0 if @scene.nil? && other.scene.nil?
|
1350
|
+
return if @scene.nil? && !other.scene.nil?
|
1351
|
+
return if !@scene.nil? && other.scene.nil?
|
1359
1352
|
|
1360
|
-
Kernel.raise TypeError, "cannot convert nil into #{other.scene.class}" if @scene.nil? && !other.scene.nil?
|
1361
|
-
Kernel.raise TypeError, "cannot convert nil into #{scene.class}" if !@scene.nil? && other.scene.nil?
|
1362
1353
|
r = scene <=> other.scene
|
1363
1354
|
return r unless r.zero?
|
1364
1355
|
|
@@ -1377,7 +1368,7 @@ module Magick
|
|
1377
1368
|
|
1378
1369
|
def []=(*args)
|
1379
1370
|
obj = @images.[]=(*args)
|
1380
|
-
if obj
|
1371
|
+
if obj.respond_to?(:each)
|
1381
1372
|
assert_image_array(obj)
|
1382
1373
|
set_current obj.last.__id__
|
1383
1374
|
elsif obj
|
@@ -1390,7 +1381,7 @@ module Magick
|
|
1390
1381
|
|
1391
1382
|
%i[
|
1392
1383
|
at each each_index empty? fetch
|
1393
|
-
first hash include? index length rindex
|
1384
|
+
first hash include? index length rindex
|
1394
1385
|
].each do |mth|
|
1395
1386
|
module_eval <<-END_SIMPLE_DELEGATES, __FILE__, __LINE__ + 1
|
1396
1387
|
def #{mth}(*args, &block)
|
@@ -1400,6 +1391,11 @@ module Magick
|
|
1400
1391
|
end
|
1401
1392
|
alias size length
|
1402
1393
|
|
1394
|
+
def sort!(*args, &block)
|
1395
|
+
@images.sort!(*args, &block)
|
1396
|
+
self
|
1397
|
+
end
|
1398
|
+
|
1403
1399
|
def clear
|
1404
1400
|
@scene = nil
|
1405
1401
|
@images.clear
|
@@ -1447,7 +1443,7 @@ module Magick
|
|
1447
1443
|
alias map! collect!
|
1448
1444
|
alias __map__! collect!
|
1449
1445
|
|
1450
|
-
#
|
1446
|
+
# ImageMagick used affinity in 6.4.3, switch to remap in 6.4.4.
|
1451
1447
|
alias affinity remap
|
1452
1448
|
|
1453
1449
|
def compact
|
@@ -1510,7 +1506,12 @@ module Magick
|
|
1510
1506
|
end
|
1511
1507
|
|
1512
1508
|
def eql?(other)
|
1513
|
-
|
1509
|
+
begin
|
1510
|
+
assert_image_array other
|
1511
|
+
rescue ArgumentError
|
1512
|
+
return false
|
1513
|
+
end
|
1514
|
+
|
1514
1515
|
eql = other.eql?(@images)
|
1515
1516
|
begin # "other" is another ImageList
|
1516
1517
|
eql &&= @scene == other.scene
|
@@ -1521,7 +1522,7 @@ module Magick
|
|
1521
1522
|
end
|
1522
1523
|
|
1523
1524
|
def fill(*args, &block)
|
1524
|
-
assert_image args[0] unless
|
1525
|
+
assert_image args[0] unless block
|
1525
1526
|
current = get_current
|
1526
1527
|
@images.fill(*args, &block)
|
1527
1528
|
assert_image_array self
|
@@ -1541,7 +1542,7 @@ module Magick
|
|
1541
1542
|
alias select find_all
|
1542
1543
|
|
1543
1544
|
def from_blob(*blobs, &block)
|
1544
|
-
Kernel.raise ArgumentError, 'no blobs given' if blobs.
|
1545
|
+
Kernel.raise ArgumentError, 'no blobs given' if blobs.empty?
|
1545
1546
|
blobs.each do |b|
|
1546
1547
|
Magick::Image.from_blob(b, &block).each { |n| @images << n }
|
1547
1548
|
end
|
@@ -1570,9 +1571,8 @@ module Magick
|
|
1570
1571
|
|
1571
1572
|
# Call inspect for all the images
|
1572
1573
|
def inspect
|
1573
|
-
img =
|
1574
|
-
|
1575
|
-
img = '[' + img.join(",\n") + "]\nscene=#{@scene}"
|
1574
|
+
img = @images.map(&:inspect)
|
1575
|
+
'[' + img.join(",\n") + "]\nscene=#{@scene}"
|
1576
1576
|
end
|
1577
1577
|
|
1578
1578
|
# Set the number of iterations of an animated GIF
|
@@ -1583,7 +1583,7 @@ module Magick
|
|
1583
1583
|
end
|
1584
1584
|
|
1585
1585
|
def last(*args)
|
1586
|
-
if args.
|
1586
|
+
if args.empty?
|
1587
1587
|
a = @images.last
|
1588
1588
|
else
|
1589
1589
|
a = @images.last(*args)
|
@@ -1614,7 +1614,9 @@ module Magick
|
|
1614
1614
|
# it up the line. Catch a NameError and emit a useful message.
|
1615
1615
|
def method_missing(meth_id, *args, &block)
|
1616
1616
|
if @scene
|
1617
|
-
@images[@scene]
|
1617
|
+
img = @images[@scene]
|
1618
|
+
new_img = img.public_send(meth_id, *args, &block)
|
1619
|
+
img.object_id == new_img.object_id ? self : new_img
|
1618
1620
|
else
|
1619
1621
|
super
|
1620
1622
|
end
|
@@ -1643,7 +1645,7 @@ module Magick
|
|
1643
1645
|
|
1644
1646
|
# Ping files and concatenate the new images
|
1645
1647
|
def ping(*files, &block)
|
1646
|
-
Kernel.raise ArgumentError, 'no files given' if files.
|
1648
|
+
Kernel.raise ArgumentError, 'no files given' if files.empty?
|
1647
1649
|
files.each do |f|
|
1648
1650
|
Magick::Image.ping(f, &block).each { |n| @images << n }
|
1649
1651
|
end
|
@@ -1669,7 +1671,7 @@ module Magick
|
|
1669
1671
|
|
1670
1672
|
# Read files and concatenate the new images
|
1671
1673
|
def read(*files, &block)
|
1672
|
-
Kernel.raise ArgumentError, 'no files given' if files.
|
1674
|
+
Kernel.raise ArgumentError, 'no files given' if files.empty?
|
1673
1675
|
files.each do |f|
|
1674
1676
|
Magick::Image.read(f, &block).each { |n| @images << n }
|
1675
1677
|
end
|
@@ -1732,8 +1734,8 @@ module Magick
|
|
1732
1734
|
self
|
1733
1735
|
end
|
1734
1736
|
|
1735
|
-
def reverse_each
|
1736
|
-
@images.reverse_each
|
1737
|
+
def reverse_each(&block)
|
1738
|
+
@images.reverse_each(&block)
|
1737
1739
|
self
|
1738
1740
|
end
|
1739
1741
|
|
@@ -1772,9 +1774,7 @@ module Magick
|
|
1772
1774
|
end
|
1773
1775
|
|
1774
1776
|
def to_a
|
1775
|
-
|
1776
|
-
@images.each { |image| a << image }
|
1777
|
-
a
|
1777
|
+
@images.map { |image| image }
|
1778
1778
|
end
|
1779
1779
|
|
1780
1780
|
def uniq
|
@@ -1801,7 +1801,6 @@ module Magick
|
|
1801
1801
|
end
|
1802
1802
|
|
1803
1803
|
def values_at(*args)
|
1804
|
-
a = @images.values_at(*args)
|
1805
1804
|
a = self.class.new
|
1806
1805
|
@images.values_at(*args).each { |image| a << image }
|
1807
1806
|
a.scene = a.length - 1
|
@@ -1809,6 +1808,15 @@ module Magick
|
|
1809
1808
|
end
|
1810
1809
|
alias indexes values_at
|
1811
1810
|
alias indices values_at
|
1811
|
+
|
1812
|
+
def destroy!
|
1813
|
+
@images.each(&:destroy!)
|
1814
|
+
self
|
1815
|
+
end
|
1816
|
+
|
1817
|
+
def destroyed?
|
1818
|
+
@images.all?(&:destroyed?)
|
1819
|
+
end
|
1812
1820
|
end # Magick::ImageList
|
1813
1821
|
|
1814
1822
|
class Pixel
|
@@ -1852,7 +1860,7 @@ module Magick
|
|
1852
1860
|
class HatchFill
|
1853
1861
|
def initialize(bgcolor, hatchcolor = 'white', dist = 10)
|
1854
1862
|
@bgcolor = bgcolor
|
1855
|
-
@hatchpixel = Pixel.from_color(hatchcolor)
|
1863
|
+
@hatchpixel = hatchcolor.is_a?(Pixel) ? hatchcolor : Pixel.from_color(hatchcolor)
|
1856
1864
|
@dist = dist
|
1857
1865
|
end
|
1858
1866
|
|
data/lib/rvg/container.rb
CHANGED
@@ -108,11 +108,11 @@ module Magick
|
|
108
108
|
# If the element is not a group, defs, symbol, or rvg,
|
109
109
|
# wrap a group around it so it can get a transform and
|
110
110
|
# possibly a new viewport.
|
111
|
-
if
|
111
|
+
if element.respond_to?(:ref)
|
112
|
+
@element = element.deep_copy
|
113
|
+
else
|
112
114
|
@element = Group.new
|
113
115
|
@element << element.deep_copy
|
114
|
-
else
|
115
|
-
@element = element.deep_copy
|
116
116
|
end
|
117
117
|
@element.ref(x, y, width, height)
|
118
118
|
end
|
data/lib/rvg/embellishable.rb
CHANGED
@@ -109,7 +109,7 @@ module Magick
|
|
109
109
|
short = n > 0 ? y_coords : x_coords
|
110
110
|
olen = short.length
|
111
111
|
n.abs.times { |x| short << short[x % olen] }
|
112
|
-
points = x_coords.zip(y_coords).flatten
|
112
|
+
points = x_coords.zip(y_coords).flatten!
|
113
113
|
end
|
114
114
|
n = points.length
|
115
115
|
raise ArgumentError, "insufficient/odd number of points specified: #{n}" if n < 4 || n.odd?
|
@@ -162,6 +162,8 @@ module Magick
|
|
162
162
|
(@width - @image.columns * scale) / 2.0
|
163
163
|
when /\AxMax/
|
164
164
|
@width - @image.columns * scale
|
165
|
+
else
|
166
|
+
0
|
165
167
|
end
|
166
168
|
|
167
169
|
ty = case @align
|
@@ -171,6 +173,8 @@ module Magick
|
|
171
173
|
(@height - @image.rows * scale) / 2.0
|
172
174
|
when /YMax\z/
|
173
175
|
@height - @image.rows * scale
|
176
|
+
else
|
177
|
+
0
|
174
178
|
end
|
175
179
|
[tx, ty]
|
176
180
|
end
|
@@ -182,7 +186,7 @@ module Magick
|
|
182
186
|
width = @width
|
183
187
|
height = @height
|
184
188
|
elsif @meet_or_slice == 'meet'
|
185
|
-
scale = [@width / @image.columns, @height / @image.rows].min
|
189
|
+
scale = [@width / @image.columns, @height / @image.rows].min || 1.0
|
186
190
|
width = @image.columns
|
187
191
|
height = @image.rows
|
188
192
|
else
|
@@ -193,7 +197,7 @@ module Magick
|
|
193
197
|
end
|
194
198
|
|
195
199
|
gc.clip_path(name)
|
196
|
-
scale = [@width / @image.columns, @height / @image.rows].max
|
200
|
+
scale = [@width / @image.columns, @height / @image.rows].max || 1.0
|
197
201
|
width = @image.columns
|
198
202
|
height = @image.rows
|
199
203
|
end
|