ruby-vips 2.0.14 → 2.0.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop.yml +13 -1
- data/.rubocop_todo.yml +32 -247
- data/CHANGELOG.md +6 -0
- data/TODO +11 -3
- data/VERSION +1 -1
- data/example/daltonize8.rb +13 -15
- data/example/example1.rb +1 -2
- data/example/example4.rb +2 -2
- data/example/example5.rb +4 -5
- data/example/inheritance_with_refcount.rb +2 -19
- data/example/thumb.rb +2 -4
- data/example/trim8.rb +4 -4
- data/lib/vips.rb +10 -16
- data/lib/vips/align.rb +0 -1
- data/lib/vips/angle.rb +0 -1
- data/lib/vips/angle45.rb +0 -1
- data/lib/vips/bandformat.rb +0 -2
- data/lib/vips/blend_mode.rb +0 -2
- data/lib/vips/coding.rb +0 -1
- data/lib/vips/compass_direction.rb +0 -1
- data/lib/vips/direction.rb +0 -1
- data/lib/vips/extend.rb +0 -1
- data/lib/vips/gobject.rb +0 -4
- data/lib/vips/gvalue.rb +3 -9
- data/lib/vips/image.rb +64 -67
- data/lib/vips/interesting.rb +0 -1
- data/lib/vips/interpolate.rb +0 -5
- data/lib/vips/interpretation.rb +0 -1
- data/lib/vips/kernel.rb +0 -1
- data/lib/vips/methods.rb +3 -3
- data/lib/vips/object.rb +10 -17
- data/lib/vips/operation.rb +26 -34
- data/lib/vips/operationboolean.rb +0 -1
- data/lib/vips/operationcomplex.rb +0 -1
- data/lib/vips/operationcomplex2.rb +0 -1
- data/lib/vips/operationcomplexget.rb +0 -1
- data/lib/vips/operationmath.rb +0 -1
- data/lib/vips/operationmath2.rb +0 -1
- data/lib/vips/operationrelational.rb +0 -1
- data/lib/vips/operationround.rb +0 -1
- data/lib/vips/size.rb +0 -1
- data/lib/vips/version.rb +1 -2
- data/ruby-vips.gemspec +0 -1
- metadata +3 -4
data/lib/vips/gvalue.rb
CHANGED
@@ -6,7 +6,6 @@
|
|
6
6
|
require 'ffi'
|
7
7
|
|
8
8
|
module GObject
|
9
|
-
|
10
9
|
# Represent a GValue. Example use:
|
11
10
|
#
|
12
11
|
# ```ruby
|
@@ -134,7 +133,7 @@ module GObject
|
|
134
133
|
ptr.write_array_of_pointer value
|
135
134
|
|
136
135
|
# the gvalue needs a ref on each of the images
|
137
|
-
value.each {|image| ::GObject::g_object_ref image}
|
136
|
+
value.each { |image| ::GObject::g_object_ref image }
|
138
137
|
|
139
138
|
when Vips::BLOB_TYPE
|
140
139
|
len = value.bytesize
|
@@ -156,8 +155,7 @@ module GObject
|
|
156
155
|
|
157
156
|
else
|
158
157
|
raise Vips::Error, "unimplemented gtype for set: " +
|
159
|
-
|
160
|
-
|
158
|
+
"#{::GObject::g_type_name gtype} (#{gtype})"
|
161
159
|
end
|
162
160
|
end
|
163
161
|
end
|
@@ -233,8 +231,7 @@ module GObject
|
|
233
231
|
|
234
232
|
else
|
235
233
|
raise Vips::Error, "unimplemented gtype for get: " +
|
236
|
-
|
237
|
-
|
234
|
+
"#{::GObject::g_type_name gtype} (#{gtype})"
|
238
235
|
end
|
239
236
|
end
|
240
237
|
|
@@ -243,9 +240,7 @@ module GObject
|
|
243
240
|
# }
|
244
241
|
|
245
242
|
return result
|
246
|
-
|
247
243
|
end
|
248
|
-
|
249
244
|
end
|
250
245
|
|
251
246
|
attach_function :g_value_init, [GValue.ptr, :GType], :void
|
@@ -277,5 +272,4 @@ module GObject
|
|
277
272
|
[:pointer, :string, GValue.ptr], :void
|
278
273
|
attach_function :g_object_get_property,
|
279
274
|
[:pointer, :string, GValue.ptr], :void
|
280
|
-
|
281
275
|
end
|
data/lib/vips/image.rb
CHANGED
@@ -81,12 +81,10 @@ module Vips
|
|
81
81
|
|
82
82
|
class Struct < Vips::Object::Struct
|
83
83
|
include ImageLayout
|
84
|
-
|
85
84
|
end
|
86
85
|
|
87
86
|
class ManagedStruct < Vips::Object::ManagedStruct
|
88
87
|
include ImageLayout
|
89
|
-
|
90
88
|
end
|
91
89
|
|
92
90
|
class GenericPtr < FFI::Struct
|
@@ -96,7 +94,7 @@ module Vips
|
|
96
94
|
# handy for overloads ... want to be able to apply a function to an
|
97
95
|
# array or to a scalar
|
98
96
|
def self.smap x, &block
|
99
|
-
x.is_a?(Array) ? x.map {|y| smap(y, &block)} : block.(x)
|
97
|
+
x.is_a?(Array) ? x.map { |y| smap(y, &block) } : block.(x)
|
100
98
|
end
|
101
99
|
|
102
100
|
def self.complex? format
|
@@ -178,15 +176,15 @@ module Vips
|
|
178
176
|
public
|
179
177
|
|
180
178
|
def inspect
|
181
|
-
"#<Image #{width}x#{height} #{format}, #{bands} bands, "
|
182
|
-
"#{interpretation}>"
|
179
|
+
"#<Image #{width}x#{height} #{format}, #{bands} bands, #{interpretation}>"
|
183
180
|
end
|
184
181
|
|
185
182
|
def respond_to? name, include_all = false
|
186
183
|
# To support keyword args, we need to tell Ruby that final image
|
187
184
|
# arguments cannot be hashes of keywords.
|
188
185
|
#
|
189
|
-
# https://makandracards.com/makandra/
|
186
|
+
# https://makandracards.com/makandra/
|
187
|
+
# 36013-heads-up-ruby-implicitly-converts-a-hash-to-keyword-arguments
|
190
188
|
return false if name == :to_hash
|
191
189
|
|
192
190
|
# respond to all vips operations by nickname
|
@@ -347,19 +345,20 @@ module Vips
|
|
347
345
|
if array[0].is_a? Array
|
348
346
|
height = array.length
|
349
347
|
width = array[0].length
|
350
|
-
unless array.all? {|x| x.is_a? Array}
|
348
|
+
unless array.all? { |x| x.is_a? Array }
|
351
349
|
raise Vips::Error, "Not a 2D array."
|
352
350
|
end
|
353
|
-
unless array.all? {|x| x.length == width}
|
351
|
+
unless array.all? { |x| x.length == width }
|
354
352
|
raise Vips::Error, "Array not rectangular."
|
355
353
|
end
|
354
|
+
|
356
355
|
array = array.flatten
|
357
356
|
else
|
358
357
|
height = 1
|
359
358
|
width = array.length
|
360
359
|
end
|
361
360
|
|
362
|
-
unless array.all? {|x| x.is_a? Numeric}
|
361
|
+
unless array.all? { |x| x.is_a? Numeric }
|
363
362
|
raise Vips::Error, "Not all array elements are Numeric."
|
364
363
|
end
|
365
364
|
|
@@ -385,8 +384,8 @@ module Vips
|
|
385
384
|
def new_from_image value
|
386
385
|
pixel = (Vips::Image.black(1, 1) + value).cast(format)
|
387
386
|
image = pixel.embed 0, 0, width, height, extend: :copy
|
388
|
-
image.copy interpretation: interpretation,
|
389
|
-
|
387
|
+
image.copy interpretation: interpretation, xres: xres, yres: yres,
|
388
|
+
xoffset: xoffset, yoffset: yoffset
|
390
389
|
end
|
391
390
|
|
392
391
|
# Write this image to a file. Save options may be encoded in the
|
@@ -457,10 +456,8 @@ module Vips
|
|
457
456
|
# @macro vips.saveopts
|
458
457
|
# @return [String] the image saved in the specified format
|
459
458
|
def write_to_buffer format_string, **opts
|
460
|
-
filename =
|
461
|
-
|
462
|
-
option_string =
|
463
|
-
Vips::p2str(Vips::vips_filename_get_options format_string)
|
459
|
+
filename = Vips::p2str(Vips::vips_filename_get_filename format_string)
|
460
|
+
option_string = Vips::p2str(Vips::vips_filename_get_options format_string)
|
464
461
|
saver = Vips::vips_foreign_find_save_buffer filename
|
465
462
|
if saver == nil
|
466
463
|
raise Vips::Error, "No known saver for '#{filename}'."
|
@@ -480,6 +477,7 @@ module Vips
|
|
480
477
|
def write_to_memory
|
481
478
|
len = Vips::SizeStruct.new
|
482
479
|
ptr = Vips::vips_image_write_to_memory self, len
|
480
|
+
raise Vips::Error if ptr == nil
|
483
481
|
|
484
482
|
# wrap up as an autopointer
|
485
483
|
ptr = FFI::AutoPointer.new(ptr, GLib::G_FREE)
|
@@ -772,7 +770,7 @@ module Vips
|
|
772
770
|
# @return [Image] result of subtraction
|
773
771
|
def - other
|
774
772
|
other.is_a?(Vips::Image) ?
|
775
|
-
subtract(other) : linear(1, Image::smap(other) {|x| x * -1})
|
773
|
+
subtract(other) : linear(1, Image::smap(other) { |x| x * -1 })
|
776
774
|
end
|
777
775
|
|
778
776
|
# Multiply an image, constant or array.
|
@@ -790,7 +788,7 @@ module Vips
|
|
790
788
|
# @return [Image] result of division
|
791
789
|
def / other
|
792
790
|
other.is_a?(Vips::Image) ?
|
793
|
-
divide(other) : linear(Image::smap(other) {|x| 1.0 / x}, 0)
|
791
|
+
divide(other) : linear(Image::smap(other) { |x| 1.0 / x }, 0)
|
794
792
|
end
|
795
793
|
|
796
794
|
# Remainder after integer division with an image, constant or array.
|
@@ -961,16 +959,16 @@ module Vips
|
|
961
959
|
|
962
960
|
# make the template for unpack
|
963
961
|
template = {
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
969
|
-
|
970
|
-
|
971
|
-
|
972
|
-
|
973
|
-
|
962
|
+
char: 'c',
|
963
|
+
uchar: 'C',
|
964
|
+
short: 's_',
|
965
|
+
ushort: 'S_',
|
966
|
+
int: 'i_',
|
967
|
+
uint: 'I_',
|
968
|
+
float: 'f',
|
969
|
+
double: 'd',
|
970
|
+
complex: 'f',
|
971
|
+
dpcomplex: 'd'
|
974
972
|
}[format] + '*'
|
975
973
|
|
976
974
|
# and unpack into something like [1, 2, 3, 4 ..]
|
@@ -1031,7 +1029,7 @@ module Vips
|
|
1031
1029
|
#
|
1032
1030
|
# @return [Array<Image>] Array of n one-band images
|
1033
1031
|
def bandsplit
|
1034
|
-
(0...bands).map {|i| extract_band i}
|
1032
|
+
(0...bands).map { |i| extract_band i }
|
1035
1033
|
end
|
1036
1034
|
|
1037
1035
|
# Join a set of images bandwise.
|
@@ -1044,7 +1042,7 @@ module Vips
|
|
1044
1042
|
end
|
1045
1043
|
|
1046
1044
|
# if other is just Numeric, we can use bandjoin_const
|
1047
|
-
not_all_real = !other.all?{|x| x.is_a? Numeric}
|
1045
|
+
not_all_real = !other.all? { |x| x.is_a? Numeric }
|
1048
1046
|
|
1049
1047
|
if not_all_real
|
1050
1048
|
Vips::Image.bandjoin([self] + other)
|
@@ -1130,7 +1128,7 @@ module Vips
|
|
1130
1128
|
# @see xyz
|
1131
1129
|
# @return [Image] image converted to polar coordinates
|
1132
1130
|
def polar
|
1133
|
-
Image::run_cmplx(self) {|x| x.complex :polar}
|
1131
|
+
Image::run_cmplx(self) { |x| x.complex :polar }
|
1134
1132
|
end
|
1135
1133
|
|
1136
1134
|
# Return an image with polar pixels converted to rectangular.
|
@@ -1143,7 +1141,7 @@ module Vips
|
|
1143
1141
|
# @see xyz
|
1144
1142
|
# @return [Image] image converted to rectangular coordinates
|
1145
1143
|
def rect
|
1146
|
-
Image::run_cmplx(self) {|x| x.complex :rect}
|
1144
|
+
Image::run_cmplx(self) { |x| x.complex :rect }
|
1147
1145
|
end
|
1148
1146
|
|
1149
1147
|
# Return the complex conjugate of an image.
|
@@ -1155,7 +1153,7 @@ module Vips
|
|
1155
1153
|
#
|
1156
1154
|
# @return [Image] complex conjugate
|
1157
1155
|
def conj
|
1158
|
-
Image::run_cmplx(self) {|x| x.complex :conj}
|
1156
|
+
Image::run_cmplx(self) { |x| x.complex :conj }
|
1159
1157
|
end
|
1160
1158
|
|
1161
1159
|
# Calculate the cross phase of two images.
|
@@ -1305,7 +1303,7 @@ module Vips
|
|
1305
1303
|
# @option opts [Boolean] :blend (false) Blend smoothly between th and el
|
1306
1304
|
# @return [Image] merged image
|
1307
1305
|
def ifthenelse(th, el, **opts)
|
1308
|
-
match_image = [th, el, self].find {|x| x.is_a? Vips::Image}
|
1306
|
+
match_image = [th, el, self].find { |x| x.is_a? Vips::Image }
|
1309
1307
|
|
1310
1308
|
unless th.is_a? Vips::Image
|
1311
1309
|
th = Operation.imageize match_image, th
|
@@ -1325,12 +1323,10 @@ module Vips
|
|
1325
1323
|
def scaleimage **opts
|
1326
1324
|
Vips::Image.scale self, opts
|
1327
1325
|
end
|
1328
|
-
|
1329
1326
|
end
|
1330
1327
|
end
|
1331
1328
|
|
1332
1329
|
module Vips
|
1333
|
-
|
1334
1330
|
# This method generates yard comments for all the dynamically bound
|
1335
1331
|
# vips operations.
|
1336
1332
|
#
|
@@ -1348,23 +1344,24 @@ module Vips
|
|
1348
1344
|
|
1349
1345
|
# map gobject's type names to Ruby
|
1350
1346
|
map_go_to_ruby = {
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
|
1356
|
-
|
1357
|
-
|
1358
|
-
|
1359
|
-
|
1360
|
-
|
1361
|
-
|
1347
|
+
"gboolean" => "Boolean",
|
1348
|
+
"gint" => "Integer",
|
1349
|
+
"gdouble" => "Float",
|
1350
|
+
"gfloat" => "Float",
|
1351
|
+
"gchararray" => "String",
|
1352
|
+
"VipsImage" => "Vips::Image",
|
1353
|
+
"VipsInterpolate" => "Vips::Interpolate",
|
1354
|
+
"VipsArrayDouble" => "Array<Double>",
|
1355
|
+
"VipsArrayInt" => "Array<Integer>",
|
1356
|
+
"VipsArrayImage" => "Array<Image>",
|
1357
|
+
"VipsArrayString" => "Array<String>",
|
1362
1358
|
}
|
1363
1359
|
|
1364
1360
|
generate_operation = lambda do |gtype, nickname, op|
|
1365
1361
|
op_flags = op.get_flags
|
1366
1362
|
return if (op_flags & OPERATION_DEPRECATED) != 0
|
1367
1363
|
return if no_generate.include? nickname
|
1364
|
+
|
1368
1365
|
description = Vips::vips_object_get_description op
|
1369
1366
|
|
1370
1367
|
# find and classify all the arguments the operator can take
|
@@ -1373,7 +1370,7 @@ module Vips
|
|
1373
1370
|
required_output = []
|
1374
1371
|
optional_output = []
|
1375
1372
|
member_x = nil
|
1376
|
-
op.argument_map do |pspec, argument_class,
|
1373
|
+
op.argument_map do |pspec, argument_class, _argument_instance|
|
1377
1374
|
arg_flags = argument_class[:flags]
|
1378
1375
|
next if (arg_flags & ARGUMENT_CONSTRUCT) == 0
|
1379
1376
|
next if (arg_flags & ARGUMENT_DEPRECATED) != 0
|
@@ -1388,15 +1385,17 @@ module Vips
|
|
1388
1385
|
type_name = map_go_to_ruby[type_name]
|
1389
1386
|
end
|
1390
1387
|
if fundamental == GObject::GFLAGS_TYPE ||
|
1391
|
-
|
1388
|
+
fundamental == GObject::GENUM_TYPE
|
1392
1389
|
type_name = "Vips::" + type_name[/Vips(.*)/, 1]
|
1393
1390
|
end
|
1394
1391
|
blurb = GObject::g_param_spec_get_blurb pspec
|
1395
|
-
value = {
|
1396
|
-
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1392
|
+
value = {
|
1393
|
+
name: name,
|
1394
|
+
flags: arg_flags,
|
1395
|
+
gtype: gtype,
|
1396
|
+
type_name: type_name,
|
1397
|
+
blurb: blurb
|
1398
|
+
}
|
1400
1399
|
|
1401
1400
|
if (arg_flags & ARGUMENT_INPUT) != 0
|
1402
1401
|
if (arg_flags & ARGUMENT_REQUIRED) != 0
|
@@ -1414,35 +1413,33 @@ module Vips
|
|
1414
1413
|
|
1415
1414
|
# MODIFY INPUT args count as OUTPUT as well
|
1416
1415
|
if (arg_flags & ARGUMENT_OUTPUT) != 0 ||
|
1417
|
-
|
1418
|
-
|
1416
|
+
((arg_flags & ARGUMENT_INPUT) != 0 &&
|
1417
|
+
(arg_flags & ARGUMENT_MODIFY) != 0)
|
1419
1418
|
if (arg_flags & ARGUMENT_REQUIRED) != 0
|
1420
1419
|
required_output << value
|
1421
1420
|
else
|
1422
1421
|
optional_output << value
|
1423
1422
|
end
|
1424
1423
|
end
|
1425
|
-
|
1426
1424
|
end
|
1427
1425
|
|
1428
1426
|
print "# @!method "
|
1429
1427
|
print "self." unless member_x
|
1430
1428
|
print "#{nickname}("
|
1431
|
-
print required_input.map{|x| x[:name]}.join(", ")
|
1429
|
+
print required_input.map { |x| x[:name] }.join(", ")
|
1432
1430
|
print ", " if required_input.length > 0
|
1433
1431
|
puts "**opts)"
|
1434
1432
|
|
1435
1433
|
puts "# #{description.capitalize}."
|
1436
1434
|
|
1437
1435
|
required_input.each do |arg|
|
1438
|
-
puts "# @param #{arg[:name]} [#{arg[:type_name]}] "
|
1439
|
-
"#{arg[:blurb]}"
|
1436
|
+
puts "# @param #{arg[:name]} [#{arg[:type_name]}] #{arg[:blurb]}"
|
1440
1437
|
end
|
1441
1438
|
|
1442
1439
|
puts "# @param opts [Hash] Set of options"
|
1443
1440
|
optional_input.each do |arg|
|
1444
1441
|
puts "# @option opts [#{arg[:type_name]}] :#{arg[:name]} " +
|
1445
|
-
|
1442
|
+
"#{arg[:blurb]}"
|
1446
1443
|
end
|
1447
1444
|
optional_output.each do |arg|
|
1448
1445
|
print "# @option opts [#{arg[:type_name]}] :#{arg[:name]}"
|
@@ -1454,16 +1451,16 @@ module Vips
|
|
1454
1451
|
print "nil"
|
1455
1452
|
elsif required_output.length == 1
|
1456
1453
|
print required_output.first[:type_name]
|
1457
|
-
|
1458
|
-
|
1459
|
-
print required_output.map{|x| x[:type_name]}.join(", ")
|
1454
|
+
else
|
1455
|
+
print "Array<"
|
1456
|
+
print required_output.map { |x| x[:type_name] }.join(", ")
|
1460
1457
|
print ">"
|
1461
1458
|
end
|
1462
1459
|
if optional_output.length > 0
|
1463
1460
|
print ", Hash<Symbol => Object>"
|
1464
1461
|
end
|
1465
1462
|
print "] "
|
1466
|
-
print required_output.map{|x| x[:blurb]}.join(", ")
|
1463
|
+
print required_output.map { |x| x[:blurb] }.join(", ")
|
1467
1464
|
if optional_output.length > 0
|
1468
1465
|
print ", " if required_output.length > 0
|
1469
1466
|
print "Hash of optional output items"
|
@@ -1473,14 +1470,15 @@ module Vips
|
|
1473
1470
|
puts ""
|
1474
1471
|
end
|
1475
1472
|
|
1476
|
-
generate_class = lambda do |gtype,
|
1473
|
+
generate_class = lambda do |gtype, _|
|
1477
1474
|
nickname = Vips::nickname_find gtype
|
1478
1475
|
|
1479
1476
|
if nickname
|
1480
1477
|
begin
|
1481
1478
|
# can fail for abstract types
|
1482
1479
|
op = Vips::Operation.new nickname
|
1483
|
-
|
1480
|
+
rescue Vips::Error
|
1481
|
+
nil
|
1484
1482
|
end
|
1485
1483
|
|
1486
1484
|
generate_operation.(gtype, nickname, op) if op
|
@@ -1498,5 +1496,4 @@ module Vips
|
|
1498
1496
|
puts " end"
|
1499
1497
|
puts "end"
|
1500
1498
|
end
|
1501
|
-
|
1502
1499
|
end
|
data/lib/vips/interesting.rb
CHANGED
data/lib/vips/interpolate.rb
CHANGED
@@ -1,5 +1,4 @@
|
|
1
1
|
module Vips
|
2
|
-
|
3
2
|
attach_function :vips_interpolate_new, [:string], :pointer
|
4
3
|
|
5
4
|
# An interpolator. One of these can be given to operations like
|
@@ -30,7 +29,6 @@ module Vips
|
|
30
29
|
# ```
|
31
30
|
|
32
31
|
class Interpolate < Vips::Object
|
33
|
-
|
34
32
|
# the layout of the VipsInterpolate struct
|
35
33
|
module InterpolateLayout
|
36
34
|
def self.included base
|
@@ -43,12 +41,10 @@ module Vips
|
|
43
41
|
|
44
42
|
class Struct < Vips::Object::Struct
|
45
43
|
include InterpolateLayout
|
46
|
-
|
47
44
|
end
|
48
45
|
|
49
46
|
class ManagedStruct < Vips::Object::ManagedStruct
|
50
47
|
include InterpolateLayout
|
51
|
-
|
52
48
|
end
|
53
49
|
|
54
50
|
def initialize name
|
@@ -57,6 +53,5 @@ module Vips
|
|
57
53
|
|
58
54
|
super ptr
|
59
55
|
end
|
60
|
-
|
61
56
|
end
|
62
57
|
end
|
data/lib/vips/interpretation.rb
CHANGED