vips 8.8.4 → 8.12.1

Sign up to get free protection for your applications and to get access to all the features.
data/lib/vips/gvalue.rb CHANGED
@@ -3,7 +3,7 @@
3
3
  # Author:: John Cupitt (mailto:jcupitt@gmail.com)
4
4
  # License:: MIT
5
5
 
6
- require 'ffi'
6
+ require "ffi"
7
7
 
8
8
  module GObject
9
9
  # Represent a GValue. Example use:
@@ -13,6 +13,8 @@ module GObject
13
13
  # gvalue.init GObject::GDOUBLE_TYPE
14
14
  # gvalue.set 3.1415
15
15
  # value = gvalue.get
16
+ # # optional -- drop any ref the gvalue had
17
+ # gvalue.unset
16
18
  # ```
17
19
  #
18
20
  # Lifetime is managed automatically. It doesn't know about all GType values,
@@ -20,14 +22,16 @@ module GObject
20
22
 
21
23
  class GValue < FFI::ManagedStruct
22
24
  layout :gtype, :GType,
23
- :data, [:ulong_long, 2]
25
+ :data, [:ulong_long, 2]
24
26
 
25
27
  # convert an enum value (str/symb/int) into an int ready for libvips
26
28
  def self.from_nick(gtype, value)
27
29
  value = value.to_s if value.is_a? Symbol
28
30
 
29
31
  if value.is_a? String
30
- value = Vips::vips_enum_from_nick "ruby-vips", gtype, value
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("_", "-")
31
35
  if value == -1
32
36
  raise Vips::Error
33
37
  end
@@ -38,8 +42,8 @@ module GObject
38
42
 
39
43
  # convert an int enum back into a symbol
40
44
  def self.to_nick(gtype, enum_value)
41
- enum_name = Vips::vips_enum_nick gtype, enum_value
42
- if enum_name == nil
45
+ enum_name = Vips.vips_enum_nick gtype, enum_value
46
+ if enum_name.nil?
43
47
  raise Vips::Error
44
48
  end
45
49
 
@@ -48,7 +52,7 @@ module GObject
48
52
 
49
53
  def self.release ptr
50
54
  # GLib::logger.debug("GObject::GValue::release") {"ptr = #{ptr}"}
51
- ::GObject::g_value_unset ptr
55
+ ::GObject.g_value_unset ptr
52
56
  end
53
57
 
54
58
  # Allocate memory for a GValue and return a class wrapper. Memory will
@@ -66,14 +70,14 @@ module GObject
66
70
  pointer = FFI::Pointer.new GValue, memory
67
71
 
68
72
  # ... and wrap in a GValue
69
- return GValue.new pointer
73
+ GValue.new pointer
70
74
  end
71
75
 
72
76
  # Set the type of thing a gvalue can hold.
73
77
  #
74
78
  # @param gtype [GType] the type of thing this GValue can hold.
75
79
  def init gtype
76
- ::GObject::g_value_init self, gtype
80
+ ::GObject.g_value_init self, gtype
77
81
  end
78
82
 
79
83
  # Set the value of a GValue. The value is converted to the type of the
@@ -86,76 +90,76 @@ module GObject
86
90
  # }
87
91
 
88
92
  gtype = self[:gtype]
89
- fundamental = ::GObject::g_type_fundamental gtype
93
+ fundamental = ::GObject.g_type_fundamental gtype
90
94
 
91
95
  case gtype
92
96
  when GBOOL_TYPE
93
- ::GObject::g_value_set_boolean self, (value ? 1 : 0)
97
+ ::GObject.g_value_set_boolean self, (value ? 1 : 0)
94
98
 
95
99
  when GINT_TYPE
96
- ::GObject::g_value_set_int self, value
100
+ ::GObject.g_value_set_int self, value
97
101
 
98
102
  when GUINT64_TYPE
99
- ::GObject::g_value_set_uint64 self, value
103
+ ::GObject.g_value_set_uint64 self, value
100
104
 
101
105
  when GDOUBLE_TYPE
102
- ::GObject::g_value_set_double self, value
106
+ ::GObject.g_value_set_double self, value
103
107
 
104
108
  when GSTR_TYPE
105
- ::GObject::g_value_set_string self, value
109
+ ::GObject.g_value_set_string self, value
106
110
 
107
111
  when Vips::REFSTR_TYPE
108
- ::Vips::vips_value_set_ref_string self, value
112
+ ::Vips.vips_value_set_ref_string self, value
109
113
 
110
114
  when Vips::ARRAY_INT_TYPE
111
115
  value = [value] unless value.is_a? Array
112
116
 
113
- Vips::vips_value_set_array_int self, nil, value.length
114
- ptr = Vips::vips_value_get_array_int self, nil
117
+ Vips.vips_value_set_array_int self, nil, value.length
118
+ ptr = Vips.vips_value_get_array_int self, nil
115
119
  ptr.write_array_of_int32 value
116
120
 
117
121
  when Vips::ARRAY_DOUBLE_TYPE
118
122
  value = [value] unless value.is_a? Array
119
123
 
120
124
  # this will allocate an array in the gvalue
121
- Vips::vips_value_set_array_double self, nil, value.length
125
+ Vips.vips_value_set_array_double self, nil, value.length
122
126
 
123
127
  # pull the array out and fill it
124
- ptr = Vips::vips_value_get_array_double self, nil
128
+ ptr = Vips.vips_value_get_array_double self, nil
125
129
 
126
130
  ptr.write_array_of_double value
127
131
 
128
132
  when Vips::ARRAY_IMAGE_TYPE
129
133
  value = [value] unless value.is_a? Array
130
134
 
131
- Vips::vips_value_set_array_image self, value.length
132
- ptr = Vips::vips_value_get_array_image self, nil
135
+ Vips.vips_value_set_array_image self, value.length
136
+ ptr = Vips.vips_value_get_array_image self, nil
133
137
  ptr.write_array_of_pointer value
134
138
 
135
139
  # the gvalue needs a ref on each of the images
136
- value.each { |image| ::GObject::g_object_ref image }
140
+ value.each { |image| ::GObject.g_object_ref image }
137
141
 
138
142
  when Vips::BLOB_TYPE
139
143
  len = value.bytesize
140
- ptr = GLib::g_malloc len
141
- Vips::vips_value_set_blob self, GLib::G_FREE, ptr, len
144
+ ptr = GLib.g_malloc len
145
+ Vips.vips_value_set_blob self, GLib::G_FREE, ptr, len
142
146
  ptr.write_bytes value
143
147
 
144
148
  else
145
149
  case fundamental
146
150
  when GFLAGS_TYPE
147
- ::GObject::g_value_set_flags self, value
151
+ ::GObject.g_value_set_flags self, value
148
152
 
149
153
  when GENUM_TYPE
150
154
  enum_value = GValue.from_nick(self[:gtype], value)
151
- ::GObject::g_value_set_enum self, enum_value
155
+ ::GObject.g_value_set_enum self, enum_value
152
156
 
153
157
  when GOBJECT_TYPE
154
- ::GObject::g_value_set_object self, value
158
+ ::GObject.g_value_set_object self, value
155
159
 
156
160
  else
157
- raise Vips::Error, "unimplemented gtype for set: " +
158
- "#{::GObject::g_type_name gtype} (#{gtype})"
161
+ raise Vips::Error, "unimplemented gtype for set: " \
162
+ "#{::GObject.g_type_name gtype} (#{gtype})"
159
163
  end
160
164
  end
161
165
  end
@@ -166,72 +170,72 @@ module GObject
166
170
  # @return [Any] the value held by the GValue
167
171
  def get
168
172
  gtype = self[:gtype]
169
- fundamental = ::GObject::g_type_fundamental gtype
173
+ fundamental = ::GObject.g_type_fundamental gtype
170
174
  result = nil
171
175
 
172
176
  case gtype
173
177
  when GBOOL_TYPE
174
- result = ::GObject::g_value_get_boolean(self) != 0 ? true : false
178
+ result = ::GObject.g_value_get_boolean(self) != 0
175
179
 
176
180
  when GINT_TYPE
177
- result = ::GObject::g_value_get_int self
181
+ result = ::GObject.g_value_get_int self
178
182
 
179
183
  when GUINT64_TYPE
180
- result = ::GObject::g_value_get_uint64 self
184
+ result = ::GObject.g_value_get_uint64 self
181
185
 
182
186
  when GDOUBLE_TYPE
183
- result = ::GObject::g_value_get_double self
187
+ result = ::GObject.g_value_get_double self
184
188
 
185
189
  when GSTR_TYPE
186
- result = ::GObject::g_value_get_string self
190
+ result = ::GObject.g_value_get_string self
187
191
 
188
192
  when Vips::REFSTR_TYPE
189
193
  len = Vips::SizeStruct.new
190
- result = ::Vips::vips_value_get_ref_string self, len
194
+ result = ::Vips.vips_value_get_ref_string self, len
191
195
 
192
196
  when Vips::ARRAY_INT_TYPE
193
197
  len = Vips::IntStruct.new
194
- array = Vips::vips_value_get_array_int self, len
198
+ array = Vips.vips_value_get_array_int self, len
195
199
  result = array.get_array_of_int32 0, len[:value]
196
200
 
197
201
  when Vips::ARRAY_DOUBLE_TYPE
198
202
  len = Vips::IntStruct.new
199
- array = Vips::vips_value_get_array_double self, len
203
+ array = Vips.vips_value_get_array_double self, len
200
204
  result = array.get_array_of_double 0, len[:value]
201
205
 
202
206
  when Vips::ARRAY_IMAGE_TYPE
203
207
  len = Vips::IntStruct.new
204
- array = Vips::vips_value_get_array_image self, len
208
+ array = Vips.vips_value_get_array_image self, len
205
209
  result = array.get_array_of_pointer 0, len[:value]
206
210
  result.map! do |pointer|
207
- ::GObject::g_object_ref pointer
211
+ ::GObject.g_object_ref pointer
208
212
  Vips::Image.new pointer
209
213
  end
210
214
 
211
215
  when Vips::BLOB_TYPE
212
216
  len = Vips::SizeStruct.new
213
- array = Vips::vips_value_get_blob self, len
217
+ array = Vips.vips_value_get_blob self, len
214
218
  result = array.get_bytes 0, len[:value]
215
219
 
216
220
  else
217
221
  case fundamental
218
222
  when GFLAGS_TYPE
219
- result = ::GObject::g_value_get_flags self
223
+ result = ::GObject.g_value_get_flags self
220
224
 
221
225
  when GENUM_TYPE
222
- enum_value = ::GObject::g_value_get_enum(self)
226
+ enum_value = ::GObject.g_value_get_enum(self)
223
227
  result = GValue.to_nick self[:gtype], enum_value
224
228
 
225
229
  when GOBJECT_TYPE
226
- obj = ::GObject::g_value_get_object self
230
+ obj = ::GObject.g_value_get_object self
227
231
  # g_value_get_object() does not add a ref ... we need to add
228
232
  # one to match the unref in gobject release
229
- ::GObject::g_object_ref obj
233
+ ::GObject.g_object_ref obj
230
234
  result = Vips::Image.new obj
231
235
 
232
236
  else
233
- raise Vips::Error, "unimplemented gtype for get: " +
234
- "#{::GObject::g_type_name gtype} (#{gtype})"
237
+ raise Vips::Error, "unimplemented gtype for get: " \
238
+ "#{::GObject.g_type_name gtype} (#{gtype})"
235
239
  end
236
240
  end
237
241
 
@@ -239,7 +243,15 @@ module GObject
239
243
  # "result = #{result.inspect[0..50]}"
240
244
  # }
241
245
 
242
- return result
246
+ result
247
+ end
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
243
255
  end
244
256
  end
245
257
 
@@ -269,7 +281,7 @@ module GObject
269
281
 
270
282
  # use :pointer rather than GObject.ptr to avoid casting later
271
283
  attach_function :g_object_set_property,
272
- [:pointer, :string, GValue.ptr], :void
284
+ [:pointer, :string, GValue.ptr], :void
273
285
  attach_function :g_object_get_property,
274
- [:pointer, :string, GValue.ptr], :void
286
+ [:pointer, :string, GValue.ptr], :void
275
287
  end