@@ -97,110 +97,117 @@ public function unref(): void
97
97
FFI ::gobject ()->g_object_unref ($ this ->pointer );
98
98
}
99
99
100
+ /**
101
+ * @throws Exception
102
+ */
100
103
public function signalConnect (string $ name , Closure $ callback ): void
101
104
{
102
105
$ imageProgressCb = static function (
103
- CData $ gClosure ,
106
+ CData $ gClosure ,
104
107
?CData $ returnValue ,
105
- int $ numberOfParams ,
106
- CData $ params ,
107
- CData $ hint ,
108
+ int $ numberOfParams ,
109
+ CData $ params ,
110
+ CData $ hint ,
108
111
?CData $ data
109
- ) use ($ callback ) {
112
+ ) use (& $ callback ) {
110
113
assert ($ numberOfParams === 3 );
111
114
/**
112
- * Marshal-Signature: void(VipsImage*, void*, void*)
115
+ * Marshal-Signature: void(VipsImage* image , void* progress , void* handle )
113
116
*/
114
- $ vi = \FFI ::cast (FFI ::ctypes ('GObject ' ), FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [1 ])));
117
+ $ vi = \FFI ::cast (FFI ::ctypes ('GObject ' ), FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [0 ])));
115
118
FFI ::gobject ()->g_object_ref ($ vi );
116
119
$ image = new Image ($ vi );
117
- $ pr = \FFI ::cast (FFI ::ctypes ('VipsProgress ' ), FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [2 ])));
120
+ $ pr = \FFI ::cast (FFI ::ctypes ('VipsProgress ' ), FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [1 ])));
118
121
$ callback ($ image , $ pr );
119
122
};
120
123
$ marshalers = ['preeval ' => $ imageProgressCb , 'eval ' => $ imageProgressCb , 'posteval ' => $ imageProgressCb ];
121
124
122
125
if (FFI ::atLeast (8 , 9 )) {
123
126
$ marshalers ['read ' ] = static function (
124
- CData $ gClosure ,
125
- CData $ returnValue ,
126
- int $ numberOfParams ,
127
- CData $ params ,
128
- CData $ hint ,
127
+ CData $ gClosure ,
128
+ CData $ returnValue ,
129
+ int $ numberOfParams ,
130
+ CData $ params ,
131
+ CData $ hint ,
129
132
?CData $ data
130
133
) use (&$ callback ): void {
131
134
assert ($ numberOfParams === 4 );
132
135
/*
133
- * Marshal-Signature: gint64(VipsSourceCustom*, void*, gint64, void*)
136
+ * Marshal-Signature: gint64(VipsSourceCustom* source , void* buffer , gint64 length , void* handle )
134
137
*/
135
138
$ bufferPointer = FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [1 ]));
136
- $ bufferLength = (int ) FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [2 ]));
137
- $ buffer = \FFI ::string ($ bufferPointer , $ bufferLength );
138
- $ returnBufferLength = $ callback ($ buffer );
139
- \FFI ::memcpy ($ bufferPointer , $ buffer , $ returnBufferLength );
139
+ $ bufferLength = (int )FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [2 ]));
140
+ $ returnBuffer = $ callback ($ bufferLength );
141
+ $ returnBufferLength = 0 ;
142
+
143
+ if ($ returnBuffer !== null ) {
144
+ $ returnBufferLength = strlen ($ returnBuffer );
145
+ \FFI ::memcpy ($ bufferPointer , $ returnBuffer , $ returnBufferLength );
146
+ }
140
147
FFI ::gobject ()->g_value_set_int64 ($ returnValue , $ returnBufferLength );
141
148
};
142
149
$ marshalers ['seek ' ] = static function (
143
- CData $ gClosure ,
144
- CData $ returnValue ,
145
- int $ numberOfParams ,
146
- CData $ params ,
147
- CData $ hint ,
150
+ CData $ gClosure ,
151
+ CData $ returnValue ,
152
+ int $ numberOfParams ,
153
+ CData $ params ,
154
+ CData $ hint ,
148
155
?CData $ data
149
156
) use (&$ callback ): void {
150
157
assert ($ numberOfParams === 4 );
151
158
/*
152
- * Marshal-Signature: gint64(VipsSourceCustom*, gint64, int, void*)
159
+ * Marshal-Signature: gint64(VipsSourceCustom* source , gint64 offset , int whence , void* handle )
153
160
*/
154
- $ offset = (int ) FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [1 ]));
155
- $ whence = (int ) FFI ::gobject ()->g_value_get_int (\FFI ::addr ($ params [2 ]));
161
+ $ offset = (int )FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [1 ]));
162
+ $ whence = (int )FFI ::gobject ()->g_value_get_int (\FFI ::addr ($ params [2 ]));
156
163
FFI ::gobject ()->g_value_set_int64 ($ returnValue , $ callback ($ offset , $ whence ));
157
164
};
158
165
$ marshalers ['write ' ] = static function (
159
- CData $ gClosure ,
160
- CData $ returnValue ,
161
- int $ numberOfParams ,
162
- CData $ params ,
163
- CData $ hint ,
166
+ CData $ gClosure ,
167
+ CData $ returnValue ,
168
+ int $ numberOfParams ,
169
+ CData $ params ,
170
+ CData $ hint ,
164
171
?CData $ data
165
172
) use (&$ callback ): void {
166
173
assert ($ numberOfParams === 4 );
167
174
/*
168
- * Marshal-Signature: gint64(VipsTargetCustom*, void*, gint64, void*)
175
+ * Marshal-Signature: gint64(VipsTargetCustom* target , void* buffer , gint64 length , void* handle )
169
176
*/
170
177
$ bufferPointer = FFI ::gobject ()->g_value_get_pointer (\FFI ::addr ($ params [1 ]));
171
- $ bufferLength = (int ) FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [2 ]));
178
+ $ bufferLength = (int )FFI ::gobject ()->g_value_get_int64 (\FFI ::addr ($ params [2 ]));
172
179
$ buffer = \FFI ::string ($ bufferPointer , $ bufferLength );
173
180
$ returnBufferLength = $ callback ($ buffer );
174
181
FFI ::gobject ()->g_value_set_int64 ($ returnValue , $ returnBufferLength );
175
182
};
176
183
$ marshalers ['finish ' ] = static function (
177
- CData $ gClosure ,
184
+ CData $ gClosure ,
178
185
?CData $ returnValue ,
179
- int $ numberOfParams ,
180
- CData $ params ,
181
- CData $ hint ,
186
+ int $ numberOfParams ,
187
+ CData $ params ,
188
+ CData $ hint ,
182
189
?CData $ data
183
190
) use (&$ callback ): void {
184
191
assert ($ numberOfParams === 2 );
185
192
/**
186
- * Marshal-Signature: void(VipsTargetCustom*, void*)
193
+ * Marshal-Signature: void(VipsTargetCustom* target , void* handle )
187
194
*/
188
195
$ callback ();
189
196
};
190
197
}
191
198
192
199
if (FFI ::atLeast (8 , 13 )) {
193
200
$ marshalers ['end ' ] = static function (
194
- CData $ gClosure ,
195
- CData $ returnValue ,
196
- int $ numberOfParams ,
197
- CData $ params ,
198
- CData $ hint ,
201
+ CData $ gClosure ,
202
+ CData $ returnValue ,
203
+ int $ numberOfParams ,
204
+ CData $ params ,
205
+ CData $ hint ,
199
206
?CData $ data
200
207
) use (&$ callback ): void {
201
208
assert ($ numberOfParams === 2 );
202
209
/**
203
- * Marshal-Signature: int(VipsTargetCustom*, void*)
210
+ * Marshal-Signature: int(VipsTargetCustom* target , void* handle )
204
211
*/
205
212
FFI ::gobject ()->g_value_set_int ($ returnValue , $ callback ());
206
213
};
0 commit comments