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/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
|
@@ -452,10 +452,10 @@ module Magick
|
|
452
452
|
}
|
453
453
|
|
454
454
|
FONT_WEIGHT = {
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
455
|
+
normal: Magick::NormalWeight,
|
456
|
+
bold: Magick::BoldWeight,
|
457
|
+
bolder: Magick::BolderWeight,
|
458
|
+
lighter: Magick::LighterWeight
|
459
459
|
}
|
460
460
|
|
461
461
|
TEXT_ANCHOR = {
|
@@ -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 = FONT_WEIGHT.fetch(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
|
@@ -646,7 +646,7 @@ module Magick
|
|
646
646
|
|
647
647
|
def skewX(degrees)
|
648
648
|
degrees = Magick::RVG.convert_one_to_float(degrees)
|
649
|
-
@gc.
|
649
|
+
@gc.skewx(degrees)
|
650
650
|
@ry = Math.tan(GraphicContext.degrees_to_radians(degrees))
|
651
651
|
concat_matrix
|
652
652
|
nil
|
@@ -654,7 +654,7 @@ module Magick
|
|
654
654
|
|
655
655
|
def skewY(degrees)
|
656
656
|
degrees = Magick::RVG.convert_one_to_float(degrees)
|
657
|
-
@gc.
|
657
|
+
@gc.skewy(degrees)
|
658
658
|
@rx = Math.tan(GraphicContext.degrees_to_radians(degrees))
|
659
659
|
concat_matrix
|
660
660
|
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
|
@@ -90,6 +88,8 @@ module Magick
|
|
90
88
|
end
|
91
89
|
bg_image
|
92
90
|
end
|
91
|
+
else
|
92
|
+
@background_image.copy
|
93
93
|
end
|
94
94
|
else
|
95
95
|
@background_image.copy
|
@@ -106,7 +106,7 @@ module Magick
|
|
106
106
|
|
107
107
|
if ENV['debug_prim']
|
108
108
|
def print_gc(gc)
|
109
|
-
primitives = gc.inspect.split(
|
109
|
+
primitives = gc.inspect.split("\n")
|
110
110
|
indent = 0
|
111
111
|
primitives.each do |cmd|
|
112
112
|
indent -= 1 if cmd['pop ']
|
@@ -170,7 +170,9 @@ module Magick
|
|
170
170
|
# The default fill is "none", that is, transparent black.
|
171
171
|
def background_fill=(color)
|
172
172
|
warn 'background_fill= has no effect in nested RVG objects' if @nested
|
173
|
-
if
|
173
|
+
if color.is_a?(Magick::Pixel)
|
174
|
+
@background_fill = color
|
175
|
+
else
|
174
176
|
begin
|
175
177
|
@background_fill = Magick::Pixel.from_color(color)
|
176
178
|
rescue Magick::ImageMagickError
|
@@ -180,8 +182,6 @@ module Magick
|
|
180
182
|
rescue StandardError
|
181
183
|
raise ArgumentError, "argument must be a color name or a Pixel (got #{color.class})"
|
182
184
|
end
|
183
|
-
else
|
184
|
-
@background_fill = color
|
185
185
|
end
|
186
186
|
end
|
187
187
|
|
data/lib/rvg/stretchable.rb
CHANGED
@@ -137,8 +137,8 @@ module Magick
|
|
137
137
|
rescue ArgumentError
|
138
138
|
raise ArgumentError, "arguments must be convertable to float (got #{x.class}, #{y.class}, #{width.class}, #{height.class})"
|
139
139
|
end
|
140
|
-
raise(ArgumentError, "viewbox width must be > 0 (#{
|
141
|
-
raise(ArgumentError, "viewbox height must be > 0 (#{
|
140
|
+
raise(ArgumentError, "viewbox width must be > 0 (#{@vbx_width} given)") unless @vbx_width >= 0
|
141
|
+
raise(ArgumentError, "viewbox height must be > 0 (#{@vbx_height} given)") unless @vbx_height >= 0
|
142
142
|
|
143
143
|
# return the user-coordinate space attributes if defined
|
144
144
|
class << self
|
data/lib/rvg/stylable.rb
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
#++
|
5
5
|
module Magick
|
6
6
|
class RVG
|
7
|
-
|
7
|
+
# :stopdoc:
|
8
8
|
STYLES = %i[
|
9
9
|
clip_path clip_rule fill fill_opacity fill_rule font
|
10
10
|
font_family font_size font_stretch font_style font_weight
|
@@ -49,7 +49,7 @@ module Magick
|
|
49
49
|
end
|
50
50
|
end # class Styles
|
51
51
|
|
52
|
-
|
52
|
+
# :startdoc:
|
53
53
|
|
54
54
|
# This module is mixed into classes that can have styles.
|
55
55
|
module Stylable
|
data/lib/rvg/transformable.rb
CHANGED
@@ -89,7 +89,7 @@ module Magick
|
|
89
89
|
cx = Float(args[0])
|
90
90
|
cy = Float(args[1])
|
91
91
|
@transforms << [:translate, [cx, cy]]
|
92
|
-
@transforms << [:rotate, [angle]]
|
92
|
+
@transforms << [:rotate, [Float(angle)]]
|
93
93
|
@transforms << [:translate, [-cx, -cy]]
|
94
94
|
else
|
95
95
|
raise ArgumentError, "wrong number of arguments (#{args.length} for 1 or 3)"
|
data/lib/rvg/units.rb
CHANGED
data/rmagick.gemspec
CHANGED
@@ -5,7 +5,6 @@ require './lib/rmagick/version'
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'rmagick'
|
7
7
|
s.version = Magick::VERSION
|
8
|
-
s.date = Date.today.to_s
|
9
8
|
s.summary = 'Ruby binding to ImageMagick'
|
10
9
|
s.description = 'RMagick is an interface between Ruby and ImageMagick.'
|
11
10
|
s.authors = ['Tim Hunter', 'Omer Bar-or', 'Benjamin Thomas', 'Moncef Maiza']
|
@@ -14,7 +13,7 @@ Gem::Specification.new do |s|
|
|
14
13
|
s.license = 'MIT'
|
15
14
|
|
16
15
|
tracked_files = `git ls-files`.split($OUTPUT_RECORD_SEPARATOR)
|
17
|
-
file_exclusion_regex =
|
16
|
+
file_exclusion_regex = /\A(doc|benchmarks|examples|spec|Steepfile)/
|
18
17
|
files = tracked_files.reject { |file| file[file_exclusion_regex] }
|
19
18
|
|
20
19
|
s.files = files
|
@@ -24,18 +23,6 @@ Gem::Specification.new do |s|
|
|
24
23
|
s.required_ruby_version = ">= #{Magick::MIN_RUBY_VERSION}"
|
25
24
|
s.requirements << "ImageMagick #{Magick::MIN_IM_VERSION} or later"
|
26
25
|
|
27
|
-
s.add_runtime_dependency 'pkg-config', '~> 1.4'
|
28
26
|
s.add_runtime_dependency 'observer', '~> 0.1'
|
29
|
-
|
30
|
-
s.add_development_dependency 'pry', '~> 0.14'
|
31
|
-
s.add_development_dependency 'rake-compiler', '~> 1.0'
|
32
|
-
s.add_development_dependency 'rspec', '~> 3.8'
|
33
|
-
s.add_development_dependency 'rspec_junit_formatter', '~> 0.6.0'
|
34
|
-
if RUBY_PLATFORM !~ /mswin|mingw/
|
35
|
-
s.add_development_dependency 'rubocop', '~> 0.81.0'
|
36
|
-
s.add_development_dependency 'rubocop-rspec', '~> 1.38.1'
|
37
|
-
s.add_development_dependency 'rubocop-performance', '~> 1.5.2'
|
38
|
-
end
|
39
|
-
s.add_development_dependency 'simplecov', '~> 0.16.1'
|
40
|
-
s.add_development_dependency 'yard', '~> 0.9.24'
|
27
|
+
s.add_runtime_dependency 'pkg-config', '~> 1.4'
|
41
28
|
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module Magick
|
2
|
+
interface _DrawCommonMethods
|
3
|
+
def affine: (magick_real sx, magick_real rx, magick_real ry, magick_real sy, magick_real tx, magick_real ty) -> self
|
4
|
+
def alpha: (magick_real x, magick_real y, PaintMethod method) -> self
|
5
|
+
def arc: (magick_real start_x, magick_real start_y, magick_real end_x, magick_real end_y, magick_real start_degrees, magick_real end_degrees) -> self
|
6
|
+
def bezier: (*magick_real points) -> self
|
7
|
+
def circle: (magick_real origin_x, magick_real origin_y, magick_real perim_x, magick_real perim_y) -> self
|
8
|
+
def clip_path: (interned name) -> self
|
9
|
+
def clip_rule: (interned rule) -> self
|
10
|
+
def clip_units: (interned unit) -> self
|
11
|
+
def color: (magick_real x, magick_real y, PaintMethod method) -> self
|
12
|
+
def decorate: (DecorationType decoration) -> self
|
13
|
+
def define_clip_path: (interned name) { () -> void } -> void
|
14
|
+
def ellipse: (magick_real origin_x, magick_real origin_y, magick_real width, magick_real height, magick_real arc_start, magick_real arc_end) -> self
|
15
|
+
def encoding: (interned encoding) -> self
|
16
|
+
def fill: (interned colorspec) -> self
|
17
|
+
alias fill_color fill
|
18
|
+
alias fill_pattern fill
|
19
|
+
def fill_opacity: (magick_percentage opacity) -> self
|
20
|
+
def fill_rule: (interned rule) -> self
|
21
|
+
def gravity: (GravityType grav) -> self
|
22
|
+
def image: (CompositeOperator composite, magick_real x, magick_real y, magick_real width, magick_real height, String image_file_path) -> self
|
23
|
+
def interline_spacing: (magick_real space) -> self
|
24
|
+
def interword_spacing: (magick_real space) -> self
|
25
|
+
def kerning: (magick_real space) -> self
|
26
|
+
def line: (magick_real start_x, magick_real start_y, magick_real end_x, magick_real end_y) -> self
|
27
|
+
def opacity: (magick_percentage opacity) -> self
|
28
|
+
def path: (interned cmds) -> self
|
29
|
+
def pattern: (interned name, magick_real x, magick_real y, magick_real width, magick_real height) { () -> void } -> void
|
30
|
+
def point: (magick_real x, magick_real y) -> self
|
31
|
+
def pointsize: (magick_real points) -> self
|
32
|
+
def polygon: (*magick_real points) -> self
|
33
|
+
def polyline: (*magick_real points) -> self
|
34
|
+
def rectangle: (magick_real upper_left_x, magick_real upper_left_y, magick_real lower_right_x, magick_real lower_right_y) -> self
|
35
|
+
def roundrectangle: (magick_real center_x, magick_real center_y, magick_real width, magick_real height, magick_real corner_width, magick_real corner_height) -> self
|
36
|
+
def skewx: (magick_real angle) -> self
|
37
|
+
def skewy: (magick_real angle) -> self
|
38
|
+
def stroke: (interned colorspec) -> self
|
39
|
+
alias stroke_color stroke
|
40
|
+
alias stroke_pattern stroke
|
41
|
+
def stroke_antialias: (bool `bool`) -> self
|
42
|
+
def stroke_dasharray: (*magick_real list) -> self
|
43
|
+
def stroke_dashoffset: (?magick_real value) -> self
|
44
|
+
def stroke_linecap: (interned value) -> self
|
45
|
+
def stroke_linejoin: (interned value) -> self
|
46
|
+
def stroke_miterlimit: (magick_real value) -> self
|
47
|
+
def stroke_opacity: (magick_percentage opacity) -> self
|
48
|
+
def text_align: (AlignType alignment) -> self
|
49
|
+
def text_antialias: (bool boolean) -> self
|
50
|
+
def text_undercolor: (String color) -> self
|
51
|
+
|
52
|
+
def annotate: (magick_image image_arg, int width_arg, int height_arg, int x_arg, int y_arg, string text) -> self
|
53
|
+
| (magick_image image_arg, int width_arg, int height_arg, int x_arg, int y_arg, string text) { (self) -> void } -> self
|
54
|
+
def composite: (magick_real x, magick_real y, magick_real width, magick_real height, magick_image image, ?CompositeOperator composite_op) -> self
|
55
|
+
def draw: (magick_image image_arg) -> self
|
56
|
+
def get_type_metrics: (magick_image image, string text) -> TypeMetric
|
57
|
+
| (string text) -> TypeMetric
|
58
|
+
def get_multiline_type_metrics: (magick_image image, string text) -> TypeMetric
|
59
|
+
| (string text) -> TypeMetric
|
60
|
+
def marshal_dump: () -> Hash[Symbol, untyped]
|
61
|
+
def marshal_load: (Hash[Symbol, untyped] ddraw) -> self
|
62
|
+
def primitive: (string primitive) -> self
|
63
|
+
end
|
64
|
+
end
|