@@ -56,6 +56,9 @@ gvalue.blob_type = gobject_lib.g_type_from_name("VipsBlob")
56
56
gvalue .band_format_type = gobject_lib .g_type_from_name (" VipsBandFormat" )
57
57
gvalue .blend_mode_type = version .at_least (8 , 6 ) and gobject_lib .g_type_from_name (" VipsBlendMode" ) or 0
58
58
59
+ -- gvalue.*_type can be of type cdata or number depending on the OS and Lua version
60
+ -- gtypes as returned by vips_lib can also be of type cdata or number
61
+ -- cdata and number are not comparable with Standard Lua (using luaffi-tkl)
59
62
gvalue .comparable_type = type (gvalue .gdouble_type ) == " number" and
60
63
function (gtype ) return tonumber (gtype ) end or
61
64
function (gtype ) return gtype end
@@ -86,27 +89,27 @@ gvalue.init = function(gv, gtype)
86
89
end
87
90
88
91
gvalue .set = function (gv , value )
89
- local gtype_raw = gv .gtype
90
- local gtype = gvalue .comparable_type (gtype_raw )
91
- local fundamental = gobject_lib .g_type_fundamental (gtype_raw )
92
+ local gtype = gv .gtype
93
+ local gtype_comp = gvalue .comparable_type (gtype )
94
+ local fundamental = gobject_lib .g_type_fundamental (gtype )
92
95
93
- if gtype == gvalue .gbool_type then
96
+ if gtype_comp == gvalue .gbool_type then
94
97
gobject_lib .g_value_set_boolean (gv , value )
95
- elseif gtype == gvalue .gint_type then
98
+ elseif gtype_comp == gvalue .gint_type then
96
99
gobject_lib .g_value_set_int (gv , value )
97
- elseif gtype == gvalue .gdouble_type then
100
+ elseif gtype_comp == gvalue .gdouble_type then
98
101
gobject_lib .g_value_set_double (gv , value )
99
102
elseif fundamental == gvalue .genum_type then
100
- gobject_lib .g_value_set_enum (gv , gvalue .to_enum (gtype_raw , value ))
103
+ gobject_lib .g_value_set_enum (gv , gvalue .to_enum (gtype , value ))
101
104
elseif fundamental == gvalue .gflags_type then
102
105
gobject_lib .g_value_set_flags (gv , value )
103
- elseif gtype == gvalue .gstr_type then
106
+ elseif gtype_comp == gvalue .gstr_type then
104
107
gobject_lib .g_value_set_string (gv , value )
105
- elseif gtype == gvalue .refstr_type then
108
+ elseif gtype_comp == gvalue .refstr_type then
106
109
gobject_lib .vips_value_set_ref_string (gv , value )
107
- elseif gtype == gvalue .image_type then
110
+ elseif gtype_comp == gvalue .image_type then
108
111
gobject_lib .g_value_set_object (gv , value .vimage )
109
- elseif gtype == gvalue .array_int_type then
112
+ elseif gtype_comp == gvalue .array_int_type then
110
113
if type (value ) == " number" then
111
114
value = { value }
112
115
end
@@ -115,7 +118,7 @@ gvalue.set = function(gv, value)
115
118
local a = ffi .new (gvalue .int_arr_typeof , n , value )
116
119
117
120
vips_lib .vips_value_set_array_int (gv , a , n )
118
- elseif gtype == gvalue .array_double_type then
121
+ elseif gtype_comp == gvalue .array_double_type then
119
122
if type (value ) == " number" then
120
123
value = { value }
121
124
end
@@ -124,7 +127,7 @@ gvalue.set = function(gv, value)
124
127
local a = ffi .new (gvalue .double_arr_typeof , n , value )
125
128
126
129
vips_lib .vips_value_set_array_double (gv , a , n )
127
- elseif gtype == gvalue .array_image_type then
130
+ elseif gtype_comp == gvalue .array_image_type then
128
131
if Image .is_Image (value ) then
129
132
value = { value }
130
133
end
@@ -139,7 +142,7 @@ gvalue.set = function(gv, value)
139
142
-- the gvalue needs a set of refs to own
140
143
gobject_lib .g_object_ref (a [i ])
141
144
end
142
- elseif gtype == gvalue .blob_type then
145
+ elseif gtype_comp == gvalue .blob_type then
143
146
-- we need to set the blob to a copy of the lua string that vips
144
147
-- can own
145
148
local n = # value
@@ -153,27 +156,27 @@ gvalue.set = function(gv, value)
153
156
vips_lib .vips_value_set_blob (gv , glib_lib .g_free , buf , n )
154
157
end
155
158
else
156
- error (" unsupported gtype for set " .. gvalue .type_name (gtype_raw ))
159
+ error (" unsupported gtype for set " .. gvalue .type_name (gtype ))
157
160
end
158
161
end
159
162
160
163
gvalue .get = function (gv )
161
- local gtype_raw = gv .gtype
162
- local gtype = gvalue .comparable_type (gtype_raw )
163
- local fundamental = gobject_lib .g_type_fundamental (gtype_raw )
164
+ local gtype = gv .gtype
165
+ local gtype_comp = gvalue .comparable_type (gtype )
166
+ local fundamental = gobject_lib .g_type_fundamental (gtype )
164
167
165
168
local result
166
169
167
- if gtype == gvalue .gbool_type then
170
+ if gtype_comp == gvalue .gbool_type then
168
171
result = gobject_lib .g_value_get_boolean (gv )
169
- elseif gtype == gvalue .gint_type then
172
+ elseif gtype_comp == gvalue .gint_type then
170
173
result = gobject_lib .g_value_get_int (gv )
171
- elseif gtype == gvalue .gdouble_type then
174
+ elseif gtype_comp == gvalue .gdouble_type then
172
175
result = gobject_lib .g_value_get_double (gv )
173
176
elseif fundamental == gvalue .genum_type then
174
177
local enum_value = gobject_lib .g_value_get_enum (gv )
175
178
176
- local cstr = vips_lib .vips_enum_nick (gtype_raw , enum_value )
179
+ local cstr = vips_lib .vips_enum_nick (gtype , enum_value )
177
180
178
181
if cstr == ffi .NULL then
179
182
error (" value not in enum" )
@@ -182,21 +185,21 @@ gvalue.get = function(gv)
182
185
result = ffi .string (cstr )
183
186
elseif fundamental == gvalue .gflags_type then
184
187
result = gobject_lib .g_value_get_flags (gv )
185
- elseif gtype == gvalue .gstr_type then
188
+ elseif gtype_comp == gvalue .gstr_type then
186
189
local cstr = gobject_lib .g_value_get_string (gv )
187
190
188
191
if cstr ~= ffi .NULL then
189
192
result = ffi .string (cstr )
190
193
else
191
194
result = nil
192
195
end
193
- elseif gtype == gvalue .refstr_type then
196
+ elseif gtype_comp == gvalue .refstr_type then
194
197
local psize = ffi .new (gvalue .psize_typeof , 1 )
195
198
196
199
local cstr = vips_lib .vips_value_get_ref_string (gv , psize )
197
200
198
201
result = ffi .string (cstr , tonumber (psize [0 ]))
199
- elseif gtype == gvalue .image_type then
202
+ elseif gtype_comp == gvalue .image_type then
200
203
-- g_value_get_object() will not add a ref ... that is
201
204
-- held by the gvalue
202
205
local vo = gobject_lib .g_value_get_object (gv )
@@ -208,7 +211,7 @@ gvalue.get = function(gv)
208
211
gobject_lib .g_object_ref (vimage )
209
212
210
213
result = Image .new (vimage )
211
- elseif gtype == gvalue .array_int_type then
214
+ elseif gtype_comp == gvalue .array_int_type then
212
215
local pint = ffi .new (gvalue .pint_typeof , 1 )
213
216
214
217
local array = vips_lib .vips_value_get_array_int (gv , pint )
@@ -217,15 +220,15 @@ gvalue.get = function(gv)
217
220
result [i + 1 ] = array [i ]
218
221
end
219
222
220
- elseif gtype == gvalue .array_double_type then
223
+ elseif gtype_comp == gvalue .array_double_type then
221
224
local pint = ffi .new (gvalue .pint_typeof , 1 )
222
225
223
226
local array = vips_lib .vips_value_get_array_double (gv , pint )
224
227
result = {}
225
228
for i = 0 , pint [0 ] - 1 do
226
229
result [i + 1 ] = array [i ]
227
230
end
228
- elseif gtype == gvalue .array_image_type then
231
+ elseif gtype_comp == gvalue .array_image_type then
229
232
local pint = ffi .new (gvalue .pint_typeof , 1 )
230
233
231
234
local array = vips_lib .vips_value_get_array_image (gv , pint )
@@ -240,14 +243,14 @@ gvalue.get = function(gv)
240
243
241
244
result [i + 1 ] = Image .new (vimage )
242
245
end
243
- elseif gtype == gvalue .blob_type then
246
+ elseif gtype_comp == gvalue .blob_type then
244
247
local psize = ffi .new (gvalue .psize_typeof , 1 )
245
248
246
249
local array = vips_lib .vips_value_get_blob (gv , psize )
247
250
248
251
result = ffi .string (array , tonumber (psize [0 ]))
249
252
else
250
- error (" unsupported gtype for get " .. gvalue .type_name (gtype_raw ))
253
+ error (" unsupported gtype for get " .. gvalue .type_name (gtype ))
251
254
end
252
255
253
256
return result
0 commit comments