rmagick 5.5.0 → 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 +27 -32
- data/.rubocop.yml +36 -9
- data/.rubocop_todo.yml +363 -189
- data/CHANGELOG.md +34 -0
- data/Gemfile +9 -15
- data/README.md +3 -3
- data/Rakefile +1 -1
- data/before_install_linux.sh +1 -11
- data/before_install_osx.sh +5 -7
- data/ext/RMagick/extconf.rb +35 -63
- data/ext/RMagick/rmagick.h +4 -11
- data/ext/RMagick/rmdraw.cpp +0 -10
- data/ext/RMagick/rmimage.cpp +21 -50
- data/ext/RMagick/rmmain.cpp +12 -27
- data/ext/RMagick/rmpixel.cpp +2 -2
- data/ext/RMagick/rmutil.cpp +27 -18
- data/lib/rmagick/version.rb +3 -3
- data/lib/rmagick.rb +1 -1
- data/lib/rmagick_internal.rb +45 -39
- data/lib/rvg/container.rb +3 -3
- data/lib/rvg/embellishable.rb +1 -1
- data/lib/rvg/misc.rb +9 -9
- data/lib/rvg/rvg.rb +4 -6
- data/lib/rvg/stylable.rb +2 -2
- data/lib/rvg/units.rb +1 -0
- data/rmagick.gemspec +1 -2
- data/sig/rmagick/_image_common_methods.rbs +0 -2
- data/sig/rmagick/enum.rbs +6 -0
- data/sig/rmagick/image.rbs +2 -0
- data/sig/rmagick/image_list.rbs +2 -0
- metadata +10 -10
data/ext/RMagick/rmmain.cpp
CHANGED
@@ -14,7 +14,7 @@
|
|
14
14
|
#define MAIN // Define external variables
|
15
15
|
#include "rmagick.h"
|
16
16
|
|
17
|
-
#if defined(HAVE_SETMAGICKALIGNEDMEMORYMETHODS)
|
17
|
+
#if defined(HAVE_SETMAGICKALIGNEDMEMORYMETHODS)
|
18
18
|
#if defined(HAVE_POSIX_MEMALIGN) || defined(HAVE__ALIGNED_MSIZE)
|
19
19
|
#define USE_RM_ALIGNED_MALLOC 1
|
20
20
|
|
@@ -1019,10 +1019,8 @@ Init_RMagick2(void)
|
|
1019
1019
|
ENUMERATOR(ShapeAlphaChannel)
|
1020
1020
|
ENUMERATOR(TransparentAlphaChannel)
|
1021
1021
|
ENUMERATOR(BackgroundAlphaChannel)
|
1022
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1023
1022
|
ENUMERATOR(AssociateAlphaChannel)
|
1024
1023
|
ENUMERATOR(DisassociateAlphaChannel)
|
1025
|
-
#endif
|
1026
1024
|
#if defined(IMAGEMAGICK_7)
|
1027
1025
|
ENUMERATOR(OnAlphaChannel)
|
1028
1026
|
ENUMERATOR(OffAlphaChannel)
|
@@ -1052,7 +1050,12 @@ Init_RMagick2(void)
|
|
1052
1050
|
ENUMERATOR(BlackChannel)
|
1053
1051
|
ENUMERATOR(IndexChannel)
|
1054
1052
|
ENUMERATOR(GrayChannel)
|
1053
|
+
ENUMERATOR(CompositeChannels)
|
1055
1054
|
ENUMERATOR(AllChannels)
|
1055
|
+
ENUMERATOR(TrueAlphaChannel)
|
1056
|
+
ENUMERATOR(RGBChannels)
|
1057
|
+
ENUMERATOR(GrayChannels)
|
1058
|
+
ENUMERATOR(SyncChannels)
|
1056
1059
|
ENUMERATORV(AlphaChannel, OpacityChannel)
|
1057
1060
|
ENUMERATORV(DefaultChannels, 0xff & ~OpacityChannel)
|
1058
1061
|
ENUMERATORV(HueChannel, RedChannel)
|
@@ -1090,7 +1093,6 @@ Init_RMagick2(void)
|
|
1090
1093
|
ENUMERATOR(Rec709YCbCrColorspace)
|
1091
1094
|
ENUMERATOR(LogColorspace)
|
1092
1095
|
ENUMERATOR(CMYColorspace)
|
1093
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1094
1096
|
ENUMERATOR(LuvColorspace)
|
1095
1097
|
ENUMERATOR(HCLColorspace)
|
1096
1098
|
ENUMERATOR(LCHColorspace)
|
@@ -1103,7 +1105,6 @@ Init_RMagick2(void)
|
|
1103
1105
|
ENUMERATOR(HCLpColorspace)
|
1104
1106
|
ENUMERATOR(YDbDrColorspace)
|
1105
1107
|
ENUMERATORV(XyYColorspace, xyYColorspace)
|
1106
|
-
#endif
|
1107
1108
|
#if defined(IMAGEMAGICK_7)
|
1108
1109
|
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_7_0_8)
|
1109
1110
|
ENUMERATOR(LinearGRAYColorspace)
|
@@ -1196,9 +1197,7 @@ Init_RMagick2(void)
|
|
1196
1197
|
ENUMERATOR(UndefinedCompositeOp)
|
1197
1198
|
ENUMERATOR(VividLightCompositeOp)
|
1198
1199
|
ENUMERATOR(XorCompositeOp)
|
1199
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1200
1200
|
ENUMERATOR(HardMixCompositeOp)
|
1201
|
-
#endif
|
1202
1201
|
#if defined(IMAGEMAGICK_7)
|
1203
1202
|
ENUMERATOR(CopyAlphaCompositeOp)
|
1204
1203
|
#else
|
@@ -1242,6 +1241,7 @@ Init_RMagick2(void)
|
|
1242
1241
|
|
1243
1242
|
// DisposeType constants
|
1244
1243
|
DEF_ENUM(DisposeType)
|
1244
|
+
ENUMERATOR(UnrecognizedDispose)
|
1245
1245
|
ENUMERATOR(UndefinedDispose)
|
1246
1246
|
ENUMERATOR(BackgroundDispose)
|
1247
1247
|
ENUMERATOR(NoneDispose)
|
@@ -1318,9 +1318,7 @@ Init_RMagick2(void)
|
|
1318
1318
|
ENUMERATOR(RobidouxSharpFilter)
|
1319
1319
|
ENUMERATOR(CosineFilter)
|
1320
1320
|
ENUMERATOR(SplineFilter)
|
1321
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1322
1321
|
ENUMERATOR(LanczosRadiusFilter)
|
1323
|
-
#endif
|
1324
1322
|
ENUMERATORV(WelchFilter, WelshFilter)
|
1325
1323
|
ENUMERATORV(HannFilter, HanningFilter)
|
1326
1324
|
END_ENUM
|
@@ -1412,9 +1410,7 @@ Init_RMagick2(void)
|
|
1412
1410
|
ENUMERATOR(RootMeanSquaredErrorMetric)
|
1413
1411
|
ENUMERATOR(NormalizedCrossCorrelationErrorMetric)
|
1414
1412
|
ENUMERATOR(FuzzErrorMetric)
|
1415
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1416
1413
|
ENUMERATOR(PerceptualHashErrorMetric)
|
1417
|
-
#endif
|
1418
1414
|
#if defined(IMAGEMAGICK_7)
|
1419
1415
|
ENUMERATOR(UndefinedErrorMetric)
|
1420
1416
|
ENUMERATOR(MeanErrorPerPixelErrorMetric)
|
@@ -1546,9 +1542,7 @@ Init_RMagick2(void)
|
|
1546
1542
|
ENUMERATOR(ExponentialQuantumOperator)
|
1547
1543
|
ENUMERATOR(MedianQuantumOperator)
|
1548
1544
|
ENUMERATOR(SumQuantumOperator)
|
1549
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1550
1545
|
ENUMERATOR(RootMeanSquareQuantumOperator)
|
1551
|
-
#endif
|
1552
1546
|
END_ENUM
|
1553
1547
|
|
1554
1548
|
// RenderingIntent
|
@@ -1673,9 +1667,7 @@ Init_RMagick2(void)
|
|
1673
1667
|
ENUMERATOR(CorrelateNormalizeValue)
|
1674
1668
|
ENUMERATOR(AreaValue)
|
1675
1669
|
ENUMERATOR(DecimalValue)
|
1676
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1677
1670
|
ENUMERATOR(SeparatorValue)
|
1678
|
-
#endif
|
1679
1671
|
ENUMERATOR(AllValues)
|
1680
1672
|
END_ENUM
|
1681
1673
|
|
@@ -1744,9 +1736,7 @@ Init_RMagick2(void)
|
|
1744
1736
|
ENUMERATOR(OctagonalKernel)
|
1745
1737
|
ENUMERATOR(EuclideanKernel)
|
1746
1738
|
ENUMERATOR(UserDefinedKernel)
|
1747
|
-
#if defined(IMAGEMAGICK_GREATER_THAN_EQUAL_6_8_9)
|
1748
1739
|
ENUMERATOR(BinomialKernel)
|
1749
|
-
#endif
|
1750
1740
|
END_ENUM
|
1751
1741
|
|
1752
1742
|
/*-----------------------------------------------------------------------*/
|
@@ -1822,25 +1812,20 @@ Init_RMagick2(void)
|
|
1822
1812
|
* were compiled with.
|
1823
1813
|
*
|
1824
1814
|
* No Ruby usage (internal function)
|
1825
|
-
*
|
1826
|
-
* Notes:
|
1827
|
-
* - Bypass the test by defining the constant RMAGICK_BYPASS_VERSION_TEST to
|
1828
|
-
* 'true' at the top level, before requiring 'rmagick'
|
1829
1815
|
*/
|
1830
1816
|
static void
|
1831
1817
|
test_Magick_version(void)
|
1832
1818
|
{
|
1833
1819
|
size_t version_number;
|
1834
1820
|
const char *version_str;
|
1835
|
-
ID bypass = rb_intern("RMAGICK_BYPASS_VERSION_TEST");
|
1836
1821
|
|
1837
|
-
|
1838
|
-
|
1839
|
-
|
1840
|
-
|
1822
|
+
/* ImageMagick versions are defined as major, minor and patch, each of which are defined as a value in 1 byte. */
|
1823
|
+
/* ImageMagick 6.9.12 has `#define MagickLibVersion 0x69C` */
|
1824
|
+
/* It use only major and minor versions. */
|
1825
|
+
size_t mask_major_minor_version = 0xFFFFFFF0;
|
1841
1826
|
|
1842
1827
|
version_str = GetMagickVersion(&version_number);
|
1843
|
-
if (version_number != MagickLibVersion)
|
1828
|
+
if ((version_number & mask_major_minor_version) != (MagickLibVersion & mask_major_minor_version))
|
1844
1829
|
{
|
1845
1830
|
int n, x;
|
1846
1831
|
|
data/ext/RMagick/rmpixel.cpp
CHANGED
@@ -1191,7 +1191,7 @@ rm_set_magick_pixel_packet(Pixel *pixel, MagickPixel *pp)
|
|
1191
1191
|
/**
|
1192
1192
|
* Return the color name corresponding to the pixel values.
|
1193
1193
|
*
|
1194
|
-
* @overload to_color(compliance = Magick::AllCompliance, alpha = false, depth = Magick::MAGICKCORE_QUANTUM_DEPTH, hex =
|
1194
|
+
* @overload to_color(compliance = Magick::AllCompliance, alpha = false, depth = Magick::MAGICKCORE_QUANTUM_DEPTH, hex = true)
|
1195
1195
|
* @param compliance [Magick::ComplianceType] A ComplianceType constant
|
1196
1196
|
* @param alpha [Boolean] If false, the pixel's alpha attribute is ignored
|
1197
1197
|
* @param depth [Numeric] An image depth
|
@@ -1205,7 +1205,7 @@ Pixel_to_color(int argc, VALUE *argv, VALUE self)
|
|
1205
1205
|
Image *image;
|
1206
1206
|
Pixel *pixel;
|
1207
1207
|
MagickPixel mpp;
|
1208
|
-
MagickBooleanType hex =
|
1208
|
+
MagickBooleanType hex = MagickTrue;
|
1209
1209
|
char name[MaxTextExtent];
|
1210
1210
|
ExceptionInfo *exception;
|
1211
1211
|
ComplianceType compliance = AllCompliance;
|
data/ext/RMagick/rmutil.cpp
CHANGED
@@ -21,6 +21,11 @@
|
|
21
21
|
static VALUE rescue_not_str(VALUE, VALUE ATTRIBUTE_UNUSED) ATTRIBUTE_NORETURN;
|
22
22
|
static void handle_exception(ExceptionInfo *, Image *, ErrorRetention);
|
23
23
|
|
24
|
+
#if defined(IMAGEMAGICK_7)
|
25
|
+
DEFINE_GVL_STUB3(TransformImageColorspace, Image *, const ColorspaceType, ExceptionInfo *);
|
26
|
+
#else
|
27
|
+
DEFINE_GVL_STUB2(TransformImageColorspace, Image *, const ColorspaceType);
|
28
|
+
#endif
|
24
29
|
|
25
30
|
DEFINE_GVL_STUB5(CloneImage, const Image *, const size_t, const size_t, const MagickBooleanType, ExceptionInfo *);
|
26
31
|
|
@@ -367,7 +372,6 @@ double
|
|
367
372
|
rm_percentage2(VALUE arg, double max, bool only_positive)
|
368
373
|
{
|
369
374
|
double pct;
|
370
|
-
char *end;
|
371
375
|
|
372
376
|
if (!rm_check_num2dbl(arg))
|
373
377
|
{
|
@@ -590,23 +594,27 @@ rm_cur_image(VALUE img)
|
|
590
594
|
VALUE
|
591
595
|
rm_pixelcolor_to_color_name(Image *image, PixelColor *color)
|
592
596
|
{
|
593
|
-
|
594
|
-
char
|
595
|
-
ExceptionInfo *exception;
|
597
|
+
MagickPixel mpp;
|
598
|
+
char tuple[MaxTextExtent];
|
596
599
|
|
597
|
-
exception = AcquireExceptionInfo();
|
598
|
-
|
599
|
-
pp = *color;
|
600
600
|
#if defined(IMAGEMAGICK_7)
|
601
|
-
|
602
|
-
|
601
|
+
mpp = *color;
|
602
|
+
mpp.alpha_trait = BlendPixelTrait;
|
603
|
+
mpp.colorspace = image->colorspace;
|
604
|
+
#else
|
605
|
+
rm_init_magickpixel(image, &mpp);
|
606
|
+
mpp.red = GetPixelRed(color);
|
607
|
+
mpp.green = GetPixelGreen(color);
|
608
|
+
mpp.blue = GetPixelBlue(color);
|
609
|
+
mpp.opacity = GetPixelOpacity(color);
|
610
|
+
mpp.index = (MagickRealType) 0.0;
|
611
|
+
mpp.matte = MagickTrue;
|
603
612
|
#endif
|
613
|
+
mpp.depth = image->depth;
|
604
614
|
|
605
|
-
|
606
|
-
CHECK_EXCEPTION();
|
607
|
-
DestroyExceptionInfo(exception);
|
615
|
+
GetColorTuple(&mpp, MagickTrue, tuple);
|
608
616
|
|
609
|
-
return rb_str_new2(
|
617
|
+
return rb_str_new2(tuple);
|
610
618
|
}
|
611
619
|
|
612
620
|
|
@@ -1057,13 +1065,14 @@ void rm_sync_image_options(Image *image, Info *info)
|
|
1057
1065
|
{
|
1058
1066
|
#if defined(IMAGEMAGICK_7)
|
1059
1067
|
exception = AcquireExceptionInfo();
|
1060
|
-
|
1061
|
-
|
1062
|
-
|
1063
|
-
// why the exception is being ignored here.
|
1068
|
+
GVL_STRUCT_TYPE(TransformImageColorspace) args = { image, info->colorspace, exception };
|
1069
|
+
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(TransformImageColorspace), &args);
|
1070
|
+
CHECK_EXCEPTION();
|
1064
1071
|
DestroyExceptionInfo(exception);
|
1065
1072
|
#else
|
1066
|
-
|
1073
|
+
GVL_STRUCT_TYPE(TransformImageColorspace) args = { image, info->colorspace };
|
1074
|
+
CALL_FUNC_WITHOUT_GVL(GVL_FUNC(TransformImageColorspace), &args);
|
1075
|
+
rm_check_image_exception(image, RetainOnError);
|
1067
1076
|
#endif
|
1068
1077
|
}
|
1069
1078
|
|
data/lib/rmagick/version.rb
CHANGED
data/lib/rmagick.rb
CHANGED
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)
|
@@ -227,7 +227,7 @@ module Magick
|
|
227
227
|
|
228
228
|
def enquote(str)
|
229
229
|
str = to_string(str)
|
230
|
-
if str.length > 2 && /\A(
|
230
|
+
if str.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(str)
|
231
231
|
str
|
232
232
|
else
|
233
233
|
'"' + str + '"'
|
@@ -277,7 +277,7 @@ module Magick
|
|
277
277
|
|
278
278
|
# Draw a bezier curve.
|
279
279
|
def bezier(*points)
|
280
|
-
if points.
|
280
|
+
if points.empty?
|
281
281
|
Kernel.raise ArgumentError, 'no points specified'
|
282
282
|
elsif points.length.odd?
|
283
283
|
Kernel.raise ArgumentError, 'odd number of arguments specified'
|
@@ -479,7 +479,7 @@ module Magick
|
|
479
479
|
|
480
480
|
# Draw a polygon
|
481
481
|
def polygon(*points)
|
482
|
-
if points.
|
482
|
+
if points.empty?
|
483
483
|
Kernel.raise ArgumentError, 'no points specified'
|
484
484
|
elsif points.length.odd?
|
485
485
|
Kernel.raise ArgumentError, 'odd number of points specified'
|
@@ -489,7 +489,7 @@ module Magick
|
|
489
489
|
|
490
490
|
# Draw a polyline
|
491
491
|
def polyline(*points)
|
492
|
-
if points.
|
492
|
+
if points.empty?
|
493
493
|
Kernel.raise ArgumentError, 'no points specified'
|
494
494
|
elsif points.length.odd?
|
495
495
|
Kernel.raise ArgumentError, 'odd number of points specified'
|
@@ -504,7 +504,7 @@ module Magick
|
|
504
504
|
# pop('pattern')
|
505
505
|
|
506
506
|
def pop(*what)
|
507
|
-
if what.
|
507
|
+
if what.empty?
|
508
508
|
primitive 'pop graphic-context'
|
509
509
|
else
|
510
510
|
primitive 'pop ' + what.map { |x| to_string(x) }.join(' ')
|
@@ -517,7 +517,7 @@ module Magick
|
|
517
517
|
# push('gradient')
|
518
518
|
# push('pattern')
|
519
519
|
def push(*what)
|
520
|
-
if what.
|
520
|
+
if what.empty?
|
521
521
|
primitive 'push graphic-context'
|
522
522
|
else
|
523
523
|
primitive 'push ' + what.map { |x| to_string(x) }.join(' ')
|
@@ -573,7 +573,7 @@ module Magick
|
|
573
573
|
|
574
574
|
# Specify a stroke dash pattern
|
575
575
|
def stroke_dasharray(*list)
|
576
|
-
if list.
|
576
|
+
if list.empty?
|
577
577
|
primitive 'stroke-dasharray none'
|
578
578
|
else
|
579
579
|
list.map! { |x| Float(x) }.each do |x|
|
@@ -622,7 +622,7 @@ module Magick
|
|
622
622
|
def text(x, y, text)
|
623
623
|
text = to_string(text)
|
624
624
|
Kernel.raise ArgumentError, 'missing text argument' if text.empty?
|
625
|
-
if text.length > 2 && /\A(
|
625
|
+
if text.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(text)
|
626
626
|
# text already quoted
|
627
627
|
elsif !text['\'']
|
628
628
|
text = '\'' + text + '\''
|
@@ -669,6 +669,7 @@ module Magick
|
|
669
669
|
|
670
670
|
# Define IPTC record number:dataset tags for use with Image#get_iptc_dataset
|
671
671
|
module IPTC
|
672
|
+
# rubocop:disable Naming/ConstantName
|
672
673
|
module Envelope
|
673
674
|
Model_Version = '1:00'
|
674
675
|
Destination = '1:05'
|
@@ -766,6 +767,7 @@ module Magick
|
|
766
767
|
module Post_ObjectData_Descriptor
|
767
768
|
Confirmed_ObjectData_Size = '9:10'
|
768
769
|
end
|
770
|
+
# rubocop:enable Naming/ConstantName
|
769
771
|
end # module Magick::IPTC
|
770
772
|
|
771
773
|
# Ruby-level Magick::Image methods
|
@@ -837,9 +839,9 @@ module Magick
|
|
837
839
|
# arrays.
|
838
840
|
def get_exif_by_entry(*entry)
|
839
841
|
ary = []
|
840
|
-
if entry.
|
842
|
+
if entry.empty?
|
841
843
|
exif_data = self['EXIF:*']
|
842
|
-
exif_data
|
844
|
+
exif_data&.split("\n")&.each { |exif| ary.push(exif.split('=')) }
|
843
845
|
else
|
844
846
|
get_exif_by_entry # ensure properties is populated with exif data
|
845
847
|
entry.each do |name|
|
@@ -853,14 +855,12 @@ module Magick
|
|
853
855
|
# Retrieve EXIF data by tag number or all tag/value pairs. The return value is a hash.
|
854
856
|
def get_exif_by_number(*tag)
|
855
857
|
hash = {}
|
856
|
-
if tag.
|
858
|
+
if tag.empty?
|
857
859
|
exif_data = self['EXIF:!']
|
858
|
-
|
859
|
-
|
860
|
-
|
861
|
-
|
862
|
-
hash[tag] = value
|
863
|
-
end
|
860
|
+
exif_data&.split("\n")&.each do |exif|
|
861
|
+
tag, value = exif.split('=')
|
862
|
+
tag = tag[1, 4].hex
|
863
|
+
hash[tag] = value
|
864
864
|
end
|
865
865
|
else
|
866
866
|
get_exif_by_number # ensure properties is populated with exif data
|
@@ -1288,10 +1288,10 @@ module Magick
|
|
1288
1288
|
# Allow scene to be set to nil
|
1289
1289
|
def scene=(n)
|
1290
1290
|
if n.nil?
|
1291
|
-
Kernel.raise IndexError, 'scene number out of bounds' unless @images.
|
1291
|
+
Kernel.raise IndexError, 'scene number out of bounds' unless @images.empty?
|
1292
1292
|
@scene = nil
|
1293
1293
|
return
|
1294
|
-
elsif @images.
|
1294
|
+
elsif @images.empty?
|
1295
1295
|
Kernel.raise IndexError, 'scene number out of bounds'
|
1296
1296
|
end
|
1297
1297
|
|
@@ -1368,7 +1368,7 @@ module Magick
|
|
1368
1368
|
|
1369
1369
|
def []=(*args)
|
1370
1370
|
obj = @images.[]=(*args)
|
1371
|
-
if obj
|
1371
|
+
if obj.respond_to?(:each)
|
1372
1372
|
assert_image_array(obj)
|
1373
1373
|
set_current obj.last.__id__
|
1374
1374
|
elsif obj
|
@@ -1522,7 +1522,7 @@ module Magick
|
|
1522
1522
|
end
|
1523
1523
|
|
1524
1524
|
def fill(*args, &block)
|
1525
|
-
assert_image args[0] unless
|
1525
|
+
assert_image args[0] unless block
|
1526
1526
|
current = get_current
|
1527
1527
|
@images.fill(*args, &block)
|
1528
1528
|
assert_image_array self
|
@@ -1542,7 +1542,7 @@ module Magick
|
|
1542
1542
|
alias select find_all
|
1543
1543
|
|
1544
1544
|
def from_blob(*blobs, &block)
|
1545
|
-
Kernel.raise ArgumentError, 'no blobs given' if blobs.
|
1545
|
+
Kernel.raise ArgumentError, 'no blobs given' if blobs.empty?
|
1546
1546
|
blobs.each do |b|
|
1547
1547
|
Magick::Image.from_blob(b, &block).each { |n| @images << n }
|
1548
1548
|
end
|
@@ -1571,9 +1571,8 @@ module Magick
|
|
1571
1571
|
|
1572
1572
|
# Call inspect for all the images
|
1573
1573
|
def inspect
|
1574
|
-
img =
|
1575
|
-
|
1576
|
-
img = '[' + img.join(",\n") + "]\nscene=#{@scene}"
|
1574
|
+
img = @images.map(&:inspect)
|
1575
|
+
'[' + img.join(",\n") + "]\nscene=#{@scene}"
|
1577
1576
|
end
|
1578
1577
|
|
1579
1578
|
# Set the number of iterations of an animated GIF
|
@@ -1584,7 +1583,7 @@ module Magick
|
|
1584
1583
|
end
|
1585
1584
|
|
1586
1585
|
def last(*args)
|
1587
|
-
if args.
|
1586
|
+
if args.empty?
|
1588
1587
|
a = @images.last
|
1589
1588
|
else
|
1590
1589
|
a = @images.last(*args)
|
@@ -1616,7 +1615,7 @@ module Magick
|
|
1616
1615
|
def method_missing(meth_id, *args, &block)
|
1617
1616
|
if @scene
|
1618
1617
|
img = @images[@scene]
|
1619
|
-
new_img = img.
|
1618
|
+
new_img = img.public_send(meth_id, *args, &block)
|
1620
1619
|
img.object_id == new_img.object_id ? self : new_img
|
1621
1620
|
else
|
1622
1621
|
super
|
@@ -1646,7 +1645,7 @@ module Magick
|
|
1646
1645
|
|
1647
1646
|
# Ping files and concatenate the new images
|
1648
1647
|
def ping(*files, &block)
|
1649
|
-
Kernel.raise ArgumentError, 'no files given' if files.
|
1648
|
+
Kernel.raise ArgumentError, 'no files given' if files.empty?
|
1650
1649
|
files.each do |f|
|
1651
1650
|
Magick::Image.ping(f, &block).each { |n| @images << n }
|
1652
1651
|
end
|
@@ -1672,7 +1671,7 @@ module Magick
|
|
1672
1671
|
|
1673
1672
|
# Read files and concatenate the new images
|
1674
1673
|
def read(*files, &block)
|
1675
|
-
Kernel.raise ArgumentError, 'no files given' if files.
|
1674
|
+
Kernel.raise ArgumentError, 'no files given' if files.empty?
|
1676
1675
|
files.each do |f|
|
1677
1676
|
Magick::Image.read(f, &block).each { |n| @images << n }
|
1678
1677
|
end
|
@@ -1735,8 +1734,8 @@ module Magick
|
|
1735
1734
|
self
|
1736
1735
|
end
|
1737
1736
|
|
1738
|
-
def reverse_each
|
1739
|
-
@images.reverse_each
|
1737
|
+
def reverse_each(&block)
|
1738
|
+
@images.reverse_each(&block)
|
1740
1739
|
self
|
1741
1740
|
end
|
1742
1741
|
|
@@ -1775,9 +1774,7 @@ module Magick
|
|
1775
1774
|
end
|
1776
1775
|
|
1777
1776
|
def to_a
|
1778
|
-
|
1779
|
-
@images.each { |image| a << image }
|
1780
|
-
a
|
1777
|
+
@images.map { |image| image }
|
1781
1778
|
end
|
1782
1779
|
|
1783
1780
|
def uniq
|
@@ -1811,6 +1808,15 @@ module Magick
|
|
1811
1808
|
end
|
1812
1809
|
alias indexes values_at
|
1813
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
|
1814
1820
|
end # Magick::ImageList
|
1815
1821
|
|
1816
1822
|
class Pixel
|
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?
|
data/lib/rvg/misc.rb
CHANGED
@@ -72,7 +72,7 @@ module Magick
|
|
72
72
|
end
|
73
73
|
|
74
74
|
def enquote(text)
|
75
|
-
return text if text.length > 2 && /\A(
|
75
|
+
return text if text.length > 2 && /\A(?:"[^\"]+"|'[^\']+'|\{[^\}]+\})\z/.match(text)
|
76
76
|
|
77
77
|
if !text['\'']
|
78
78
|
text = '\'' + text + '\''
|
@@ -87,7 +87,7 @@ module Magick
|
|
87
87
|
|
88
88
|
# escape existing braces, surround with braces
|
89
89
|
text.gsub!(/[}]/) { |b| '\\' + b }
|
90
|
-
'{' +
|
90
|
+
'{' + text + '}'
|
91
91
|
end
|
92
92
|
|
93
93
|
def glyph_metrics(glyph_orientation, glyph)
|
@@ -114,7 +114,7 @@ module Magick
|
|
114
114
|
y_rel_coords << wy
|
115
115
|
end
|
116
116
|
first_word = false
|
117
|
-
word.
|
117
|
+
word.chars.each do |glyph|
|
118
118
|
wx, wy = get_letter_spacing(glyph)
|
119
119
|
x_rel_coords << wx
|
120
120
|
y_rel_coords << wy
|
@@ -173,7 +173,7 @@ module Magick
|
|
173
173
|
|
174
174
|
def render(x, y, text)
|
175
175
|
x_rel_coords, y_rel_coords = text_rel_coords(text)
|
176
|
-
dx = x_rel_coords.
|
176
|
+
dx = x_rel_coords.sum
|
177
177
|
dy = y_rel_coords.max
|
178
178
|
|
179
179
|
# We're handling the anchoring.
|
@@ -203,7 +203,7 @@ module Magick
|
|
203
203
|
text.split(::Magick::RVG::WORD_SEP).each do |word|
|
204
204
|
x += x_rel_coords.shift unless first_word
|
205
205
|
first_word = false
|
206
|
-
word.
|
206
|
+
word.chars.each do |glyph|
|
207
207
|
render_glyph(@ctx.text_attrs.glyph_orientation_horizontal, x, y, glyph)
|
208
208
|
x += x_rel_coords.shift
|
209
209
|
end
|
@@ -234,7 +234,7 @@ module Magick
|
|
234
234
|
def render(x, y, text)
|
235
235
|
x_rel_coords, y_rel_coords = text_rel_coords(text)
|
236
236
|
dx = x_rel_coords.max
|
237
|
-
dy = y_rel_coords.
|
237
|
+
dy = y_rel_coords.sum
|
238
238
|
|
239
239
|
# We're handling the anchoring.
|
240
240
|
@ctx.gc.push
|
@@ -271,7 +271,7 @@ module Magick
|
|
271
271
|
x_rel_coords.shift
|
272
272
|
end
|
273
273
|
first_word = false
|
274
|
-
word.
|
274
|
+
word.chars.each do |glyph|
|
275
275
|
case @ctx.text_attrs.glyph_orientation_vertical.to_i
|
276
276
|
when 0, 90, 270
|
277
277
|
x_shift = (dx - x_rel_coords.shift) / 2
|
@@ -579,7 +579,7 @@ module Magick
|
|
579
579
|
|
580
580
|
def font_weight(weight)
|
581
581
|
# If the arg is not in the hash use it directly. Handles numeric values.
|
582
|
-
weight =
|
582
|
+
weight = FONT_WEIGHT.fetch(weight.to_sym, Magick::NormalWeight) unless weight.is_a?(Numeric)
|
583
583
|
@gc.font_weight(weight)
|
584
584
|
@shadow[-1].font_weight = weight
|
585
585
|
nil
|
@@ -668,7 +668,7 @@ module Magick
|
|
668
668
|
end
|
669
669
|
|
670
670
|
def text(x, y, text)
|
671
|
-
return if text.
|
671
|
+
return if text.empty?
|
672
672
|
|
673
673
|
text_renderer = if @text_attrs.non_default?
|
674
674
|
TEXT_STRATEGIES[@text_attrs.writing_mode].new(self)
|
data/lib/rvg/rvg.rb
CHANGED
@@ -41,8 +41,6 @@ require 'rvg/clippath'
|
|
41
41
|
require 'rvg/paint'
|
42
42
|
require 'rvg/units'
|
43
43
|
|
44
|
-
require 'pp' if ENV['debug_rvg']
|
45
|
-
|
46
44
|
# RVG is the main class in this library. All graphic elements
|
47
45
|
# must be contained within an RVG object.
|
48
46
|
module Magick
|
@@ -108,7 +106,7 @@ module Magick
|
|
108
106
|
|
109
107
|
if ENV['debug_prim']
|
110
108
|
def print_gc(gc)
|
111
|
-
primitives = gc.inspect.split(
|
109
|
+
primitives = gc.inspect.split("\n")
|
112
110
|
indent = 0
|
113
111
|
primitives.each do |cmd|
|
114
112
|
indent -= 1 if cmd['pop ']
|
@@ -172,7 +170,9 @@ module Magick
|
|
172
170
|
# The default fill is "none", that is, transparent black.
|
173
171
|
def background_fill=(color)
|
174
172
|
warn 'background_fill= has no effect in nested RVG objects' if @nested
|
175
|
-
if
|
173
|
+
if color.is_a?(Magick::Pixel)
|
174
|
+
@background_fill = color
|
175
|
+
else
|
176
176
|
begin
|
177
177
|
@background_fill = Magick::Pixel.from_color(color)
|
178
178
|
rescue Magick::ImageMagickError
|
@@ -182,8 +182,6 @@ module Magick
|
|
182
182
|
rescue StandardError
|
183
183
|
raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})"
|
184
184
|
end
|
185
|
-
else
|
186
|
-
@background_fill = color
|
187
185
|
end
|
188
186
|
end
|
189
187
|
|