vips 8.8.4 → 8.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/README.md +3 -1
- data/example/connection.rb +17 -0
- data/example/progress.rb +30 -0
- data/lib/vips.rb +91 -19
- data/lib/vips/connection.rb +46 -0
- data/lib/vips/gobject.rb +9 -1
- data/lib/vips/gvalue.rb +13 -1
- data/lib/vips/image.rb +226 -158
- data/lib/vips/object.rb +117 -5
- data/lib/vips/operation.rb +156 -80
- data/lib/vips/region.rb +73 -0
- data/lib/vips/source.rb +89 -0
- data/lib/vips/sourcecustom.rb +90 -0
- data/lib/vips/target.rb +87 -0
- data/lib/vips/targetcustom.rb +78 -0
- data/lib/vips/version.rb +1 -1
- metadata +11 -4
- data/CHANGELOG.md +0 -273
data/lib/vips/region.rb
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
# This module provides an interface to the top level bits of libvips
|
2
|
+
# via ruby-ffi.
|
3
|
+
#
|
4
|
+
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
require 'ffi'
|
8
|
+
|
9
|
+
module Vips
|
10
|
+
attach_function :vips_region_new, [:pointer], :pointer
|
11
|
+
|
12
|
+
if Vips::at_least_libvips?(8, 8)
|
13
|
+
attach_function :vips_region_fetch, [:pointer, :int, :int, :int, :int, SizeStruct.ptr], :pointer
|
14
|
+
attach_function :vips_region_width, [:pointer], :int
|
15
|
+
attach_function :vips_region_height, [:pointer], :int
|
16
|
+
end
|
17
|
+
|
18
|
+
# A region on an image. Create one, then use `fetch` to quickly get a region
|
19
|
+
# of pixels.
|
20
|
+
#
|
21
|
+
# For example:
|
22
|
+
#
|
23
|
+
# ```ruby
|
24
|
+
# region = Vips::Region.new(image)
|
25
|
+
# pixels = region.fetch(10, 10, 100, 100)
|
26
|
+
# ```
|
27
|
+
class Region < Vips::Object
|
28
|
+
# The layout of the VipsRegion struct.
|
29
|
+
module RegionLayout
|
30
|
+
def self.included(base)
|
31
|
+
base.class_eval do
|
32
|
+
layout :parent, Vips::Object::Struct
|
33
|
+
# rest opaque
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Struct < Vips::Object::Struct
|
39
|
+
include RegionLayout
|
40
|
+
end
|
41
|
+
|
42
|
+
class ManagedStruct < Vips::Object::ManagedStruct
|
43
|
+
include RegionLayout
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize(name)
|
47
|
+
ptr = Vips::vips_region_new name
|
48
|
+
raise Vips::Error if ptr.null?
|
49
|
+
|
50
|
+
super ptr
|
51
|
+
end
|
52
|
+
|
53
|
+
def width
|
54
|
+
Vips::vips_region_width self
|
55
|
+
end
|
56
|
+
|
57
|
+
def height
|
58
|
+
Vips::vips_region_height self
|
59
|
+
end
|
60
|
+
|
61
|
+
# Fetch a region filled with pixel data.
|
62
|
+
def fetch(left, top, width, height)
|
63
|
+
len = Vips::SizeStruct.new
|
64
|
+
ptr = Vips::vips_region_fetch self, left, top, width, height, len
|
65
|
+
raise Vips::Error if ptr.null?
|
66
|
+
|
67
|
+
# wrap up as an autopointer
|
68
|
+
ptr = FFI::AutoPointer.new(ptr, GLib::G_FREE)
|
69
|
+
|
70
|
+
ptr.get_bytes 0, len[:value]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
data/lib/vips/source.rb
ADDED
@@ -0,0 +1,89 @@
|
|
1
|
+
# This module provides an interface to the top level bits of libvips
|
2
|
+
# via ruby-ffi.
|
3
|
+
#
|
4
|
+
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
require 'ffi'
|
8
|
+
|
9
|
+
module Vips
|
10
|
+
if Vips::at_least_libvips?(8, 9)
|
11
|
+
attach_function :vips_source_new_from_descriptor, [:int], :pointer
|
12
|
+
attach_function :vips_source_new_from_file, [:pointer], :pointer
|
13
|
+
attach_function :vips_source_new_from_memory, [:pointer, :size_t], :pointer
|
14
|
+
end
|
15
|
+
|
16
|
+
# A source. For example:
|
17
|
+
#
|
18
|
+
# ```ruby
|
19
|
+
# source = Vips::Source.new_from_file("k2.jpg")
|
20
|
+
# image = Vips::Image.new_from_source(source)
|
21
|
+
# ```
|
22
|
+
class Source < Vips::Connection
|
23
|
+
module SourceLayout
|
24
|
+
def self.included(base)
|
25
|
+
base.class_eval do
|
26
|
+
layout :parent, Vips::Connection::Struct
|
27
|
+
# rest opaque
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
class Struct < Vips::Connection::Struct
|
33
|
+
include SourceLayout
|
34
|
+
end
|
35
|
+
|
36
|
+
class ManagedStruct < Vips::Connection::ManagedStruct
|
37
|
+
include SourceLayout
|
38
|
+
end
|
39
|
+
|
40
|
+
# Create a new source from a file descriptor. File descriptors are
|
41
|
+
# small integers, for example 0 is stdin.
|
42
|
+
#
|
43
|
+
# Pass sources to {Image.new_from_source} to load images from
|
44
|
+
# them.
|
45
|
+
#
|
46
|
+
# @param descriptor [Integer] the file descriptor
|
47
|
+
# @return [Source] the new Vips::Source
|
48
|
+
def self.new_from_descriptor(descriptor)
|
49
|
+
ptr = Vips::vips_source_new_from_descriptor descriptor
|
50
|
+
raise Vips::Error if ptr.null?
|
51
|
+
|
52
|
+
Vips::Source.new ptr
|
53
|
+
end
|
54
|
+
|
55
|
+
# Create a new source from a file name.
|
56
|
+
#
|
57
|
+
# Pass sources to {Image.new_from_source} to load images from
|
58
|
+
# them.
|
59
|
+
#
|
60
|
+
# @param filename [String] the name of the file
|
61
|
+
# @return [Source] the new Vips::Source
|
62
|
+
def self.new_from_file(filename)
|
63
|
+
raise Vips::Error, "filename is nil" if filename.nil?
|
64
|
+
ptr = Vips::vips_source_new_from_file filename
|
65
|
+
raise Vips::Error if ptr.null?
|
66
|
+
|
67
|
+
Vips::Source.new ptr
|
68
|
+
end
|
69
|
+
|
70
|
+
# Create a new source from an area of memory. Memory areas can be
|
71
|
+
# strings, arrays and so forth -- anything that supports bytesize.
|
72
|
+
#
|
73
|
+
# Pass sources to {Image.new_from_source} to load images from
|
74
|
+
# them.
|
75
|
+
#
|
76
|
+
# @param data [String] memory area
|
77
|
+
# @return [Source] the new Vips::Source
|
78
|
+
def self.new_from_memory(data)
|
79
|
+
ptr = Vips::vips_source_new_from_memory data, data.bytesize
|
80
|
+
raise Vips::Error if ptr.null?
|
81
|
+
|
82
|
+
# FIXME do we need to keep a ref to the underlying memory area? what
|
83
|
+
# about Image.new_from_buffer? Does that need a secret ref too?
|
84
|
+
|
85
|
+
Vips::Source.new ptr
|
86
|
+
end
|
87
|
+
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
# This module provides an interface to the top level bits of libvips
|
2
|
+
# via ruby-ffi.
|
3
|
+
#
|
4
|
+
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
require 'ffi'
|
8
|
+
|
9
|
+
module Vips
|
10
|
+
if Vips::at_least_libvips?(8, 9)
|
11
|
+
attach_function :vips_source_custom_new, [], :pointer
|
12
|
+
end
|
13
|
+
|
14
|
+
# A source you can attach action signal handlers to to implement
|
15
|
+
# custom input types.
|
16
|
+
#
|
17
|
+
# For example:
|
18
|
+
#
|
19
|
+
# ```ruby
|
20
|
+
# file = File.open "some/file/name", "rb"
|
21
|
+
# source = Vips::SourceCustom.new
|
22
|
+
# source.on_read { |length| file.read length }
|
23
|
+
# image = Vips::Image.new_from_source source
|
24
|
+
# ```
|
25
|
+
#
|
26
|
+
# (just an example -- of course in practice you'd use {Source#new_from_file}
|
27
|
+
# to read from a named file)
|
28
|
+
class SourceCustom < Vips::Source
|
29
|
+
module SourceCustomLayout
|
30
|
+
def self.included(base)
|
31
|
+
base.class_eval do
|
32
|
+
layout :parent, Vips::Source::Struct
|
33
|
+
# rest opaque
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Struct < Vips::Source::Struct
|
39
|
+
include SourceCustomLayout
|
40
|
+
end
|
41
|
+
|
42
|
+
class ManagedStruct < Vips::Source::ManagedStruct
|
43
|
+
include SourceCustomLayout
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
pointer = Vips::vips_source_custom_new
|
48
|
+
raise Vips::Error if pointer.null?
|
49
|
+
|
50
|
+
super pointer
|
51
|
+
end
|
52
|
+
|
53
|
+
# The block is executed to read data from the source. The interface is
|
54
|
+
# exactly as IO::read, ie. it takes a maximum number of bytes to read and
|
55
|
+
# returns a string of bytes from the source, or nil if the source is already
|
56
|
+
# at end of file.
|
57
|
+
#
|
58
|
+
# @yieldparam length [Integer] Read and return up to this many bytes
|
59
|
+
# @yieldreturn [String] Up to length bytes of data, or nil for EOF
|
60
|
+
def on_read &block
|
61
|
+
signal_connect "read" do |buf, len|
|
62
|
+
chunk = block.call len
|
63
|
+
return 0 if chunk == nil
|
64
|
+
bytes_read = chunk.bytesize
|
65
|
+
buf.put_bytes(0, chunk, 0, bytes_read)
|
66
|
+
chunk.clear
|
67
|
+
|
68
|
+
bytes_read
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
# The block is executed to seek the source. The interface is exactly as
|
73
|
+
# IO::seek, ie. it should take an offset and whence, and return the
|
74
|
+
# new read position.
|
75
|
+
#
|
76
|
+
# This handler is optional -- if you do not attach a seek handler,
|
77
|
+
# {Source} will treat your source like an unseekable pipe object and
|
78
|
+
# do extra caching.
|
79
|
+
#
|
80
|
+
# @yieldparam offset [Integer] Seek offset
|
81
|
+
# @yieldparam whence [Integer] Seek whence
|
82
|
+
# @yieldreturn [Integer] the new read position, or -1 on error
|
83
|
+
def on_seek &block
|
84
|
+
signal_connect "seek" do |offset, whence|
|
85
|
+
block.call offset, whence
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
end
|
data/lib/vips/target.rb
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
# This module provides an interface to the top level bits of libvips
|
2
|
+
# via ruby-ffi.
|
3
|
+
#
|
4
|
+
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
require 'ffi'
|
8
|
+
|
9
|
+
module Vips
|
10
|
+
if Vips::at_least_libvips?(8, 9)
|
11
|
+
attach_function :vips_target_new_to_descriptor, [:int], :pointer
|
12
|
+
attach_function :vips_target_new_to_file, [:string], :pointer
|
13
|
+
attach_function :vips_target_new_to_memory, [], :pointer
|
14
|
+
end
|
15
|
+
|
16
|
+
# A target. For example:
|
17
|
+
#
|
18
|
+
# ```ruby
|
19
|
+
# target = Vips::Target.new_to_file('k2.jpg')
|
20
|
+
# image.write_to_target(target, '.jpg')
|
21
|
+
# ```
|
22
|
+
class Target < Vips::Connection
|
23
|
+
# The layout of the VipsRegion struct.
|
24
|
+
module TargetLayout
|
25
|
+
def self.included(base)
|
26
|
+
base.class_eval do
|
27
|
+
layout :parent, Vips::Connection::Struct
|
28
|
+
# rest opaque
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
class Struct < Vips::Connection::Struct
|
34
|
+
include TargetLayout
|
35
|
+
end
|
36
|
+
|
37
|
+
class ManagedStruct < Vips::Connection::ManagedStruct
|
38
|
+
include TargetLayout
|
39
|
+
end
|
40
|
+
|
41
|
+
# Create a new target to a file descriptor. File descriptors are
|
42
|
+
# small integers, for example 1 is stdout.
|
43
|
+
#
|
44
|
+
# Pass targets to {Image#write_to_target} to write images to
|
45
|
+
# them.
|
46
|
+
#
|
47
|
+
# @param descriptor [Integer] the file descriptor
|
48
|
+
# @return [Target] the new Vips::Target
|
49
|
+
def self.new_to_descriptor(descriptor)
|
50
|
+
ptr = Vips::vips_target_new_to_descriptor descriptor
|
51
|
+
raise Vips::Error if ptr.null?
|
52
|
+
|
53
|
+
Vips::Target.new ptr
|
54
|
+
end
|
55
|
+
|
56
|
+
# Create a new target to a file name.
|
57
|
+
#
|
58
|
+
# Pass targets to {Image#write_to_target} to write images to
|
59
|
+
# them.
|
60
|
+
#
|
61
|
+
# @param filename [String] the name of the file
|
62
|
+
# @return [Target] the new Vips::Target
|
63
|
+
def self.new_to_file(filename)
|
64
|
+
raise Vips::Error, 'filename is nil' if filename.nil?
|
65
|
+
ptr = Vips::vips_target_new_to_file filename
|
66
|
+
raise Vips::Error if ptr.null?
|
67
|
+
|
68
|
+
Vips::Target.new ptr
|
69
|
+
end
|
70
|
+
|
71
|
+
# Create a new target to an area of memory.
|
72
|
+
#
|
73
|
+
# Pass targets to {Image#write_to_target} to write images to
|
74
|
+
# them.
|
75
|
+
#
|
76
|
+
# Once the image has been written, use {Object#get}`("blob")` to read out
|
77
|
+
# the data.
|
78
|
+
#
|
79
|
+
# @return [Target] the new Vips::Target
|
80
|
+
def self.new_to_memory
|
81
|
+
ptr = Vips::vips_target_new_to_memory
|
82
|
+
|
83
|
+
Vips::Target.new ptr
|
84
|
+
end
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# This module provides an interface to the top level bits of libvips
|
2
|
+
# via ruby-ffi.
|
3
|
+
#
|
4
|
+
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
|
+
# License:: MIT
|
6
|
+
|
7
|
+
require 'ffi'
|
8
|
+
|
9
|
+
module Vips
|
10
|
+
if Vips::at_least_libvips?(8, 9)
|
11
|
+
attach_function :vips_target_custom_new, [], :pointer
|
12
|
+
end
|
13
|
+
|
14
|
+
# A target you can attach action signal handlers to to implememt
|
15
|
+
# custom output types.
|
16
|
+
#
|
17
|
+
# For example:
|
18
|
+
#
|
19
|
+
# ```ruby
|
20
|
+
# file = File.open "some/file/name", "wb"
|
21
|
+
# target = Vips::TargetCustom.new
|
22
|
+
# target.on_write { |bytes| file.write bytes }
|
23
|
+
# image.write_to_target target, ".png"
|
24
|
+
# ```
|
25
|
+
#
|
26
|
+
# (just an example -- of course in practice you'd use {Target#new_to_file}
|
27
|
+
# to write to a named file)
|
28
|
+
class TargetCustom < Vips::Target
|
29
|
+
module TargetCustomLayout
|
30
|
+
def self.included(base)
|
31
|
+
base.class_eval do
|
32
|
+
layout :parent, Vips::Target::Struct
|
33
|
+
# rest opaque
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
class Struct < Vips::Target::Struct
|
39
|
+
include TargetCustomLayout
|
40
|
+
end
|
41
|
+
|
42
|
+
class ManagedStruct < Vips::Target::ManagedStruct
|
43
|
+
include TargetCustomLayout
|
44
|
+
end
|
45
|
+
|
46
|
+
def initialize
|
47
|
+
pointer = Vips::vips_target_custom_new
|
48
|
+
raise Vips::Error if pointer.null?
|
49
|
+
|
50
|
+
super pointer
|
51
|
+
end
|
52
|
+
|
53
|
+
# The block is executed to write data to the source. The interface is
|
54
|
+
# exactly as IO::write, ie. it should write the string and return the
|
55
|
+
# number of bytes written.
|
56
|
+
#
|
57
|
+
# @yieldparam bytes [String] Write these bytes to the file
|
58
|
+
# @yieldreturn [Integer] The number of bytes written, or -1 on error
|
59
|
+
def on_write &block
|
60
|
+
signal_connect "write" do |p, len|
|
61
|
+
chunk = p.get_bytes(0, len)
|
62
|
+
bytes_written = block.call chunk
|
63
|
+
chunk.clear
|
64
|
+
|
65
|
+
bytes_written
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
# The block is executed at the end of write. It should do any necessary
|
70
|
+
# finishing action, such as closing a file.
|
71
|
+
def on_finish &block
|
72
|
+
signal_connect "finish" do
|
73
|
+
block.call()
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
end
|
data/lib/vips/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vips
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 8.
|
4
|
+
version: 8.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Cupitt
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2020-03-24 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
@@ -135,11 +135,11 @@ files:
|
|
135
135
|
- ".gitignore"
|
136
136
|
- ".travis.yml"
|
137
137
|
- ".yardopts"
|
138
|
-
- CHANGELOG.md
|
139
138
|
- Gemfile
|
140
139
|
- README.md
|
141
140
|
- Rakefile
|
142
141
|
- example/annotate.rb
|
142
|
+
- example/connection.rb
|
143
143
|
- example/daltonize8.rb
|
144
144
|
- example/example1.rb
|
145
145
|
- example/example2.rb
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- example/example4.rb
|
148
148
|
- example/example5.rb
|
149
149
|
- example/inheritance_with_refcount.rb
|
150
|
+
- example/progress.rb
|
150
151
|
- example/thumb.rb
|
151
152
|
- example/trim8.rb
|
152
153
|
- example/watermark.rb
|
@@ -161,6 +162,7 @@ files:
|
|
161
162
|
- lib/vips/blend_mode.rb
|
162
163
|
- lib/vips/coding.rb
|
163
164
|
- lib/vips/compass_direction.rb
|
165
|
+
- lib/vips/connection.rb
|
164
166
|
- lib/vips/direction.rb
|
165
167
|
- lib/vips/extend.rb
|
166
168
|
- lib/vips/gobject.rb
|
@@ -181,7 +183,12 @@ files:
|
|
181
183
|
- lib/vips/operationmath2.rb
|
182
184
|
- lib/vips/operationrelational.rb
|
183
185
|
- lib/vips/operationround.rb
|
186
|
+
- lib/vips/region.rb
|
184
187
|
- lib/vips/size.rb
|
188
|
+
- lib/vips/source.rb
|
189
|
+
- lib/vips/sourcecustom.rb
|
190
|
+
- lib/vips/target.rb
|
191
|
+
- lib/vips/targetcustom.rb
|
185
192
|
- lib/vips/version.rb
|
186
193
|
- vips.gemspec
|
187
194
|
homepage: https://github.com/ioquatix/vips
|
@@ -203,7 +210,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
203
210
|
- !ruby/object:Gem::Version
|
204
211
|
version: '0'
|
205
212
|
requirements: []
|
206
|
-
rubygems_version: 3.
|
213
|
+
rubygems_version: 3.1.2
|
207
214
|
signing_key:
|
208
215
|
specification_version: 4
|
209
216
|
summary: Vips is a high-performance image manipulation library.
|