ruby-vips 2.0.14 → 2.1.1
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/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- data/.github/workflows/test.yml +80 -0
- data/.standard.yml +17 -0
- data/.yardopts +0 -1
- data/CHANGELOG.md +41 -0
- data/Gemfile +3 -1
- data/README.md +42 -41
- data/Rakefile +13 -21
- data/TODO +18 -10
- data/VERSION +1 -1
- data/example/annotate.rb +6 -6
- data/example/connection.rb +26 -0
- data/example/daltonize8.rb +16 -18
- data/example/draw_lines.rb +30 -0
- data/example/example1.rb +5 -6
- data/example/example2.rb +6 -6
- data/example/example3.rb +5 -5
- data/example/example4.rb +4 -4
- data/example/example5.rb +6 -7
- data/example/inheritance_with_refcount.rb +36 -54
- data/example/progress.rb +30 -0
- data/example/thumb.rb +8 -10
- data/example/trim8.rb +5 -5
- data/example/watermark.rb +2 -2
- data/example/wobble.rb +1 -1
- data/lib/ruby-vips.rb +1 -1
- data/lib/vips.rb +199 -93
- 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 +29 -27
- data/lib/vips/coding.rb +0 -1
- data/lib/vips/compass_direction.rb +0 -1
- data/lib/vips/connection.rb +46 -0
- data/lib/vips/direction.rb +0 -1
- data/lib/vips/extend.rb +0 -1
- data/lib/vips/gobject.rb +26 -15
- data/lib/vips/gvalue.rb +61 -55
- data/lib/vips/image.rb +455 -282
- data/lib/vips/interesting.rb +0 -1
- data/lib/vips/interpolate.rb +3 -7
- data/lib/vips/interpretation.rb +0 -1
- data/lib/vips/kernel.rb +0 -1
- data/lib/vips/methods.rb +791 -124
- data/lib/vips/mutableimage.rb +173 -0
- data/lib/vips/object.rb +178 -68
- data/lib/vips/operation.rb +277 -130
- 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/region.rb +73 -0
- data/lib/vips/size.rb +0 -1
- data/lib/vips/source.rb +88 -0
- data/lib/vips/sourcecustom.rb +89 -0
- data/lib/vips/target.rb +86 -0
- data/lib/vips/targetcustom.rb +77 -0
- data/lib/vips/version.rb +1 -2
- data/ruby-vips.gemspec +26 -21
- metadata +39 -51
- data/.rubocop.yml +0 -10
- data/.rubocop_todo.yml +0 -730
- data/.travis.yml +0 -62
- data/install-vips.sh +0 -26
data/lib/vips/align.rb
CHANGED
data/lib/vips/angle.rb
CHANGED
data/lib/vips/angle45.rb
CHANGED
data/lib/vips/bandformat.rb
CHANGED
data/lib/vips/blend_mode.rb
CHANGED
@@ -1,34 +1,36 @@
|
|
1
1
|
module Vips
|
2
|
-
|
3
2
|
# Blend mode to use when compositing images. See {Image#composite}.
|
4
3
|
#
|
5
|
-
# `:clear`
|
6
|
-
# `:source`
|
7
|
-
# `:over`
|
8
|
-
#
|
9
|
-
# `:
|
10
|
-
#
|
11
|
-
# `:
|
12
|
-
# `:
|
13
|
-
#
|
14
|
-
# `:
|
15
|
-
#
|
16
|
-
# `:
|
17
|
-
# `:
|
18
|
-
# `:
|
19
|
-
# `:
|
20
|
-
# `:
|
21
|
-
# `:
|
22
|
-
# `:
|
23
|
-
# `:
|
24
|
-
# `:
|
25
|
-
# `:
|
26
|
-
# `:
|
27
|
-
# `:
|
28
|
-
# `:
|
29
|
-
# `:
|
4
|
+
# * `:clear` where the second object is drawn, the first is removed
|
5
|
+
# * `:source` the second object is drawn as if nothing were below
|
6
|
+
# * `:over` the image shows what you would expect if you held two
|
7
|
+
# semi-transparent slides on top of each other
|
8
|
+
# * `:in` the first object is removed completely, the second is only
|
9
|
+
# drawn where the first was
|
10
|
+
# * `:out` the second is drawn only where the first isn't
|
11
|
+
# * `:atop` this leaves the first object mostly intact, but mixes both
|
12
|
+
# objects in the overlapping area
|
13
|
+
# * `:dest` leaves the first object untouched, the second is discarded
|
14
|
+
# completely
|
15
|
+
# * `:dest_over` like `:over`, but swaps the arguments
|
16
|
+
# * `:dest_in` like `:in`, but swaps the arguments
|
17
|
+
# * `:dest_out` like `:out`, but swaps the arguments
|
18
|
+
# * `:dest_atop` like `:atop`, but swaps the arguments
|
19
|
+
# * `:xor` something like a difference operator
|
20
|
+
# * `:add` a bit like adding the two images
|
21
|
+
# * `:saturate` a bit like the darker of the two
|
22
|
+
# * `:multiply` at least as dark as the darker of the two inputs
|
23
|
+
# * `:screen` at least as light as the lighter of the inputs
|
24
|
+
# * `:overlay` multiplies or screens colors, depending on the lightness
|
25
|
+
# * `:darken` the darker of each component
|
26
|
+
# * `:lighten` the lighter of each component
|
27
|
+
# * `:colour_dodge` brighten first by a factor second
|
28
|
+
# * `:colour_burn` darken first by a factor of second
|
29
|
+
# * `:hard_light` multiply or screen, depending on lightness
|
30
|
+
# * `:soft_light` darken or lighten, depending on lightness
|
31
|
+
# * `:difference` difference of the two
|
32
|
+
# * `:exclusion` somewhat like `:difference`, but lower-contrast
|
30
33
|
|
31
34
|
class BlendMode < Symbol
|
32
35
|
end
|
33
36
|
end
|
34
|
-
|
data/lib/vips/coding.rb
CHANGED
@@ -0,0 +1,46 @@
|
|
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_connection_filename, [:pointer], :string
|
12
|
+
attach_function :vips_connection_nick, [:pointer], :string
|
13
|
+
end
|
14
|
+
|
15
|
+
# Abstract base class for connections.
|
16
|
+
class Connection < Vips::Object
|
17
|
+
# The layout of the VipsRegion struct.
|
18
|
+
module ConnectionLayout
|
19
|
+
def self.included(base)
|
20
|
+
base.class_eval do
|
21
|
+
layout :parent, Vips::Object::Struct
|
22
|
+
# rest opaque
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
class Struct < Vips::Object::Struct
|
28
|
+
include ConnectionLayout
|
29
|
+
end
|
30
|
+
|
31
|
+
class ManagedStruct < Vips::Object::ManagedStruct
|
32
|
+
include ConnectionLayout
|
33
|
+
end
|
34
|
+
|
35
|
+
# Get any filename associated with a connection, or nil.
|
36
|
+
def filename
|
37
|
+
Vips.vips_connection_filename self
|
38
|
+
end
|
39
|
+
|
40
|
+
# Get a nickname (short description) of a connection that could be shown to
|
41
|
+
# the user.
|
42
|
+
def nick
|
43
|
+
Vips.vips_connection_nick self
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
data/lib/vips/direction.rb
CHANGED
data/lib/vips/extend.rb
CHANGED
data/lib/vips/gobject.rb
CHANGED
@@ -4,11 +4,10 @@
|
|
4
4
|
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
5
5
|
# License:: MIT
|
6
6
|
|
7
|
-
require
|
8
|
-
require
|
7
|
+
require "ffi"
|
8
|
+
require "forwardable"
|
9
9
|
|
10
10
|
module GObject
|
11
|
-
|
12
11
|
# we have a number of things we need to inherit in different ways:
|
13
12
|
#
|
14
13
|
# - we want to be able to subclass GObject in Ruby in a simple way
|
@@ -38,13 +37,15 @@ module GObject
|
|
38
37
|
def_instance_delegators :@struct, :[], :to_ptr
|
39
38
|
def_single_delegators :ffi_struct, :ptr
|
40
39
|
|
40
|
+
attr_reader :references
|
41
|
+
|
41
42
|
# the layout of the GObject struct
|
42
43
|
module GObjectLayout
|
43
44
|
def self.included base
|
44
45
|
base.class_eval do
|
45
46
|
layout :g_type_instance, :pointer,
|
46
|
-
|
47
|
-
|
47
|
+
:ref_count, :uint,
|
48
|
+
:qdata, :pointer
|
48
49
|
end
|
49
50
|
end
|
50
51
|
end
|
@@ -57,14 +58,13 @@ module GObject
|
|
57
58
|
# GLib::logger.debug("GObject::GObject::ManagedStruct.release") {
|
58
59
|
# "unreffing #{ptr}"
|
59
60
|
# }
|
60
|
-
::GObject
|
61
|
+
::GObject.g_object_unref ptr
|
61
62
|
end
|
62
63
|
end
|
63
64
|
|
64
65
|
# the plain struct ... cast with this
|
65
66
|
class Struct < FFI::Struct
|
66
67
|
include GObjectLayout
|
67
|
-
|
68
68
|
end
|
69
69
|
|
70
70
|
# don't allow ptr == nil, we never want to allocate a GObject struct
|
@@ -74,7 +74,11 @@ module GObject
|
|
74
74
|
# need the unref
|
75
75
|
def initialize ptr
|
76
76
|
# GLib::logger.debug("GObject::GObject.initialize") {"ptr = #{ptr}"}
|
77
|
+
@ptr = ptr
|
77
78
|
@struct = ffi_managed_struct.new ptr
|
79
|
+
|
80
|
+
# sometimes we need to keep refs across C calls ... hide them here
|
81
|
+
@references = []
|
78
82
|
end
|
79
83
|
|
80
84
|
# access to the casting struct for this class
|
@@ -82,9 +86,13 @@ module GObject
|
|
82
86
|
self.class.ffi_struct
|
83
87
|
end
|
84
88
|
|
89
|
+
# get the pointer we were built from ... #to_ptr gets the pointer after we
|
90
|
+
# have wrapped it up with an auto unref
|
91
|
+
attr_reader :ptr
|
92
|
+
|
85
93
|
class << self
|
86
94
|
def ffi_struct
|
87
|
-
|
95
|
+
const_get :Struct
|
88
96
|
end
|
89
97
|
end
|
90
98
|
|
@@ -95,28 +103,31 @@ module GObject
|
|
95
103
|
|
96
104
|
class << self
|
97
105
|
def ffi_managed_struct
|
98
|
-
|
106
|
+
const_get :ManagedStruct
|
99
107
|
end
|
100
108
|
end
|
101
|
-
|
102
109
|
end
|
103
110
|
|
104
111
|
class GParamSpec < FFI::Struct
|
105
112
|
# the first few public fields
|
106
113
|
layout :g_type_instance, :pointer,
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
114
|
+
:name, :string,
|
115
|
+
:flags, :uint,
|
116
|
+
:value_type, :GType,
|
117
|
+
:owner_type, :GType
|
111
118
|
end
|
112
119
|
|
113
120
|
class GParamSpecPtr < FFI::Struct
|
114
121
|
layout :value, GParamSpec.ptr
|
115
122
|
end
|
116
123
|
|
117
|
-
attach_function :g_param_spec_get_blurb, [
|
124
|
+
attach_function :g_param_spec_get_blurb, [:pointer], :string
|
118
125
|
|
119
126
|
attach_function :g_object_ref, [:pointer], :void
|
120
127
|
attach_function :g_object_unref, [:pointer], :void
|
121
128
|
|
129
|
+
# we just use one gcallback type for every signal, hopefully this is OK
|
130
|
+
callback :gcallback, [:pointer], :void
|
131
|
+
attach_function :g_signal_connect_data,
|
132
|
+
[:pointer, :string, :gcallback, :pointer, :pointer, :int], :long
|
122
133
|
end
|
data/lib/vips/gvalue.rb
CHANGED
@@ -3,10 +3,9 @@
|
|
3
3
|
# Author:: John Cupitt (mailto:jcupitt@gmail.com)
|
4
4
|
# License:: MIT
|
5
5
|
|
6
|
-
require
|
6
|
+
require "ffi"
|
7
7
|
|
8
8
|
module GObject
|
9
|
-
|
10
9
|
# Represent a GValue. Example use:
|
11
10
|
#
|
12
11
|
# ```ruby
|
@@ -14,6 +13,8 @@ module GObject
|
|
14
13
|
# gvalue.init GObject::GDOUBLE_TYPE
|
15
14
|
# gvalue.set 3.1415
|
16
15
|
# value = gvalue.get
|
16
|
+
# # optional -- drop any ref the gvalue had
|
17
|
+
# gvalue.unset
|
17
18
|
# ```
|
18
19
|
#
|
19
20
|
# Lifetime is managed automatically. It doesn't know about all GType values,
|
@@ -21,14 +22,16 @@ module GObject
|
|
21
22
|
|
22
23
|
class GValue < FFI::ManagedStruct
|
23
24
|
layout :gtype, :GType,
|
24
|
-
|
25
|
+
:data, [:ulong_long, 2]
|
25
26
|
|
26
27
|
# convert an enum value (str/symb/int) into an int ready for libvips
|
27
28
|
def self.from_nick(gtype, value)
|
28
29
|
value = value.to_s if value.is_a? Symbol
|
29
30
|
|
30
31
|
if value.is_a? String
|
31
|
-
|
32
|
+
# libvips expects "-" as a separator in enum names, but "_" is more
|
33
|
+
# convenient for ruby, eg. :b_w
|
34
|
+
value = Vips.vips_enum_from_nick "ruby-vips", gtype, value.tr("_", "-")
|
32
35
|
if value == -1
|
33
36
|
raise Vips::Error
|
34
37
|
end
|
@@ -39,8 +42,8 @@ module GObject
|
|
39
42
|
|
40
43
|
# convert an int enum back into a symbol
|
41
44
|
def self.to_nick(gtype, enum_value)
|
42
|
-
enum_name = Vips
|
43
|
-
if enum_name
|
45
|
+
enum_name = Vips.vips_enum_nick gtype, enum_value
|
46
|
+
if enum_name.nil?
|
44
47
|
raise Vips::Error
|
45
48
|
end
|
46
49
|
|
@@ -49,7 +52,7 @@ module GObject
|
|
49
52
|
|
50
53
|
def self.release ptr
|
51
54
|
# GLib::logger.debug("GObject::GValue::release") {"ptr = #{ptr}"}
|
52
|
-
::GObject
|
55
|
+
::GObject.g_value_unset ptr
|
53
56
|
end
|
54
57
|
|
55
58
|
# Allocate memory for a GValue and return a class wrapper. Memory will
|
@@ -67,14 +70,14 @@ module GObject
|
|
67
70
|
pointer = FFI::Pointer.new GValue, memory
|
68
71
|
|
69
72
|
# ... and wrap in a GValue
|
70
|
-
|
73
|
+
GValue.new pointer
|
71
74
|
end
|
72
75
|
|
73
76
|
# Set the type of thing a gvalue can hold.
|
74
77
|
#
|
75
78
|
# @param gtype [GType] the type of thing this GValue can hold.
|
76
79
|
def init gtype
|
77
|
-
::GObject
|
80
|
+
::GObject.g_value_init self, gtype
|
78
81
|
end
|
79
82
|
|
80
83
|
# Set the value of a GValue. The value is converted to the type of the
|
@@ -87,77 +90,76 @@ module GObject
|
|
87
90
|
# }
|
88
91
|
|
89
92
|
gtype = self[:gtype]
|
90
|
-
fundamental = ::GObject
|
93
|
+
fundamental = ::GObject.g_type_fundamental gtype
|
91
94
|
|
92
95
|
case gtype
|
93
96
|
when GBOOL_TYPE
|
94
|
-
::GObject
|
97
|
+
::GObject.g_value_set_boolean self, (value ? 1 : 0)
|
95
98
|
|
96
99
|
when GINT_TYPE
|
97
|
-
::GObject
|
100
|
+
::GObject.g_value_set_int self, value
|
98
101
|
|
99
102
|
when GUINT64_TYPE
|
100
|
-
::GObject
|
103
|
+
::GObject.g_value_set_uint64 self, value
|
101
104
|
|
102
105
|
when GDOUBLE_TYPE
|
103
|
-
::GObject
|
106
|
+
::GObject.g_value_set_double self, value
|
104
107
|
|
105
108
|
when GSTR_TYPE
|
106
|
-
::GObject
|
109
|
+
::GObject.g_value_set_string self, value
|
107
110
|
|
108
111
|
when Vips::REFSTR_TYPE
|
109
|
-
::Vips
|
112
|
+
::Vips.vips_value_set_ref_string self, value
|
110
113
|
|
111
114
|
when Vips::ARRAY_INT_TYPE
|
112
115
|
value = [value] unless value.is_a? Array
|
113
116
|
|
114
|
-
Vips
|
115
|
-
ptr = Vips
|
117
|
+
Vips.vips_value_set_array_int self, nil, value.length
|
118
|
+
ptr = Vips.vips_value_get_array_int self, nil
|
116
119
|
ptr.write_array_of_int32 value
|
117
120
|
|
118
121
|
when Vips::ARRAY_DOUBLE_TYPE
|
119
122
|
value = [value] unless value.is_a? Array
|
120
123
|
|
121
124
|
# this will allocate an array in the gvalue
|
122
|
-
Vips
|
125
|
+
Vips.vips_value_set_array_double self, nil, value.length
|
123
126
|
|
124
127
|
# pull the array out and fill it
|
125
|
-
ptr = Vips
|
128
|
+
ptr = Vips.vips_value_get_array_double self, nil
|
126
129
|
|
127
130
|
ptr.write_array_of_double value
|
128
131
|
|
129
132
|
when Vips::ARRAY_IMAGE_TYPE
|
130
133
|
value = [value] unless value.is_a? Array
|
131
134
|
|
132
|
-
Vips
|
133
|
-
ptr = Vips
|
135
|
+
Vips.vips_value_set_array_image self, value.length
|
136
|
+
ptr = Vips.vips_value_get_array_image self, nil
|
134
137
|
ptr.write_array_of_pointer value
|
135
138
|
|
136
139
|
# the gvalue needs a ref on each of the images
|
137
|
-
value.each {|image| ::GObject
|
140
|
+
value.each { |image| ::GObject.g_object_ref image }
|
138
141
|
|
139
142
|
when Vips::BLOB_TYPE
|
140
143
|
len = value.bytesize
|
141
|
-
ptr = GLib
|
142
|
-
Vips
|
144
|
+
ptr = GLib.g_malloc len
|
145
|
+
Vips.vips_value_set_blob self, GLib::G_FREE, ptr, len
|
143
146
|
ptr.write_bytes value
|
144
147
|
|
145
148
|
else
|
146
149
|
case fundamental
|
147
150
|
when GFLAGS_TYPE
|
148
|
-
::GObject
|
151
|
+
::GObject.g_value_set_flags self, value
|
149
152
|
|
150
153
|
when GENUM_TYPE
|
151
154
|
enum_value = GValue.from_nick(self[:gtype], value)
|
152
|
-
::GObject
|
155
|
+
::GObject.g_value_set_enum self, enum_value
|
153
156
|
|
154
157
|
when GOBJECT_TYPE
|
155
|
-
::GObject
|
158
|
+
::GObject.g_value_set_object self, value
|
156
159
|
|
157
160
|
else
|
158
|
-
raise Vips::Error, "unimplemented gtype for set: "
|
159
|
-
|
160
|
-
|
161
|
+
raise Vips::Error, "unimplemented gtype for set: " \
|
162
|
+
"#{::GObject.g_type_name gtype} (#{gtype})"
|
161
163
|
end
|
162
164
|
end
|
163
165
|
end
|
@@ -168,73 +170,72 @@ module GObject
|
|
168
170
|
# @return [Any] the value held by the GValue
|
169
171
|
def get
|
170
172
|
gtype = self[:gtype]
|
171
|
-
fundamental = ::GObject
|
173
|
+
fundamental = ::GObject.g_type_fundamental gtype
|
172
174
|
result = nil
|
173
175
|
|
174
176
|
case gtype
|
175
177
|
when GBOOL_TYPE
|
176
|
-
result = ::GObject
|
178
|
+
result = ::GObject.g_value_get_boolean(self) != 0
|
177
179
|
|
178
180
|
when GINT_TYPE
|
179
|
-
result = ::GObject
|
181
|
+
result = ::GObject.g_value_get_int self
|
180
182
|
|
181
183
|
when GUINT64_TYPE
|
182
|
-
result = ::GObject
|
184
|
+
result = ::GObject.g_value_get_uint64 self
|
183
185
|
|
184
186
|
when GDOUBLE_TYPE
|
185
|
-
result = ::GObject
|
187
|
+
result = ::GObject.g_value_get_double self
|
186
188
|
|
187
189
|
when GSTR_TYPE
|
188
|
-
result = ::GObject
|
190
|
+
result = ::GObject.g_value_get_string self
|
189
191
|
|
190
192
|
when Vips::REFSTR_TYPE
|
191
193
|
len = Vips::SizeStruct.new
|
192
|
-
result = ::Vips
|
194
|
+
result = ::Vips.vips_value_get_ref_string self, len
|
193
195
|
|
194
196
|
when Vips::ARRAY_INT_TYPE
|
195
197
|
len = Vips::IntStruct.new
|
196
|
-
array = Vips
|
198
|
+
array = Vips.vips_value_get_array_int self, len
|
197
199
|
result = array.get_array_of_int32 0, len[:value]
|
198
200
|
|
199
201
|
when Vips::ARRAY_DOUBLE_TYPE
|
200
202
|
len = Vips::IntStruct.new
|
201
|
-
array = Vips
|
203
|
+
array = Vips.vips_value_get_array_double self, len
|
202
204
|
result = array.get_array_of_double 0, len[:value]
|
203
205
|
|
204
206
|
when Vips::ARRAY_IMAGE_TYPE
|
205
207
|
len = Vips::IntStruct.new
|
206
|
-
array = Vips
|
208
|
+
array = Vips.vips_value_get_array_image self, len
|
207
209
|
result = array.get_array_of_pointer 0, len[:value]
|
208
210
|
result.map! do |pointer|
|
209
|
-
::GObject
|
211
|
+
::GObject.g_object_ref pointer
|
210
212
|
Vips::Image.new pointer
|
211
213
|
end
|
212
214
|
|
213
215
|
when Vips::BLOB_TYPE
|
214
216
|
len = Vips::SizeStruct.new
|
215
|
-
array = Vips
|
217
|
+
array = Vips.vips_value_get_blob self, len
|
216
218
|
result = array.get_bytes 0, len[:value]
|
217
219
|
|
218
220
|
else
|
219
221
|
case fundamental
|
220
222
|
when GFLAGS_TYPE
|
221
|
-
result = ::GObject
|
223
|
+
result = ::GObject.g_value_get_flags self
|
222
224
|
|
223
225
|
when GENUM_TYPE
|
224
|
-
enum_value = ::GObject
|
226
|
+
enum_value = ::GObject.g_value_get_enum(self)
|
225
227
|
result = GValue.to_nick self[:gtype], enum_value
|
226
228
|
|
227
229
|
when GOBJECT_TYPE
|
228
|
-
obj = ::GObject
|
230
|
+
obj = ::GObject.g_value_get_object self
|
229
231
|
# g_value_get_object() does not add a ref ... we need to add
|
230
232
|
# one to match the unref in gobject release
|
231
|
-
::GObject
|
233
|
+
::GObject.g_object_ref obj
|
232
234
|
result = Vips::Image.new obj
|
233
235
|
|
234
236
|
else
|
235
|
-
raise Vips::Error, "unimplemented gtype for get: "
|
236
|
-
|
237
|
-
|
237
|
+
raise Vips::Error, "unimplemented gtype for get: " \
|
238
|
+
"#{::GObject.g_type_name gtype} (#{gtype})"
|
238
239
|
end
|
239
240
|
end
|
240
241
|
|
@@ -242,10 +243,16 @@ module GObject
|
|
242
243
|
# "result = #{result.inspect[0..50]}"
|
243
244
|
# }
|
244
245
|
|
245
|
-
|
246
|
-
|
246
|
+
result
|
247
247
|
end
|
248
248
|
|
249
|
+
# Clear the thing held by a GValue.
|
250
|
+
#
|
251
|
+
# This happens automatically when a GValue is GCed, but this method can be
|
252
|
+
# handy if you need to drop a reference explicitly for some reason.
|
253
|
+
def unset
|
254
|
+
::GObject.g_value_unset self
|
255
|
+
end
|
249
256
|
end
|
250
257
|
|
251
258
|
attach_function :g_value_init, [GValue.ptr, :GType], :void
|
@@ -274,8 +281,7 @@ module GObject
|
|
274
281
|
|
275
282
|
# use :pointer rather than GObject.ptr to avoid casting later
|
276
283
|
attach_function :g_object_set_property,
|
277
|
-
|
284
|
+
[:pointer, :string, GValue.ptr], :void
|
278
285
|
attach_function :g_object_get_property,
|
279
|
-
|
280
|
-
|
286
|
+
[:pointer, :string, GValue.ptr], :void
|
281
287
|
end
|