@@ -124,48 +124,74 @@ PHP_FUNCTION(opencv_circle){
124124 */
125125PHP_FUNCTION (opencv_fill_poly){
126126
127- long thickness = 1 , lineType = LINE_8, shift = 0 ;
128- long *number_points;
129- long ncoutours;
130- zval *mat_zval, *scalar_zval, *offset_point_zval;
131- zval *start_point_zval;
127+ // define parameters
128+ long ncontours, lineType = LINE_8, shift = 0 ;
129+ zval *img_zval, *color_zval, *offset_point_zval = NULL ;
130+ zval *points_zval;
132131 opencv_point_object *offset_object;
133- if (zend_parse_parameters (ZEND_NUM_ARGS (), " OOllO|llO" ,
134- &mat_zval, opencv_mat_ce,
135- &start_point_zval, opencv_point_ce,
136- &number_points,
137- &ncoutours,
138- &scalar_zval, opencv_scalar_ce,
139- &thickness, &lineType,
140- &offset_point_zval, opencv_point_ce) == FAILURE) {
132+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " OalO|llz" ,
133+ &img_zval, opencv_mat_ce,
134+ &points_zval, &ncontours,
135+ &color_zval, opencv_scalar_ce,
136+ &lineType, &shift,
137+ &offset_point_zval) == FAILURE) {
141138 RETURN_NULL ();
142139 }
143140
144- zval *offset_point_real_zval = Z_REFVAL_P (offset_point_zval);
145- if (Z_TYPE_P (offset_point_real_zval) == IS_OBJECT && Z_OBJCE_P (offset_point_real_zval)==opencv_point_ce){
146- // is Point object
147- offset_object = Z_PHP_POINT_OBJ_P (offset_point_real_zval);
141+ unsigned long point_count = zend_hash_num_elements (Z_ARRVAL_P (points_zval));
142+ Point root_points[1 ][point_count];
143+ opencv_point_object *point_object;
144+ zend_ulong _h;
145+ zval *array_val_zval;
146+ ZEND_HASH_FOREACH_NUM_KEY_VAL (Z_ARRVAL_P (points_zval),_h,array_val_zval){
147+ again1:
148+ if (Z_TYPE_P (array_val_zval) == IS_OBJECT && Z_OBJCE_P (array_val_zval) == opencv_point_ce){
149+ point_object = Z_PHP_POINT_OBJ_P (array_val_zval);
150+ root_points[0 ][_h] = *point_object->point ;
151+ }else if (Z_TYPE_P (array_val_zval) == IS_REFERENCE){
152+ array_val_zval = Z_REFVAL_P (array_val_zval);
153+ goto again1;
154+ } else {
155+ opencv_throw_exception (" points array value just Point object." );
156+ RETURN_NULL ();
157+ }
158+ }ZEND_HASH_FOREACH_END ();
159+
160+ const Point* pts[1 ] = {root_points[0 ]};
161+ int npts[] = {(int )point_count};
162+ Point offset;
163+ zval *offset_point_real_zval;
164+
165+ if (offset_point_zval != NULL ){
166+ offset_point_real_zval = Z_REFVAL_P (offset_point_zval);
167+ if (Z_TYPE_P (offset_point_real_zval) == IS_OBJECT && Z_OBJCE_P (offset_point_real_zval) == opencv_point_ce){
168+ // is Point object
169+ offset_object = Z_PHP_POINT_OBJ_P (offset_point_real_zval);
170+ } else {
171+ // isn't Point object
172+ zval_ptr_dtor (offset_point_real_zval);
173+ zval instance;
174+ object_init_ex (&instance,opencv_point_ce);
175+ ZVAL_COPY_VALUE (offset_point_real_zval, &instance);// Cover dst_real_zval by Point object
176+ offset_object = Z_PHP_POINT_OBJ_P (offset_point_real_zval);
177+ }
148178 } else {
149- // isn't Point object
150- zval instance;
151- Point dst;
152- object_init_ex (&instance,opencv_point_ce);
153- ZVAL_COPY_VALUE (offset_point_real_zval, &instance);// Cover dst_real_zval by Point object
154- offset_object = Z_PHP_POINT_OBJ_P (offset_point_real_zval);
155- offset_object->point = new Point (dst);
179+ offset = Point ();
156180 }
157181
158- opencv_mat_object *mat_obj = Z_PHP_MAT_OBJ_P (mat_zval);
159- opencv_point_object *start_point_obj = Z_PHP_POINT_OBJ_P (start_point_zval);
160- opencv_scalar_object *scalar_obj = Z_PHP_SCALAR_OBJ_P (scalar_zval);
182+ opencv_mat_object *mat_obj = Z_PHP_MAT_OBJ_P (img_zval);
183+ opencv_scalar_object *scalar_obj = Z_PHP_SCALAR_OBJ_P (color_zval);
161184
162- const Point *pts = (start_point_obj->point );
163- const int *npts = (int *)(number_points);
164- fillPoly (*(mat_obj->mat ), &pts, npts, ncoutours, *(scalar_obj->scalar ), thickness, lineType, *offset_object->point );
185+ fillPoly (*(mat_obj->mat ), pts, npts, (int )ncontours, *(scalar_obj->scalar ), (int )lineType, (int )shift, offset);
186+ if (offset_point_zval != NULL ){
187+ offset_object->point = new Point (offset);
188+ opencv_point_update_property_by_c_point (offset_point_real_zval, offset_object->point );
189+ }
165190
166191 RETURN_NULL ();
167192}
168193
194+
169195/* *
170196 * CV\line
171197 * @param execute_data
0 commit comments