partial implementation of complex out args in Java wrappers
authorAndrey Pavlenko <no@email>
Wed, 13 Jul 2011 14:23:47 +0000 (14:23 +0000)
committerAndrey Pavlenko <no@email>
Wed, 13 Jul 2011 14:23:47 +0000 (14:23 +0000)
modules/java/gen_java.py
modules/java/src/java/Point.java
modules/java/src/java/Point3.java
modules/java/src/java/Rect.java
modules/java/src/java/RotatedRect.java
modules/java/src/java/Scalar.java
modules/java/src/java/Size.java

index 0dd1e00..4ead6da 100644 (file)
@@ -14,8 +14,8 @@ type_dict = {
     "env"     : { "j_type" : "", "jn_type" : "", "jni_type" : "JNIEnv*"},\r
     "cls"     : { "j_type" : "", "jn_type" : "", "jni_type" : "jclass"},\r
     "bool"    : { "j_type" : "boolean", "jn_type" : "boolean", "jni_type" : "jboolean", "suffix" : "Z" },\r
-    "int"     : { "j_type" : "int", "jn_type" : "int", "jni_type" : "int", "suffix" : "I" },\r
-    "long"    : { "j_type" : "int", "jn_type" : "int", "jni_type" : "int", "suffix" : "I" },\r
+    "int"     : { "j_type" : "int", "jn_type" : "int", "jni_type" : "jint", "suffix" : "I" },\r
+    "long"    : { "j_type" : "int", "jn_type" : "int", "jni_type" : "jint", "suffix" : "I" },\r
     "float"   : { "j_type" : "float", "jn_type" : "float", "jni_type" : "jfloat", "suffix" : "F" },\r
     "double"  : { "j_type" : "double", "jn_type" : "double", "jni_type" : "jdouble", "suffix" : "D" },\r
     "size_t"  : { "j_type" : "long", "jn_type" : "long", "jni_type" : "jlong", "suffix" : "J" },\r
@@ -26,37 +26,37 @@ type_dict = {
                   "jni_type" : "jlong", #"jni_name" : "*%(n)s",\r
                   "suffix" : "J" },\r
     "Point"   : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y")),\r
-                  "jni_var" : "cv::Point %(n)s((int)%(n)s_x, (int)%(n)s_y)",\r
+                  "jni_var" : "Point %(n)s((int)%(n)s_x, (int)%(n)s_y)",\r
                   "suffix" : "DD"},\r
     "Point2f" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y")),\r
-                  "jni_var" : "cv::Point2f %(n)s((float)%(n)s_x, (float)%(n)s_y)",\r
+                  "jni_var" : "Point2f %(n)s((float)%(n)s_x, (float)%(n)s_y)",\r
                   "suffix" : "DD"},\r
     "Point2d" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y")),\r
-                  "jni_var" : "cv::Point2d %(n)s(%(n)s_x, %(n)s_y)",\r
+                  "jni_var" : "Point2d %(n)s(%(n)s_x, %(n)s_y)",\r
                   "suffix" : "DD"},\r
     "Point3i" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y"), ("double", ".z")),\r
-                  "jni_var" : "cv::Point3i %(n)s((int)%(n)s_x, (int)%(n)s_y, (int)%(n)s_z)",\r
+                  "jni_var" : "Point3i %(n)s((int)%(n)s_x, (int)%(n)s_y, (int)%(n)s_z)",\r
                   "suffix" : "DDD"},\r
     "Point3f" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y"), ("double", ".z")),\r
-                  "jni_var" : "cv::Point3f %(n)s((float)%(n)s_x, (float)%(n)s_y, (float)%(n)s_z)",\r
+                  "jni_var" : "Point3f %(n)s((float)%(n)s_x, (float)%(n)s_y, (float)%(n)s_z)",\r
                   "suffix" : "DDD"},\r
     "Point3d" : { "j_type" : "Point", "jn_args" : (("double", ".x"), ("double", ".y"), ("double", ".z")),\r
-                  "jni_var" : "cv::Point3d %(n)s(%(n)s_x, %(n)s_y, %(n)s_z)",\r
+                  "jni_var" : "Point3d %(n)s(%(n)s_x, %(n)s_y, %(n)s_z)",\r
                   "suffix" : "DDD"},\r
     "Rect"    : { "j_type" : "Rect",  "jn_args" : (("int", ".x"), ("int", ".y"), ("int", ".width"), ("int", ".height")),\r
-                  "jni_var" : "cv::Rect %(n)s(%(n)s_x, %(n)s_y, %(n)s_width, %(n)s_height)",\r
+                  "jni_var" : "Rect %(n)s(%(n)s_x, %(n)s_y, %(n)s_width, %(n)s_height)",\r
                   "suffix" : "IIII"},\r
     "Size"    : { "j_type" : "Size",  "jn_args" : (("double", ".width"), ("double", ".height")),\r
-                  "jni_var" : "cv::Size %(n)s((int)%(n)s_width, (int)%(n)s_height)",\r
+                  "jni_var" : "Size %(n)s((int)%(n)s_width, (int)%(n)s_height)",\r
                   "suffix" : "DD"},\r
     "Size2f"  : { "j_type" : "Size",  "jn_args" : (("double", ".width"), ("double", ".height")),\r
-                  "jni_var" : "cv::Size2f %(n)s((float)%(n)s_width, (float)%(n)s_height)",\r
+                  "jni_var" : "Size2f %(n)s((float)%(n)s_width, (float)%(n)s_height)",\r
                   "suffix" : "DD"},\r
  "RotatedRect": { "j_type" : "RotatedRect",  "jn_args" : (("double", ".center.x"), ("double", ".center.y"), ("double", ".size.width"), ("double", ".size.height"), ("double", ".angle")),\r
-                  "jni_var" : "cv::RotatedRect %(n)s(cv::Point2f(%(n)s_center_x, %(n)s_center_y), cv::Size2f(%(n)s_size_width, %(n)s_size_height), %(n)s_angle)",\r
+                  "jni_var" : "RotatedRect %(n)s(cv::Point2f(%(n)s_center_x, %(n)s_center_y), cv::Size2f(%(n)s_size_width, %(n)s_size_height), %(n)s_angle)",\r
                   "suffix" : "DDDDD"},\r
     "Scalar"  : { "j_type" : "Scalar",  "jn_args" : (("double", ".v0"), ("double", ".v1"), ("double", ".v2"), ("double", ".v3")),\r
-                  "jni_var" : "cv::Scalar %(n)s(%(n)s_v0, %(n)s_v1, %(n)s_v2, %(n)s_v3)",\r
+                  "jni_var" : "Scalar %(n)s(%(n)s_v0, %(n)s_v1, %(n)s_v2, %(n)s_v3)",\r
                   "suffix" : "DDDD"},\r
     "Range"   : { "j_type" : "Range",  "jn_args" : (("int", ".start"), ("int", ".end")),\r
                   "jni_var" : "cv::Range %(n)s(%(n)s_start, %(n)s_end)",\r
@@ -189,8 +189,9 @@ class JavaWrapperGenerator(object):
             print "Duplicated class: " + classinfo.name\r
             sys.exit(-1)\r
         type_dict[classinfo.name] = \\r
-            { "j_type" : classinfo.name,  "jn_args" : (("__int64", ".nativeObj"),),\r
-              "jni_name" : "(*("+classinfo.name+"*)%(n)s_nativeObj)",\r
+            { "j_type" : classinfo.name,\r
+              "jn_type" : "long", "jn_args" : (("__int64", ".nativeObj"),),\r
+              "jni_name" : "(*("+classinfo.name+"*)%(n)s_nativeObj)", "jni_type" : "jlong",\r
               "suffix" : "J" }\r
 \r
 \r
@@ -404,8 +405,7 @@ class JavaWrapperGenerator(object):
         # java comment\r
         self.java_code.write( "\n%s// C++: %s\n" % (indent, c_decl) )\r
         # check if we 'know' all the types\r
-        type_info = type_dict.get(fi.ctype)\r
-        if not (type_info and type_info.get("jn_type")): # unsupported ret type\r
+        if fi.ctype not in type_dict: # unsupported ret type\r
             msg = "// Return type '%s' is not supported, skipping the function\n\n" % fi.ctype\r
             self.skipped_func_list.append(c_decl + "\n" + msg)\r
             self.java_code.write( indent + msg )\r
@@ -414,18 +414,18 @@ class JavaWrapperGenerator(object):
             return\r
         for a in fi.args:\r
             if a.ctype not in type_dict:\r
-                msg = "// Unknown type '%s', skipping the function\n\n" % a.ctype\r
+                msg = "// Unknown type '%s' (%s), skipping the function\n\n" % (a.ctype, a.out or "I")\r
                 self.skipped_func_list.append(c_decl + "\n" + msg)\r
                 self.java_code.write( indent + msg )\r
                 #self.cpp_code.write( msg )\r
-                print "SKIP:", c_decl, "\n\tdue to ARG type", a.ctype, a.out\r
+                print "SKIP:", c_decl, "\n\tdue to ARG type", a.ctype, "/" + (a.out or "I")\r
                 return\r
             if a.ctype != "Mat" and "jn_args" in type_dict[a.ctype] and a.out: # complex out args not yet supported\r
-                msg = "// Unsupported type '%s&', skipping the function\n\n" % a.ctype\r
+                msg = "// Unsupported OUT type '%s' (%s), skipping the function\n\n" % (a.ctype, a.out or "I")\r
                 self.skipped_func_list.append(c_decl + "\n" + msg)\r
                 self.java_code.write( indent + msg )\r
                 #self.cpp_code.write( msg )\r
-                print "SKIP:", c_decl, "\n\tdue to OUT ARG of type", a.ctype, a.out\r
+                print "SKIP:", c_decl, "\n\tdue to OUT ARG of type", a.ctype, "/" + (a.out or "I")\r
                 return\r
 \r
         self.ported_func_counter += 1\r
@@ -470,7 +470,7 @@ class JavaWrapperGenerator(object):
             jn_code.write( Template(\\r
                 "${indent}private static native $jn_type $jn_name($jn_args);\n").substitute(\\r
                 indent = indent, \\r
-                jn_type = type_dict[fi.ctype]["jn_type"], \\r
+                jn_type = type_dict[fi.ctype].get("jn_type", "double[]"), \\r
                 jn_name = fi.jn_name, \\r
                 jn_args = ", ".join(["%s %s" % (type_dict[a.ctype]["jn_type"], a.name.replace(".","_")) for a in jn_args])\r
             ) );\r
@@ -495,8 +495,10 @@ class JavaWrapperGenerator(object):
             elif fi.ctype == "": # c-tor\r
                 impl_code = "nativeObj = $jn_name($jn_args_call);"\r
             elif fi.ctype in self.classes: # wrapped class\r
-                impl_code = " return new %s( $jn_name($jn_args_call) ); " % \\r
+                impl_code = "return new %s( $jn_name($jn_args_call) );" % \\r
                     self.classes[fi.ctype].jname\r
+            elif "jn_type" not in type_dict[fi.ctype]:\r
+                impl_code = "return new "+type_dict[fi.ctype]["j_type"]+"( $jn_name($jn_args_call) );"\r
 \r
             static = "static"\r
             if fi.classname:\r
@@ -518,25 +520,35 @@ class JavaWrapperGenerator(object):
             ) )\r
 \r
             # cpp part:\r
-            # jni_func(..) { return cv_func(..); }\r
-            ret = "return "\r
-            ext = ""\r
+            # jni_func(..) { _retval_ = cv_func(..); return _retval_; }\r
+            ret = "return _retval_;"\r
             default = "return 0;"\r
             if fi.ctype == "void":\r
-                ret = ""\r
-                default = ""\r
+                ret = "return;"\r
+                default = "return;"\r
+            elif not fi.ctype: # c-tor\r
+                ret = "return (jlong) _retval_;"\r
             elif fi.ctype == "string":\r
-                ret = "return env->NewStringUTF"\r
-                ext = ".c_str()"\r
+                ret = "return env->NewStringUTF(_retval_.c_str());"\r
                 default = 'return env->NewStringUTF("");'\r
             elif fi.ctype in self.classes: # wrapped class:\r
-                ret = "return (jlong) new " + self.classes[fi.ctype].jname\r
+                ret = "return (jlong) new %s(_retval_);" % fi.ctype\r
+            elif "jni_type" not in type_dict[fi.ctype]: # jdoubleArray\r
+                ret = "double _tmp_[6]; " + \\r
+                      "/* "+fi.ctype+"_to_double6(_retval_, _tmp_); */" + \\r
+                      "jdoubleArray _da_ = env->NewDoubleArray(6); " + \\r
+                      "env->SetDoubleArrayRegion(_da_, 0, 6, _tmp_); " + \\r
+                      "return _da_;"\r
 \r
             cvname = "cv::" + fi.name\r
             j2cvargs = []\r
+            retval = fi.ctype + " _retval_ = "\r
+            if fi.ctype == "void":\r
+                retval = ""\r
             if fi.classname:\r
                 if not fi.ctype: # c-tor\r
-                    cvname = "(jlong) new " + fi.classname\r
+                    retval = fi.classname + "* _retval_ = "\r
+                    cvname = "new " + fi.classname\r
                 elif fi.static:\r
                     cvname = "%s::%s" % (fi.classname, fi.name)\r
                 else:\r
@@ -551,7 +563,7 @@ class JavaWrapperGenerator(object):
                 if "jni_var" in type_dict[a.ctype]: # complex type\r
                     j2cvargs.append(type_dict[a.ctype]["jni_var"] % {"n" : a.name} + ";")\r
 \r
-            rtype = type_dict[fi.ctype]["jni_type"]\r
+            rtype = type_dict[fi.ctype].get("jni_type", "jdoubleArray")\r
             self.cpp_code.write ( Template( \\r
 """\r
 \r
@@ -563,7 +575,8 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_$fname
         LOGD("$module::$fname()");\r
 #endif // DEBUG\r
         $j2cv\r
-        $ret( $cvname( $cvargs )$ext );\r
+        $retval$cvname( $cvargs );\r
+        $ret\r
     } catch(cv::Exception e) {\r
 #ifdef DEBUG\r
         LOGD("$module::$fname() catched cv::Exception: %s", e.what());\r
@@ -592,8 +605,8 @@ JNIEXPORT $rtype JNICALL Java_org_opencv_${module}_$fname
         ret = ret, \\r
         cvname = cvname, \\r
         cvargs = ", ".join([a for a in cvargs]), \\r
-        ext = ext, \\r
-        default = default\r
+        default = default, \\r
+        retval = retval, \\r
     ) )\r
 \r
             # processing args with default values\r
index 404b1f3..3d948ab 100644 (file)
@@ -2,54 +2,62 @@ package org.opencv;
 \r
 //javadoc:Point_\r
 public class Point {\r
-       \r
-       public double x, y;\r
-       \r
-       public Point(double x, double y) {\r
-               this.x = x;\r
-               this.y = y;\r
-       }\r
-       \r
-       public Point() {\r
-               this(0, 0);\r
-       }\r
-\r
-       public Point clone() {\r
-               return new Point(x, y);\r
-       }\r
-       \r
-       public double dot(Point p) {\r
-               return x * p.x + y * p.y;\r
-       }\r
-\r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(x);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(y);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if ( ! (obj instanceof Point) ) return false;\r
-               Point it = (Point) obj;\r
-               return x == it.x && y == it.y;\r
-       }\r
-\r
-       public boolean inside(Rect r) {\r
-               return r.contains(this);\r
-       }\r
-\r
-\r
-       @Override\r
-       public String toString() {\r
-               if (this == null) return "null";\r
-               return "{" + x + ", " + y + "}";\r
-       }\r
+\r
+    public double x, y;\r
+\r
+    public Point(double x, double y) {\r
+        this.x = x;\r
+        this.y = y;\r
+    }\r
+\r
+    public Point() {\r
+        this(0, 0);\r
+    }\r
+\r
+    public Point(double[] vals) {\r
+       this();\r
+       if(vals!=null) {\r
+               x = vals.length>0 ? vals[0] : 0;\r
+               y = vals.length>1 ? vals[1] : 0;\r
+       }\r
+    }\r
+\r
+    public Point clone() {\r
+        return new Point(x, y);\r
+    }\r
+\r
+    public double dot(Point p) {\r
+        return x * p.x + y * p.y;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(x);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(y);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if ( ! (obj instanceof Point) ) return false;\r
+        Point it = (Point) obj;\r
+        return x == it.x && y == it.y;\r
+    }\r
+\r
+    public boolean inside(Rect r) {\r
+        return r.contains(this);\r
+    }\r
+\r
+\r
+    @Override\r
+    public String toString() {\r
+        if (this == null) return "null";\r
+        return "{" + x + ", " + y + "}";\r
+    }\r
 }\r
index 4fcb465..8f4e468 100644 (file)
@@ -3,55 +3,64 @@ package org.opencv;
 //javadoc:Point3_\r
 public class Point3 {\r
 \r
-       public double x, y, z;\r
-\r
-       public Point3(double x, double y, double z) {\r
-               this.x = x;\r
-               this.y = y;\r
-               this.z = z;\r
-       }\r
-\r
-       public Point3() {\r
-               this(0, 0, 0);\r
-       }\r
-\r
-       public Point3(Point p) {\r
-               x = p.x;\r
-               y = p.y;\r
-               z = 0;\r
-       }\r
-\r
-       public Point3 clone() {\r
-               return new Point3(x, y, z);\r
-       }\r
-\r
-       public double dot(Point3 p) {\r
-               return x * p.x + y * p.y + z * p.z;\r
-       }\r
-\r
-       public Point3 cross(Point3 p) {\r
-               return new Point3(y * p.z - z * p.y, z * p.x - x * p.z, x * p.y - y * p.x);\r
-       }\r
-\r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(x);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(y);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(z);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if (!(obj instanceof Point3)) return false;\r
-               Point3 it = (Point3) obj;\r
-               return x == it.x && y == it.y && z == it.z;\r
-       }\r
+    public double x, y, z;\r
+\r
+    public Point3(double x, double y, double z) {\r
+        this.x = x;\r
+        this.y = y;\r
+        this.z = z;\r
+    }\r
+\r
+    public Point3() {\r
+        this(0, 0, 0);\r
+    }\r
+\r
+    public Point3(Point p) {\r
+        x = p.x;\r
+        y = p.y;\r
+        z = 0;\r
+    }\r
+\r
+    public Point3(double[] vals) {\r
+       this();\r
+       if(vals!=null) {\r
+               x = vals.length>0 ? vals[0] : 0;\r
+               y = vals.length>1 ? vals[1] : 0;\r
+               z = vals.length>2 ? vals[2] : 0;\r
+       }\r
+    }\r
+\r
+    public Point3 clone() {\r
+        return new Point3(x, y, z);\r
+    }\r
+\r
+    public double dot(Point3 p) {\r
+        return x * p.x + y * p.y + z * p.z;\r
+    }\r
+\r
+    public Point3 cross(Point3 p) {\r
+        return new Point3(y * p.z - z * p.y, z * p.x - x * p.z, x * p.y - y * p.x);\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(x);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(y);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(z);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if (!(obj instanceof Point3)) return false;\r
+        Point3 it = (Point3) obj;\r
+        return x == it.x && y == it.y && z == it.z;\r
+    }\r
 }\r
index 314a209..abb2d9e 100644 (file)
@@ -2,82 +2,92 @@ package org.opencv;
 \r
 //javadoc:Rect_\r
 public class Rect {\r
-       \r
-       public int x, y, width, height;\r
-\r
-       public Rect(int x, int y, int width, int height) {\r
-               this.x = x;\r
-               this.y = y;\r
-               this.width = width;\r
-               this.height = height;\r
-       }\r
-\r
-       public Rect() {\r
-               this(0, 0, 0, 0);\r
-       }\r
-       \r
-       public Rect(Point p1, Point p2) {\r
-           x = (int) (p1.x < p2.x ? p1.x : p2.x); \r
-           y = (int) (p1.y < p2.y ? p1.y : p2.y);\r
-           width = (int) (p1.x > p2.x ? p1.x : p2.x) - x; \r
-           height = (int) (p1.y > p2.y ? p1.y : p2.y) - y;\r
-       }\r
-\r
-       public Rect(Point p, Size s) {\r
-               this((int)p.x, (int)p.y, (int)s.width, (int)s.height);\r
-       }\r
-       \r
-       public Rect clone() {\r
-               return new Rect(x, y, width, height);\r
-       }\r
-       \r
-       public Point tl() {\r
-               return new Point(x, y);\r
-       }\r
-\r
-       public Point br() {\r
-               return new Point(x + width, y + height);\r
-       }\r
-\r
-       public Size size() {\r
-               return new Size(width, height);\r
-       }\r
-\r
-       public double area() {\r
-               return width * height;\r
-       }\r
-\r
-       public boolean contains(Point p) {\r
-               return x <= p.x && p.x < x + width && y <= p.y && p.y < y + height;\r
-       }\r
-\r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(height);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(width);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(x);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(y);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if (!(obj instanceof Rect)) return false;\r
-               Rect it = (Rect) obj;\r
-               return x == it.x && y == it.y && width == it.width && height == it.height;\r
-       }\r
-\r
-       @Override\r
-       public String toString() {\r
-               if (this == null) return "null";\r
-               return "{" + x + ", " + y + ", " + width + "x" + height+"}";\r
-       }\r
+\r
+    public int x, y, width, height;\r
+\r
+    public Rect(int x, int y, int width, int height) {\r
+        this.x = x;\r
+        this.y = y;\r
+        this.width = width;\r
+        this.height = height;\r
+    }\r
+\r
+    public Rect() {\r
+        this(0, 0, 0, 0);\r
+    }\r
+\r
+    public Rect(Point p1, Point p2) {\r
+        x = (int) (p1.x < p2.x ? p1.x : p2.x);\r
+        y = (int) (p1.y < p2.y ? p1.y : p2.y);\r
+        width = (int) (p1.x > p2.x ? p1.x : p2.x) - x;\r
+        height = (int) (p1.y > p2.y ? p1.y : p2.y) - y;\r
+    }\r
+\r
+    public Rect(Point p, Size s) {\r
+        this((int)p.x, (int)p.y, (int)s.width, (int)s.height);\r
+    }\r
+\r
+    public Rect(double[] vals) {\r
+       this();\r
+       if(vals!=null) {\r
+               x      = vals.length>0 ? (int)vals[0] : 0;\r
+               y      = vals.length>1 ? (int)vals[1] : 0;\r
+               width  = vals.length>2 ? (int)vals[2] : 0;\r
+               height = vals.length>3 ? (int)vals[3] : 0;\r
+       }\r
+    }\r
+\r
+    public Rect clone() {\r
+        return new Rect(x, y, width, height);\r
+    }\r
+\r
+    public Point tl() {\r
+        return new Point(x, y);\r
+    }\r
+\r
+    public Point br() {\r
+        return new Point(x + width, y + height);\r
+    }\r
+\r
+    public Size size() {\r
+        return new Size(width, height);\r
+    }\r
+\r
+    public double area() {\r
+        return width * height;\r
+    }\r
+\r
+    public boolean contains(Point p) {\r
+        return x <= p.x && p.x < x + width && y <= p.y && p.y < y + height;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(height);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(width);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(x);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(y);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if (!(obj instanceof Rect)) return false;\r
+        Rect it = (Rect) obj;\r
+        return x == it.x && y == it.y && width == it.width && height == it.height;\r
+    }\r
+\r
+    @Override\r
+    public String toString() {\r
+        if (this == null) return "null";\r
+        return "{" + x + ", " + y + ", " + width + "x" + height+"}";\r
+    }\r
 }\r
index bbdd8cb..1d27f28 100644 (file)
@@ -2,86 +2,97 @@ package org.opencv;
 \r
 //javadoc:RotatedRect_\r
 public class RotatedRect {\r
-       \r
-       public Point center;\r
-       public Size size;\r
-       public double angle;\r
-\r
-       public RotatedRect() {\r
-               this.angle=0;\r
-       }\r
-\r
-       public RotatedRect(Point c, Size s, double a) {\r
-               this.center = c.clone();\r
-               this.size = s.clone();\r
-               this.angle = a;\r
-       }\r
-\r
-       public void points(Point pt[])\r
-       {\r
-               double _angle = angle*Math.PI/180.0;\r
-               double b = (double)Math.cos(_angle)*0.5f;\r
-               double a = (double)Math.sin(_angle)*0.5f;\r
-\r
-               pt[0] = new Point(\r
-                               center.x - a*size.height - b*size.width,\r
-                               center.y + b*size.height - a*size.width);\r
-\r
-               pt[1] = new Point(\r
-                               center.x + a*size.height - b*size.width,\r
-                               center.y - b*size.height - a*size.width);\r
-\r
-               pt[2] = new Point(\r
-                               2*center.x - pt[0].x, \r
-                               2*center.y - pt[0].y);\r
-\r
-               pt[3] = new Point(\r
-                               2*center.x - pt[1].x,\r
-                               2*center.y - pt[1].y);\r
-       }\r
-\r
-       public Rect boundingRect() \r
-       {\r
-               Point pt[] = new Point[4];\r
-               points(pt);\r
-               Rect r=new Rect((int)Math.floor(Math.min(Math.min(Math.min(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),\r
-                               (int)Math.floor(Math.min(Math.min(Math.min(pt[0].y, pt[1].y), pt[2].y), pt[3].y)),\r
-                               (int)Math.ceil(Math.max(Math.max(Math.max(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),\r
-                               (int)Math.ceil(Math.max(Math.max(Math.max(pt[0].y, pt[1].y), pt[2].y), pt[3].y)));\r
-               r.width -= r.x - 1;\r
-               r.height -= r.y - 1;\r
-               return r;\r
-       }        \r
-       \r
-       \r
-       public RotatedRect clone() {\r
-               return new RotatedRect(center, size, angle);\r
-       }\r
-       \r
-\r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(center.x);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(center.y);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(size.width);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(size.height);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(angle);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if (!(obj instanceof RotatedRect)) return false;\r
-               RotatedRect it = (RotatedRect) obj;\r
-               return center.equals(it.center) && size.equals(it.size) && angle == it.angle;\r
-       }\r
+\r
+    public Point center;\r
+    public Size size;\r
+    public double angle;\r
+\r
+    public RotatedRect() {\r
+        this.angle=0;\r
+    }\r
+\r
+    public RotatedRect(Point c, Size s, double a) {\r
+        this.center = c.clone();\r
+        this.size = s.clone();\r
+        this.angle = a;\r
+    }\r
+\r
+    public RotatedRect(double[] vals) {\r
+       this();\r
+       if(vals!=null) {\r
+               center.x    = vals.length>0 ? (int)vals[0] : 0;\r
+               center.x    = vals.length>1 ? (int)vals[1] : 0;\r
+               size.width  = vals.length>2 ? (int)vals[2] : 0;\r
+               size.height = vals.length>3 ? (int)vals[3] : 0;\r
+               angle       = vals.length>4 ? (int)vals[4] : 0;\r
+       }\r
+    }\r
+\r
+    public void points(Point pt[])\r
+    {\r
+        double _angle = angle*Math.PI/180.0;\r
+        double b = (double)Math.cos(_angle)*0.5f;\r
+        double a = (double)Math.sin(_angle)*0.5f;\r
+\r
+        pt[0] = new Point(\r
+                center.x - a*size.height - b*size.width,\r
+                center.y + b*size.height - a*size.width);\r
+\r
+        pt[1] = new Point(\r
+                center.x + a*size.height - b*size.width,\r
+                center.y - b*size.height - a*size.width);\r
+\r
+        pt[2] = new Point(\r
+                2*center.x - pt[0].x,\r
+                2*center.y - pt[0].y);\r
+\r
+        pt[3] = new Point(\r
+                2*center.x - pt[1].x,\r
+                2*center.y - pt[1].y);\r
+    }\r
+\r
+    public Rect boundingRect()\r
+    {\r
+        Point pt[] = new Point[4];\r
+        points(pt);\r
+        Rect r=new Rect((int)Math.floor(Math.min(Math.min(Math.min(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),\r
+                (int)Math.floor(Math.min(Math.min(Math.min(pt[0].y, pt[1].y), pt[2].y), pt[3].y)),\r
+                (int)Math.ceil(Math.max(Math.max(Math.max(pt[0].x, pt[1].x), pt[2].x), pt[3].x)),\r
+                (int)Math.ceil(Math.max(Math.max(Math.max(pt[0].y, pt[1].y), pt[2].y), pt[3].y)));\r
+        r.width -= r.x - 1;\r
+        r.height -= r.y - 1;\r
+        return r;\r
+    }\r
+\r
+\r
+    public RotatedRect clone() {\r
+        return new RotatedRect(center, size, angle);\r
+    }\r
+\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(center.x);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(center.y);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(size.width);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(size.height);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(angle);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if (!(obj instanceof RotatedRect)) return false;\r
+        RotatedRect it = (RotatedRect) obj;\r
+        return center.equals(it.center) && size.equals(it.size) && angle == it.angle;\r
+    }\r
 }\r
index c649286..f5d7ed7 100644 (file)
@@ -2,73 +2,82 @@ package org.opencv;
 \r
 //javadoc:Scalar_\r
 public class Scalar {\r
-       \r
-       public double v0, v1, v2, v3;\r
 \r
-       public Scalar(double v0, double v1, double v2, double v3) {\r
-               this.v0 = v0;\r
-               this.v1 = v1;\r
-               this.v2 = v2;\r
-               this.v3 = v3;\r
-       }\r
+    public double v0, v1, v2, v3;\r
 \r
-       public Scalar(double v0, double v1, double v2) {\r
-               this(v0, v1, v2, 0);\r
-       }\r
-       \r
-       public Scalar(double v0, double v1) {\r
-               this(v0, v1, 0, 0);\r
-       }\r
-       \r
-       public Scalar(double v0) {\r
-               this(v0, 0, 0, 0);\r
-       }\r
-       \r
-       public static Scalar all(double v) {\r
-               return new Scalar(v, v, v, v);\r
-       }\r
-       \r
-       public Scalar clone() {\r
-               return new Scalar(v0, v1, v2, v3);\r
-       }\r
+    public Scalar(double v0, double v1, double v2, double v3) {\r
+        this.v0 = v0;\r
+        this.v1 = v1;\r
+        this.v2 = v2;\r
+        this.v3 = v3;\r
+    }\r
 \r
-       public Scalar mul(Scalar it, double scale) {\r
-               return new Scalar( v0 * it.v0 * scale, v1 * it.v1 * scale, \r
-                                                  v2 * it.v2 * scale, v3 * it.v3 * scale );\r
-       }\r
+    public Scalar(double v0, double v1, double v2) {\r
+        this(v0, v1, v2, 0);\r
+    }\r
 \r
-       public Scalar mul(Scalar it) {\r
-               return mul(it, 1);\r
-       }\r
-       public Scalar conj() {\r
-               return new Scalar(v0, -v1, -v2, -v3);\r
-       }\r
+    public Scalar(double v0, double v1) {\r
+        this(v0, v1, 0, 0);\r
+    }\r
 \r
-       public boolean isReal() {\r
-               return v1 == 0 && v2 == 0 && v3 == 0;\r
-       }\r
+    public Scalar(double v0) {\r
+        this(v0, 0, 0, 0);\r
+    }\r
 \r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(v0);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(v1);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(v2);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(v3);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
+    public Scalar(double[] vals) {\r
+       if(vals!=null) {\r
+               v0 = vals.length>0 ? (int)vals[0] : 0;\r
+               v1 = vals.length>1 ? (int)vals[1] : 0;\r
+               v2 = vals.length>2 ? (int)vals[2] : 0;\r
+               v3 = vals.length>3 ? (int)vals[3] : 0;\r
+       }\r
+    }\r
 \r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if (!(obj instanceof Scalar)) return false;\r
-               Scalar it = (Scalar) obj;\r
-               return v0 == it.v0 && v1 == it.v1 && v2 == it.v2 && v3 == it.v3;\r
-       }\r
+    public static Scalar all(double v) {\r
+        return new Scalar(v, v, v, v);\r
+    }\r
+\r
+    public Scalar clone() {\r
+        return new Scalar(v0, v1, v2, v3);\r
+    }\r
+\r
+    public Scalar mul(Scalar it, double scale) {\r
+        return new Scalar( v0 * it.v0 * scale, v1 * it.v1 * scale,\r
+                           v2 * it.v2 * scale, v3 * it.v3 * scale );\r
+    }\r
+\r
+    public Scalar mul(Scalar it) {\r
+        return mul(it, 1);\r
+    }\r
+    public Scalar conj() {\r
+        return new Scalar(v0, -v1, -v2, -v3);\r
+    }\r
+\r
+    public boolean isReal() {\r
+        return v1 == 0 && v2 == 0 && v3 == 0;\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(v0);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(v1);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(v2);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(v3);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if (!(obj instanceof Scalar)) return false;\r
+        Scalar it = (Scalar) obj;\r
+        return v0 == it.v0 && v1 == it.v1 && v2 == it.v2 && v3 == it.v3;\r
+    }\r
 }\r
index 161d1e9..ed7badb 100644 (file)
@@ -3,48 +3,56 @@ package org.opencv;
 //javadoc:Size_\r
 public class Size {\r
 \r
-       public double width, height;\r
-\r
-       public Size(double width, double height) {\r
-               this.width = width;\r
-               this.height = height;\r
-       }\r
-       \r
-       public Size() {\r
-               this(0, 0);\r
-       }\r
-       \r
-       public Size(Point p) {\r
-               width = (double) p.x;\r
-               height = (double) p.y;\r
-       }\r
-       \r
-       public double area() {\r
-               return width * height;\r
-       }\r
-\r
-       public Size clone() {\r
-               return new Size(width, height);\r
-       }\r
-\r
-       @Override\r
-       public int hashCode() {\r
-               final int prime = 31;\r
-               int result = 1;\r
-               long temp;\r
-               temp = Double.doubleToLongBits(height);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               temp = Double.doubleToLongBits(width);\r
-               result = prime * result + (int) (temp ^ (temp >>> 32));\r
-               return result;\r
-       }\r
-\r
-       @Override\r
-       public boolean equals(Object obj) {\r
-               if (this == obj) return true;\r
-               if (!(obj instanceof Size)) return false;\r
-               Size it = (Size) obj;\r
-               return width == it.width && height == it.height;\r
-       }\r
+    public double width, height;\r
+\r
+    public Size(double width, double height) {\r
+        this.width = width;\r
+        this.height = height;\r
+    }\r
+\r
+    public Size() {\r
+        this(0, 0);\r
+    }\r
+\r
+    public Size(Point p) {\r
+        width = (double) p.x;\r
+        height = (double) p.y;\r
+    }\r
+\r
+    public Size(double[] vals) {\r
+       this();\r
+       if(vals!=null) {\r
+               width  = vals.length>0 ? vals[0] : 0;\r
+               height = vals.length>1 ? vals[1] : 0;\r
+       }\r
+    }\r
+\r
+    public double area() {\r
+        return width * height;\r
+    }\r
+\r
+    public Size clone() {\r
+        return new Size(width, height);\r
+    }\r
+\r
+    @Override\r
+    public int hashCode() {\r
+        final int prime = 31;\r
+        int result = 1;\r
+        long temp;\r
+        temp = Double.doubleToLongBits(height);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        temp = Double.doubleToLongBits(width);\r
+        result = prime * result + (int) (temp ^ (temp >>> 32));\r
+        return result;\r
+    }\r
+\r
+    @Override\r
+    public boolean equals(Object obj) {\r
+        if (this == obj) return true;\r
+        if (!(obj instanceof Size)) return false;\r
+        Size it = (Size) obj;\r
+        return width == it.width && height == it.height;\r
+    }\r
 \r
 }\r