]> granicus.if.org Git - poly2tri-c/commitdiff
Make functions on point/edge/triangle/mesh return reffed objects
authorBarak Itkin <lightningismyname@gmail.com>
Fri, 18 May 2012 16:16:20 +0000 (19:16 +0300)
committerBarak Itkin <lightningismyname@gmail.com>
Fri, 18 May 2012 16:16:20 +0000 (19:16 +0300)
refine/edge.c
refine/edge.h
refine/mesh.c
refine/mesh.h
refine/point.c
refine/point.h
refine/triangle.c
refine/triangle.h

index 474423042487eff70cbf65ba17f9f3423883324d..ff57bff6363f43305caf5205607a4183c5416fd9 100644 (file)
@@ -44,10 +44,11 @@ p2tr_edge_new (P2trPoint *start,
   return self;
 }
 
-void
+P2trEdge*
 p2tr_edge_ref (P2trEdge *self)
 {
   ++self->refcount;
+  return self;
 }
 
 void
@@ -122,7 +123,7 @@ P2trMesh*
 p2tr_edge_get_mesh (P2trEdge *self)
 {
   if (self->end != NULL)
-    return self->end->mesh;
+    return p2tr_point_get_mesh (self->end);
   else
     return NULL;
 }
index 392483f7da3e50d9979b1ff6f807ce1ee110f650..0db0e8bb0cfd04f3bbec8bd3ac31b413b768c898 100644 (file)
@@ -47,7 +47,7 @@ P2trEdge*   p2tr_edge_new                  (P2trPoint *start,
                                             P2trPoint *end,
                                             gboolean   constrained);
 
-void        p2tr_edge_ref                  (P2trEdge *self);
+P2trEdge*   p2tr_edge_ref                  (P2trEdge *self);
 
 void        p2tr_edge_unref                (P2trEdge *self);
 
@@ -66,4 +66,4 @@ gdouble     p2tr_edge_get_length_squared   (P2trEdge* self);
 gdouble     p2tr_edge_angle_between        (P2trEdge *e1,
                                             P2trEdge *e2);
 
-#endif
\ No newline at end of file
+#endif
index a252adec0bc27983714d60aabd2db685e779df73..2272c6fa4b258df4c534d805e9d66930144155d1 100644 (file)
@@ -168,10 +168,11 @@ p2tr_mesh_unref (P2trMesh *self)
     p2tr_mesh_free (self);
 }
 
-void
+P2trMesh*
 p2tr_mesh_ref (P2trMesh *self)
 {
   ++self->refcount;
+  return self;
 }
 
 P2trTriangle*
@@ -194,7 +195,7 @@ p2tr_mesh_find_point2 (P2trMesh          *self,
   p2tr_hash_set_iter_init (&iter, self->triangles);
   while (p2tr_hash_set_iter_next (&iter, (gpointer*)&result))
     if (p2tr_triangle_contains_point2 (result, pt, u, v) != P2TR_INTRIANGLE_OUT)
-      return result;
+      return p2tr_triangle_ref (result);
 
   return NULL;
 }
@@ -250,5 +251,8 @@ p2tr_mesh_find_point_local2 (P2trMesh          *self,
   p2tr_hash_set_free (checked_tris);
   g_queue_clear (&to_check);
 
+  if (result != NULL)
+    p2tr_triangle_ref (result);
+
   return result;
 }
index ed2cd272b7a0ea0fc2f4b0044f447f2e9a0bf6c2..e9aca113012b6cef20ba39b8bfac732188eb87e5 100644 (file)
@@ -62,7 +62,7 @@ void          p2tr_mesh_destroy         (P2trMesh *mesh);
 
 void          p2tr_mesh_unref           (P2trMesh *mesh);
 
-void          p2tr_mesh_ref             (P2trMesh *mesh);
+P2trMesh*     p2tr_mesh_ref             (P2trMesh *mesh);
 
 P2trTriangle* p2tr_mesh_find_point      (P2trMesh *self,
                                          const P2trVector2 *pt);
index feee202908b274da2be90126815414d690e1a257..efd1569f17f1db24c0bbd09ed6714c7672273163 100644 (file)
@@ -71,7 +71,7 @@ p2tr_point_get_edge_to (P2trPoint *start,
     if (result == NULL)
       p2tr_exception_programmatic ("Tried to get an edge that doesn't exist!");
     else
-      return result;
+      return p2tr_edge_ref (result);
 }
 
 void
@@ -113,6 +113,7 @@ p2tr_point_edge_ccw (P2trPoint *self,
                      P2trEdge  *e)
 {
   GList *node;
+  P2trEdge *result;
 
   if (P2TR_EDGE_START(e) != self)
       p2tr_exception_programmatic ("Not an edge of this point!");
@@ -122,7 +123,8 @@ p2tr_point_edge_ccw (P2trPoint *self,
     p2tr_exception_programmatic ("Could not find the CCW sibling edge"
         "because the edge is not present in the outgoing-edges list!");
 
-    return (P2trEdge*) g_list_cyclic_next (self->outgoing_edges, node);
+  result = (P2trEdge*) g_list_cyclic_next (self->outgoing_edges, node);
+  return p2tr_edge_ref (result);
 }
 
 P2trEdge*
@@ -130,6 +132,7 @@ p2tr_point_edge_cw (P2trPoint* self,
                     P2trEdge *e)
 {
   GList *node;
+  P2trEdge *result;
 
   if (P2TR_EDGE_START(e) != self)
       p2tr_exception_programmatic ("Not an edge of this point!");
@@ -139,7 +142,8 @@ p2tr_point_edge_cw (P2trPoint* self,
     p2tr_exception_programmatic ("Could not find the CW sibling edge"
         "because the edge is not present in the outgoing-edges list!");
 
-    return (P2trEdge*) g_list_cyclic_prev (self->outgoing_edges, node);
+  result = (P2trEdge*) g_list_cyclic_prev (self->outgoing_edges, node);
+  return p2tr_edge_ref (result);
 }
 
 gboolean
@@ -164,10 +168,16 @@ p2tr_point_has_constrained_edge (P2trPoint *self)
   return FALSE;
 }
 
-void
+/**
+ * Increase the reference count of the given input point
+ * @param self - The point to ref
+ * @return The point given
+ */
+P2trPoint*
 p2tr_point_ref (P2trPoint *self)
 {
   ++self->refcount;
+  return self;
 }
 
 void
@@ -180,5 +190,8 @@ p2tr_point_unref (P2trPoint *self)
 P2trMesh*
 p2tr_point_get_mesh (P2trPoint *self)
 {
-  return self->mesh;
-}
\ No newline at end of file
+  if (self->mesh)
+    return p2tr_mesh_ref (self->mesh);
+  else
+    return NULL;
+}
index 36ac404a4cef399ff3e299794b7c094357d9b810..586d9ea6a13dd3dc07191f2347dbfccc50c7bbc1 100644 (file)
@@ -31,7 +31,7 @@ P2trPoint*  p2tr_point_new                  (const P2trVector2 *c);
 
 P2trPoint*  p2tr_point_new2                 (gdouble x, gdouble y);
 
-void        p2tr_point_ref                  (P2trPoint *self);
+P2trPoint*  p2tr_point_ref                  (P2trPoint *self);
 
 void        p2tr_point_unref                (P2trPoint *self);
 
@@ -63,4 +63,4 @@ gboolean    p2tr_point_has_constrained_edge (P2trPoint *self);
 
 P2trMesh*   p2tr_point_get_mesh             (P2trPoint *self);
 
-#endif
\ No newline at end of file
+#endif
index ae231b58f3dd46f9077c398181ea7638a101ea02..b46f41d073c5049f4f564bf7b0c7f04b3fcbf8ba 100644 (file)
@@ -75,10 +75,11 @@ p2tr_triangle_new (P2trEdge *AB,
   return self;
 }
 
-void
+P2trTriangle*
 p2tr_triangle_ref (P2trTriangle *self)
 {
   ++self->refcount;
+  return self;
 }
 
 void
@@ -139,11 +140,11 @@ p2tr_triangle_get_opposite_point (P2trTriangle *self,
                                   P2trEdge     *e)
 {
   if (self->edges[0] == e || self->edges[0]->mirror == e)
-    return self->edges[1]->end;
+    return p2tr_point_ref (self->edges[1]->end);
   if (self->edges[1] == e || self->edges[1]->mirror == e)
-    return self->edges[2]->end;
+    return p2tr_point_ref (self->edges[2]->end);
   if (self->edges[2] == e || self->edges[2]->mirror == e)
-    return self->edges[0]->end;
+    return p2tr_point_ref (self->edges[0]->end);
 
   p2tr_exception_programmatic ("The edge is not in the triangle!");
 }
@@ -153,11 +154,11 @@ p2tr_triangle_get_opposite_edge (P2trTriangle *self,
                                  P2trPoint    *p)
 {
   if (self->edges[0]->end == p)
-    return self->edges[2];
+    return p2tr_edge_ref (self->edges[2]);
   if (self->edges[1]->end == p)
-    return self->edges[0];
+    return p2tr_edge_ref (self->edges[0]);
   if (self->edges[2]->end == p)
-    return self->edges[1];
+    return p2tr_edge_ref (self->edges[1]);
 
   p2tr_exception_programmatic ("The point is not in the triangle!");
 }
index 048c1aee32b592cc301485eda04c4d6ad7b6097c..164f7c894e68791c5ff5226ac76835fcfe85367d 100644 (file)
@@ -20,7 +20,7 @@ P2trTriangle*   p2tr_triangle_new            (P2trEdge *AB,
                                               P2trEdge *BC,
                                               P2trEdge *CA);
 
-void        p2tr_triangle_ref                (P2trTriangle *self);
+P2trTriangle* p2tr_triangle_ref              (P2trTriangle *self);
 
 void        p2tr_triangle_unref              (P2trTriangle *self);