1616
1717
1818#include " ../../../php_opencv.h"
19+ #include " ../../../opencv_exception.h"
1920#include " opencv_type.h"
2021
2122zend_class_entry *opencv_point_ce;
2223zend_class_entry *opencv_scalar_ce;
2324zend_class_entry *opencv_size_ce;
2425zend_class_entry *opencv_rect_ce;
26+ zend_class_entry *opencv_rotated_rect_ce;
2527
2628/* *
2729 * -----------------------------------【CV\Point】--------------------------------------
@@ -81,7 +83,7 @@ const zend_function_entry opencv_point_methods[] = {
8183
8284zend_object* opencv_point_create_handler (zend_class_entry *type)
8385{
84- int size = sizeof (opencv_point_object);
86+ size_t size = sizeof (opencv_point_object);
8587 opencv_point_object *obj = (opencv_point_object *)ecalloc (1 ,size);
8688 memset (obj, 0 , sizeof (opencv_point_object));
8789 zend_object_std_init (&obj->std , type);
@@ -152,7 +154,7 @@ zend_object_handlers opencv_scalar_object_handlers;
152154
153155zend_object* opencv_scalar_create_handler (zend_class_entry *type)
154156{
155- int size = sizeof (opencv_scalar_object);
157+ size_t size = sizeof (opencv_scalar_object);
156158 opencv_scalar_object *obj = (opencv_scalar_object *)ecalloc (1 ,size);
157159 memset (obj, 0 , sizeof (opencv_scalar_object));
158160 zend_object_std_init (&obj->std , type);
@@ -256,7 +258,7 @@ zend_object_handlers opencv_size_object_handlers;
256258
257259zend_object* opencv_size_create_handler (zend_class_entry *type)
258260{
259- int size = sizeof (opencv_size_object);
261+ size_t size = sizeof (opencv_size_object);
260262 opencv_size_object *obj = (opencv_size_object *)ecalloc (1 ,size);
261263 memset (obj, 0 , sizeof (opencv_size_object));
262264 zend_object_std_init (&obj->std , type);
@@ -373,7 +375,7 @@ zend_object_handlers opencv_rect_object_handlers;
373375
374376zend_object* opencv_rect_create_handler (zend_class_entry *type)
375377{
376- int size = sizeof (opencv_rect_object);
378+ size_t size = sizeof (opencv_rect_object);
377379 opencv_rect_object *obj = (opencv_rect_object *)ecalloc (1 ,size);
378380 memset (obj, 0 , sizeof (opencv_rect_object));
379381 zend_object_std_init (&obj->std , type);
@@ -542,7 +544,7 @@ void opencv_rect_write_property(zval *object, zval *member, zval *value, void **
542544
543545
544546/* *
545- * Scalar Init
547+ * Rect Init
546548 */
547549void opencv_rect_init (int module_number){
548550 zend_class_entry ce;
@@ -557,6 +559,155 @@ void opencv_rect_init(int module_number){
557559 opencv_rect_object_handlers.free_obj = opencv_rect_free_obj;
558560}
559561
562+ // -----------------------------------【CV\RotatedRect】--------------------------------
563+ //
564+ // -------------------------------------------------------------------------------------
565+
566+ zend_object_handlers opencv_rotated_rect_object_handlers;
567+
568+ zend_object* opencv_rotated_rect_create_handler (zend_class_entry *type)
569+ {
570+ size_t size = sizeof (opencv_rotated_rect_object);
571+ opencv_rotated_rect_object *obj = (opencv_rotated_rect_object *)ecalloc (1 ,size);
572+ memset (obj, 0 , sizeof (opencv_rotated_rect_object));
573+ zend_object_std_init (&obj->std , type);
574+ object_properties_init (&obj->std , type);
575+ obj->std .ce = type;
576+ obj->std .handlers = &opencv_rotated_rect_object_handlers;
577+ return &obj->std ;
578+ }
579+
580+
581+ /* *
582+ * //todo $rotatedRect->property = &$a
583+ * RotatedRect Class write_property
584+ * @param object
585+ * @param member
586+ * @param value
587+ * @param cache_slot
588+ */
589+ void opencv_rotated_rect_write_property (zval *object, zval *member, zval *value, void **cache_slot){
590+
591+ zend_string *str = zval_get_string (member);
592+ char *memberName = ZSTR_VAL (str);
593+ opencv_rotated_rect_object *obj = Z_PHP_ROTATED_RECT_OBJ_P (object);
594+ if (strcmp (memberName, " angle" ) == 0 && obj->rotatedRect ->angle != (int )zval_get_long (value)){
595+ obj->rotatedRect ->angle = (float )zval_get_long (value);
596+ }else if (strcmp (memberName, " center" ) == 0 ){
597+ if (Z_TYPE_P (value) == IS_OBJECT && Z_OBJCE_P (value) == opencv_point_ce){
598+ opencv_point_object *value_object = Z_PHP_POINT_OBJ_P (value);
599+ if (Point2f (*value_object->point ) != obj->rotatedRect ->center ){
600+ obj->rotatedRect ->center = Point2f (*value_object->point );
601+ }
602+ }else {
603+ opencv_throw_exception (" set property center only expect param is Point object." );
604+ }
605+ }else if (strcmp (memberName, " size" ) == 0 ){
606+ if (Z_TYPE_P (value) == IS_OBJECT && Z_OBJCE_P (value) == opencv_size_ce){
607+ opencv_size_object *value_object = Z_PHP_SIZE_OBJ_P (value);
608+ if (Size2f (*value_object->size ) != obj->rotatedRect ->size ){
609+ obj->rotatedRect ->size = Size2f (*value_object->size );
610+ }
611+ }else {
612+ opencv_throw_exception (" set property size only expect param is Size object." );
613+ }
614+ }
615+ zend_string_release (str);// free zend_string not memberName(zend_string->val)
616+ std_object_handlers.write_property (object,member,value,cache_slot);
617+
618+ }
619+
620+
621+ void opencv_rotated_rect_free_obj (zend_object *object)
622+ {
623+ opencv_rotated_rect_object *obj;
624+ obj = get_rotated_rect_obj (object);
625+ delete obj->rotatedRect ;
626+ zend_object_std_dtor (object);
627+ }
628+
629+ void opencv_rotated_rect_update_property_by_c_rotated_rect (zval *z, RotatedRect *rotatedRect){
630+ // RotatedRect->angle
631+ zend_update_property_double (opencv_rotated_rect_ce, z, " angle" , sizeof (" angle" )-1 , rotatedRect->angle );
632+ // RotatedRect->center
633+ zval center_zval;
634+ object_init_ex (¢er_zval, opencv_point_ce);
635+ opencv_point_object *center_object = Z_PHP_POINT_OBJ_P (¢er_zval);
636+ center_object->point = new Point (rotatedRect->center .x ,rotatedRect->center .y );
637+ opencv_point_update_property_by_c_point (¢er_zval, center_object->point );
638+ zend_update_property (opencv_rotated_rect_ce, z, " center" , sizeof (" center" )-1 , ¢er_zval);
639+ // RotatedRect->size
640+ zval size_zval;
641+ object_init_ex (&size_zval, opencv_size_ce);
642+ opencv_size_object *size_object = Z_PHP_SIZE_OBJ_P (&size_zval);
643+ size_object->size = new Size (rotatedRect->size );
644+ opencv_size_update_property_by_c_size (&size_zval, size_object->size );
645+ zend_update_property (opencv_rotated_rect_ce, z, " size" , sizeof (" size" )-1 , &size_zval);
646+ /* *
647+ * 数组center_zval在object_init_ex()后refcount=1,
648+ * 插入成员属性zend_update_property()会自动加一次,变为2,
649+ * 对象销毁后只会减1,需要要在zend_update_property()后主动减一次引用
650+ */
651+ Z_DELREF (center_zval);
652+ Z_DELREF (size_zval);
653+ }
654+
655+ /* *
656+ * todo center is Point2f and size is Size2f
657+ * RotatedRect __construct
658+ * @param execute_data
659+ * @param return_value
660+ */
661+ PHP_METHOD (opencv_rotated_rect, __construct)
662+ {
663+ zval *center_zval = NULL , *size_zval;
664+ double angle = 0.0 ;
665+ Point center = Point ();
666+ Size size = Size ();
667+ if (zend_parse_parameters (ZEND_NUM_ARGS (), " |OOd" ,
668+ ¢er_zval, opencv_point_ce,
669+ &size_zval, opencv_size_ce,
670+ &angle) == FAILURE) {
671+ RETURN_NULL ();
672+ }
673+
674+ if (center_zval != NULL ){
675+ opencv_point_object *center_object = Z_PHP_POINT_OBJ_P (center_zval);
676+ center = *center_object->point ;
677+ }
678+
679+ if (size_zval != NULL ){
680+ opencv_size_object *size_object = Z_PHP_SIZE_OBJ_P (size_zval);
681+ size = *size_object->size ;
682+ }
683+
684+ opencv_rotated_rect_object *obj = Z_PHP_ROTATED_RECT_OBJ_P (getThis ());
685+ obj->rotatedRect = new RotatedRect (center, size, (float )angle);
686+ opencv_rotated_rect_update_property_by_c_rotated_rect (getThis (), obj->rotatedRect );
687+ }
688+
689+ /* *
690+ * opencv_rect_methods[]
691+ */
692+ const zend_function_entry opencv_rotated_rect_methods[] = {
693+ PHP_ME (opencv_rotated_rect, __construct, NULL , ZEND_ACC_PUBLIC|ZEND_ACC_CTOR)
694+ PHP_FE_END
695+ };
696+ /* }}} */
697+
698+ void opencv_rotated_rect_init (int module_number){
699+ zend_class_entry ce;
700+ INIT_NS_CLASS_ENTRY (ce,OPENCV_NS, " RotatedRect" , opencv_rotated_rect_methods);
701+ opencv_rotated_rect_ce = zend_register_internal_class (&ce);
702+
703+ opencv_rotated_rect_ce->create_object = opencv_rotated_rect_create_handler;
704+ memcpy (&opencv_rotated_rect_object_handlers,
705+ zend_get_std_object_handlers (), sizeof (zend_object_handlers));
706+ opencv_rotated_rect_object_handlers.clone_obj = NULL ;
707+ opencv_rotated_rect_object_handlers.write_property = opencv_rotated_rect_write_property;
708+ opencv_rotated_rect_object_handlers.free_obj = opencv_rotated_rect_free_obj;
709+ }
710+
560711
561712/* *
562713 * Type Init
@@ -566,4 +717,5 @@ void opencv_type_init(int module_number){
566717 opencv_scalar_init (module_number);
567718 opencv_size_init (module_number);
568719 opencv_rect_init (module_number);
720+ opencv_rotated_rect_init (module_number);
569721}
0 commit comments