@@ -128,7 +128,6 @@ opencv_fcall_info_cb * opencv_fcall_info_cb_create(zend_fcall_info *fci_ptr, zen
128128 opencv_fcall_info_cb *cb = new opencv_fcall_info_cb;
129129 cb->fci = new zend_fcall_info;
130130 cb->fci_cache = new zend_fcall_info_cache;
131-
132131 memcpy (cb->fci , fci_ptr, sizeof (zend_fcall_info));
133132 memcpy (cb->fci_cache , fci_cache_ptr, sizeof (zend_fcall_info_cache));
134133 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
140139}
141140
142141void 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+ }
154155}
155156
156157
@@ -168,15 +169,18 @@ PHP_FUNCTION(opencv_create_trackbar){
168169
169170 zend_fcall_info fci;
170171 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! " ,
172173 &trackbarname, &trackbarname_len,
173174 &winname,&winname_len,
174175 &value,&count,
175176 &fci, &fci_cache) == FAILURE) {
176177 return ;
177178 }
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+ }
178183 int *trackbar_value_ptr = new int (value);
179- opencv_fcall_info_cb *cb = opencv_fcall_info_cb_create (&fci, &fci_cache);
180184 createTrackbar (trackbarname, winname, trackbar_value_ptr, (int )count,opencv_create_trackbar_callback,cb);
181185 RETURN_NULL ();
182186}
@@ -209,6 +213,53 @@ PHP_FUNCTION(opencv_get_track_bar_pos){
209213}
210214
211215
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+
212263void opencv_highgui_init (int module_number)
213264{
214265 /* *
@@ -221,4 +272,32 @@ void opencv_highgui_init(int module_number)
221272 REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " WINDOW_FREERATIO" , 5 , CONST_CS | CONST_PERSISTENT);
222273 REGISTER_NS_LONG_CONSTANT (OPENCV_NS, " WINDOW_GUI_EXPANDED" , 6 , CONST_CS | CONST_PERSISTENT);
223274 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);
224303}
0 commit comments