Method: GObject::GValue#set

Defined in:
lib/vips/gvalue.rb

#set(value) ⇒ Object

Set the value of a GValue. The value is converted to the type of the GValue, if possible.

Parameters:

  • value (Any)

    The value to set



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
# File 'lib/vips/gvalue.rb', line 124

def set value
  # GLib::logger.debug("GObject::GValue.set") {
  #     "value = #{value.inspect[0..50]}"
  # }

  gtype = self[:gtype]
  fundamental = ::GObject.g_type_fundamental gtype

  case gtype
  when GBOOL_TYPE
    ::GObject.g_value_set_boolean self, (value ? 1 : 0)

  when GINT_TYPE
    ::GObject.g_value_set_int self, value

  when GUINT64_TYPE
    ::GObject.g_value_set_uint64 self, value

  when GDOUBLE_TYPE
    ::GObject.g_value_set_double self, value

  when GSTR_TYPE
    ::GObject.g_value_set_string self, value

  when Vips::REFSTR_TYPE
    ::Vips.vips_value_set_ref_string self, value

  when Vips::ARRAY_INT_TYPE
    value = [value] unless value.is_a? Array

    Vips.vips_value_set_array_int self, nil, value.length
    ptr = Vips.vips_value_get_array_int self, nil
    ptr.write_array_of_int32 value

  when Vips::ARRAY_DOUBLE_TYPE
    value = [value] unless value.is_a? Array

    # this will allocate an array in the gvalue
    Vips.vips_value_set_array_double self, nil, value.length

    # pull the array out and fill it
    ptr = Vips.vips_value_get_array_double self, nil

    ptr.write_array_of_double value

  when Vips::ARRAY_IMAGE_TYPE
    value = [value] unless value.is_a? Array

    Vips.vips_value_set_array_image self, value.length
    ptr = Vips.vips_value_get_array_image self, nil
    ptr.write_array_of_pointer value

    # the gvalue needs a ref on each of the images
    value.each { |image| ::GObject.g_object_ref image }

  when Vips::BLOB_TYPE
    len = value.bytesize
    ptr = GLib.g_malloc len
    Vips.vips_value_set_blob self, GLib::G_FREE, ptr, len
    ptr.write_bytes value

  else
    case fundamental
    when GFLAGS_TYPE
      flags_value = GValue.flags_from_nick(self[:gtype], value)
      ::GObject.g_value_set_flags self, flags_value

    when GENUM_TYPE
      enum_value = GValue.enum_from_nick(self[:gtype], value)
      ::GObject.g_value_set_enum self, enum_value

    when GOBJECT_TYPE
      ::GObject.g_value_set_object self, value

    else
      raise Vips::Error, "unimplemented gtype for set: " \
        "#{::GObject.g_type_name gtype} (#{gtype})"
    end
  end
end