@@ -128,7 +128,6 @@ opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zen
128
128
opencv_fcall_info_cb *cb = new opencv_fcall_info_cb;
129
129
cb->fci = new zend_fcall_info;
130
130
cb->fci_cache = new zend_fcall_info_cache;
131
-
132
131
memcpy (cb->fci , fci_ptr, sizeof (zend_fcall_info));
133
132
memcpy (cb->fci_cache , fci_cache_ptr, sizeof (zend_fcall_info_cache));
134
133
Z_TRY_ADDREF (cb->fci ->function_name );// todo 滑动调或窗口销毁是释放内存
@@ -140,17 +139,19 @@ opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zen
140
139
}
141
140
142
141
void opencv_create_trackbar_callback (int pos, void * userdata){
143
- opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
144
-
145
- zval retval;
146
- zval args[1 ];
147
- ZVAL_LONG (&args[0 ], (long )pos);// 将滑动条滑动的值传入到闭包参数中
148
- fci_s->fci ->param_count = 1 ;
149
- fci_s->fci ->params = args;
150
- fci_s->fci ->retval = &retval;
151
-
152
- zend_call_function (fci_s->fci , fci_s->fci_cache );
153
- zval_ptr_dtor (&args[0 ]);
142
+ if (userdata != 0 ){
143
+ opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
144
+
145
+ zval retval;
146
+ zval args[1 ];
147
+ ZVAL_LONG (&args[0 ], (long )pos);// 将滑动条滑动的值传入到闭包参数中
148
+ fci_s->fci ->param_count = 1 ;
149
+ fci_s->fci ->params = args;
150
+ fci_s->fci ->retval = &retval;
151
+
152
+ zend_call_function (fci_s->fci , fci_s->fci_cache );
153
+ zval_ptr_dtor (&args[0 ]);
154
+ }
154
155
}
155
156
156
157
@@ -168,15 +169,18 @@ PHP_FUNCTION(opencv_create_trackbar){
168
169
169
170
zend_fcall_info fci;
170
171
zend_fcall_info_cache fci_cache;
171
- if (zend_parse_parameters (ZEND_NUM_ARGS (), " ssll|f" ,
172
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " ssll|f! " ,
172
173
&trackbarname, &trackbarname_len,
173
174
&winname,&winname_len,
174
175
&value,&count,
175
176
&fci, &fci_cache) == FAILURE) {
176
177
return ;
177
178
}
179
+ opencv_fcall_info_cb *cb = 0 ;
180
+ if (fci.size > 0 && ZEND_NUM_ARGS () > 4 ) {// check callback param is valid
181
+ cb = opencv_fcall_info_cb_create (&fci, &fci_cache);
182
+ }
178
183
int *trackbar_value_ptr = new int (value);
179
- opencv_fcall_info_cb *cb = opencv_fcall_info_cb_create (&fci, &fci_cache);
180
184
createTrackbar (trackbarname, winname, trackbar_value_ptr, (int )count,opencv_create_trackbar_callback,cb);
181
185
RETURN_NULL ();
182
186
}
@@ -209,6 +213,53 @@ PHP_FUNCTION(opencv_get_track_bar_pos){
209
213
}
210
214
211
215
216
+ void opencv_on_mouse_callback (int event, int x, int y, int flags, void * userdata){
217
+ if (userdata != 0 ){
218
+ opencv_fcall_info_cb *fci_s=(opencv_fcall_info_cb*)userdata;
219
+ zval retval;
220
+ zval args[4 ];
221
+ ZVAL_LONG (&args[0 ], (long )event);
222
+ ZVAL_LONG (&args[1 ], (long )x);
223
+ ZVAL_LONG (&args[2 ], (long )y);
224
+ ZVAL_LONG (&args[3 ], (long )flags);
225
+ fci_s->fci ->param_count = 4 ;
226
+ fci_s->fci ->params = args;
227
+ fci_s->fci ->retval = &retval;
228
+
229
+ zend_call_function (fci_s->fci , fci_s->fci_cache );
230
+ zval_ptr_dtor (&args[0 ]);
231
+ zval_ptr_dtor (&args[1 ]);
232
+ zval_ptr_dtor (&args[2 ]);
233
+ zval_ptr_dtor (&args[3 ]);
234
+ }
235
+ }
236
+
237
+ /* *
238
+ * CV\setMouseCallback
239
+ * @param execute_data
240
+ * @param return_value
241
+ */
242
+ PHP_FUNCTION (opencv_set_mouse_callback){
243
+ char *winname;
244
+ long winname_len;
245
+
246
+ zend_fcall_info fci;
247
+ zend_fcall_info_cache fci_cache;
248
+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " s|f!" ,
249
+ &winname,&winname_len,
250
+ &fci, &fci_cache) == FAILURE) {
251
+ return ;
252
+ }
253
+ opencv_fcall_info_cb *cb = 0 ;
254
+ if (fci.size > 0 && ZEND_NUM_ARGS () > 1 ) {// check callback param is valid
255
+ cb = opencv_fcall_info_cb_create (&fci, &fci_cache);
256
+ }
257
+ setMouseCallback (winname, opencv_on_mouse_callback, cb);
258
+ RETURN_NULL ();
259
+ }
260
+
261
+
262
+
212
263
void opencv_highgui_init (int module_number)
213
264
{
214
265
/* *
@@ -221,4 +272,32 @@ void opencv_highgui_init(int module_number)
221
272
REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " WINDOW_FREERATIO" , 5 , CONST_CS | CONST_PERSISTENT);
222
273
REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " WINDOW_GUI_EXPANDED" , 6 , CONST_CS | CONST_PERSISTENT);
223
274
REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " WINDOW_GUI_NORMAL" , 7 , CONST_CS | CONST_PERSISTENT);
275
+ opencv_highgui_mouse_event_types_init (module_number);
276
+ opencv_highgui_mouse_event_flags_init (module_number);
277
+ }
278
+
279
+ // ! Mouse Events see cv::MouseCallback
280
+ void opencv_highgui_mouse_event_types_init (int module_number){
281
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MOUSEMOVE" , EVENT_MOUSEMOVE, CONST_CS | CONST_PERSISTENT);
282
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_LBUTTONDOWN" , EVENT_LBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
283
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_RBUTTONDOWN" , EVENT_RBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
284
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MBUTTONDOWN" , EVENT_MBUTTONDOWN, CONST_CS | CONST_PERSISTENT);
285
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_LBUTTONUP" , EVENT_LBUTTONUP, CONST_CS | CONST_PERSISTENT);
286
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_RBUTTONUP" , EVENT_RBUTTONUP, CONST_CS | CONST_PERSISTENT);
287
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MBUTTONUP" , EVENT_MBUTTONUP, CONST_CS | CONST_PERSISTENT);
288
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_LBUTTONDBLCLK" , EVENT_LBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
289
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_RBUTTONDBLCLK" , EVENT_RBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
290
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MBUTTONDBLCLK" , EVENT_MBUTTONDBLCLK, CONST_CS | CONST_PERSISTENT);
291
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MOUSEWHEEL" , EVENT_MOUSEWHEEL, CONST_CS | CONST_PERSISTENT);
292
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_MOUSEHWHEEL" , EVENT_MOUSEHWHEEL, CONST_CS | CONST_PERSISTENT);
293
+ }
294
+
295
+ // ! Mouse Event Flags see cv::MouseCallback
296
+ void opencv_highgui_mouse_event_flags_init (int module_number){
297
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_LBUTTON" , EVENT_FLAG_LBUTTON, CONST_CS | CONST_PERSISTENT);
298
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_RBUTTON" , EVENT_FLAG_RBUTTON, CONST_CS | CONST_PERSISTENT);
299
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_MBUTTON" , EVENT_FLAG_MBUTTON, CONST_CS | CONST_PERSISTENT);
300
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_CTRLKEY" , EVENT_FLAG_CTRLKEY, CONST_CS | CONST_PERSISTENT);
301
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_SHIFTKEY" , EVENT_FLAG_SHIFTKEY, CONST_CS | CONST_PERSISTENT);
302
+ REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " EVENT_FLAG_ALTKEY" , EVENT_FLAG_ALTKEY, CONST_CS | CONST_PERSISTENT);
224
303
}
0 commit comments