gegl r2787 - in trunk: . bin gegl/property-types



Author: ok
Date: Wed Nov 19 23:53:34 2008
New Revision: 2787
URL: http://svn.gnome.org/viewvc/gegl?rev=2787&view=rev

Log:
Made a 'z' instruction (shared with normal mixed bezier/linear paths)
also be the closed curve indicator for spiro curves. Made the GUI
for all nodes appear the same and give all nodes the same
functionality when the path is closed.
* bin/editor.c: (spiro_is_closed), (spiro_close),
(nodes_press_event), (nodes_motion_notify_event), (nodes_expose):
* bin/gegl-path-spiro.c: (gegl_path_spiro_flatten),
(gegl_path_spiro_init):
* gegl/property-types/gegl-path.c: (gegl_path_get),
(gegl_path_closest_point):


Modified:
   trunk/ChangeLog
   trunk/bin/editor.c
   trunk/bin/gegl-path-spiro.c
   trunk/gegl/property-types/gegl-path.c

Modified: trunk/bin/editor.c
==============================================================================
--- trunk/bin/editor.c	(original)
+++ trunk/bin/editor.c	Wed Nov 19 23:53:34 2008
@@ -347,16 +347,32 @@
   return 0;
 }
 
-static gint spiro_close (gint argc, gchar **argv)
+static gboolean spiro_is_closed (GeglPath *path)
 {
-  GeglPathItem knot = *gegl_path_get (tools.path, 0);
+  const GeglPathItem *knot;
+ 
+  if (!path)
+    return FALSE;
+  knot = gegl_path_get (tools.path, -1);
+  if (!knot)
+    return FALSE;
+  if (knot->type == 'z')
+    {
+      return TRUE;
+    }
+  return FALSE;
+}
 
-  if (knot.type == '0')
-    return -1;
-  gegl_path_insert (tools.path, 0, &knot);
-  knot.type = '0';
-  tools.selected_no = tools.drag_no = 0;
-  gegl_path_replace (tools.path, 0, &knot);
+
+static gint spiro_close (gint argc, gchar **argv)
+{
+  GeglPathItem knot = *gegl_path_get (tools.path, -1);
+  if (knot.type == 'z')
+    {
+      g_print ("already closed\n");
+      return -1;
+    }
+  gegl_path_append (tools.path, 'z');
   g_print ("closed spiro\n");
   return 0;
 }
@@ -517,8 +533,6 @@
     {
       gdouble x, y;
       knot = gegl_path_get (vector, i);
-      if (knot->type =='0')
-        knot = gegl_path_get (vector, ++i);
 
       /* handling of handles on beziers */
       if (knot->type == 'C')
@@ -577,7 +591,7 @@
           else if (i==n-1 && tools.selected_no == 0)
             {
               do_command ("spiro-close");
-              tools.selected_no = tools.drag_no = n;
+              tools.selected_no = tools.drag_no = n-1;
             }
           else tools.selected_no = tools.drag_no = i;
 
@@ -643,7 +657,7 @@
           shapeaction (x-sx*1, y-sy*1, 1.5, 0.5, "X");
           CMD("remove-node");
 
-          if (i==0 && i==n-1)
+          if ((i==0 || i==n-1) && !spiro_is_closed (vector))
           switch (knot->type)
             {
 
@@ -721,14 +735,9 @@
                 break;
             }
         }
-
-
-
       prev_knot = knot;
     }
 
-
-
       {
         gdouble linewidth;
         cairo_new_path (cr);
@@ -747,6 +756,7 @@
               gchar buf[256];
               tools.selected_no = node_before;
               sprintf (buf, "insert-node-after %f %f", ex, ey);
+              g_print ("%s %i\n", buf, node_before);
               do_command (buf);
 
               tools.selected_no = node_before + 1;
@@ -779,7 +789,7 @@
             }
 
 
-          if ((n-1 == tools.selected_no) && tools.drag_no < 0)
+          if ((n-1 == tools.selected_no) && tools.drag_no < 0 && !spiro_is_closed (vector))
             {
               /* append a node */
               if (!prev_knot)
@@ -789,10 +799,9 @@
 
               switch (prev_knot->type)
                 {
-                  case 'v':
 foo:
                     {
-                      GeglPathItem knot = {'v', {{ex, ey}}};
+                      GeglPathItem knot = {'V', {{ex, ey}}};
                       gegl_path_insert (vector, -1, &knot);
                       tools.selected_no = tools.drag_no = n;
                       tools.drag_sub = 0;
@@ -800,9 +809,11 @@
                       tools.prevy = ey;
                     }
                     break;
-                  case '*':
+
+                  case 'V':
+                  case 'v':
                     {
-                      GeglPathItem knot = {'*', {{ex, ey}}};
+                      GeglPathItem knot = {'v', {{ex, ey}}};
                       gegl_path_insert (vector, -1, &knot);
                       tools.selected_no = tools.drag_no = n;
                       tools.drag_sub = 0;
@@ -821,6 +832,16 @@
                       tools.prevy = ey;
                     }
                     break;
+                  case '*':
+                    {
+                      GeglPathItem knot = {'*', {{ex, ey}}};
+                      gegl_path_insert (vector, -1, &knot);
+                      tools.selected_no = tools.drag_no = n;
+                      tools.drag_sub = 0;
+                      tools.prevx = ex;
+                      tools.prevy = ey;
+                    }
+                    break;
                   case 'c':
                   case 'C':
                   case 'l':
@@ -841,7 +862,7 @@
               gtk_widget_queue_draw (widget);
               return FALSE;
             }
-          else if (tools.selected_no == 0)
+          else if (tools.selected_no == 0 && !spiro_is_closed (vector))
             {
               g_print ("start add\n");
               {
@@ -973,8 +994,9 @@
       /* make the closest the selected */
 
       n = gegl_path_get_count (vector);
-      if (tools.selected_no != 0 &&
+      if ((tools.selected_no != 0 &&
           tools.selected_no != n -1)
+          || spiro_is_closed (vector))
       {
         gint i;
         gint closest=0;
@@ -1090,8 +1112,8 @@
     {
       gdouble x, y;
       knot = gegl_path_get (vector, i);
-      if (knot->type =='0')
-        knot = gegl_path_get (vector, ++i);
+      if (!knot)
+        g_error ("EEEK!");
       if (knot->type == 'C')
         {
           x = knot->point[0].x;
@@ -1196,7 +1218,7 @@
         if (tools.drag_no == -1)
           {
             drawaction (x-sx*1, y-sy*1, 1.5, 0.5, "X");
-            if (i==0 || i==n-1)
+            if ((i==0 || i==n-1) && !spiro_is_closed (vector))
             switch (knot->type)
               {
                 case 'v':

Modified: trunk/bin/gegl-path-spiro.c
==============================================================================
--- trunk/bin/gegl-path-spiro.c	(original)
+++ trunk/bin/gegl-path-spiro.c	Wed Nov 19 23:53:34 2008
@@ -78,15 +78,13 @@
     {
       switch (iter->d.type)
         {
-          case '0':
-            count--;
-            break;
+          case 'z':
+            closed = TRUE;
           case 'v':
           case 'o':
           case 'O':
           case '[':
           case ']':
-          case 'z':
           case '{':
             break;
           default:
@@ -104,16 +102,12 @@
 
   points = g_new0 (spiro_cp, count);
 
-
   iter = original;
-  if (original && original->d.type=='0')
-    {
-      closed = TRUE;
-      iter = original->next;
-    }
 
   for (i=0; iter; iter=iter->next, i++)
     {
+      if (iter->d.type == 'z')
+        continue;
       points[i].x = iter->d.point[0].x;
       points[i].y = iter->d.point[0].y;
       switch (iter->d.type)
@@ -141,13 +135,16 @@
           case ']':
             points[i].ty = SPIRO_RIGHT;
             break;
-          case 'z':
-            points[i].ty = SPIRO_END;
-            break;
           case '{':
             points[i].ty = SPIRO_OPEN_CONTOUR;
             break;
           case '0':
+            points[i].ty = SPIRO_G2;
+            break;
+          case 'V':
+            points[i].ty = SPIRO_CORNER;
+            break;
+          case 'z':
             break;
           /*case '}':
             points[i].ty = SPIRO_END_CONTOUR;
@@ -163,7 +160,7 @@
   bezcontext.curveto = curveto;
   bezcontext.quadto = quadto;
   bezcontext.path = NULL;
-  SpiroCPsToBezier(points,count, closed, (void*)&bezcontext);
+  SpiroCPsToBezier(points,count - (closed?1:0), closed, (void*)&bezcontext);
   g_free (points);
 
   return bezcontext.path;
@@ -175,7 +172,6 @@
   if (done)
     return;
   done = TRUE;
-  gegl_path_add_type ('0', 1, "spiro closed marker");
   gegl_path_add_type ('v', 1, "spiro corner");
   gegl_path_add_type ('o', 1, "spiro g4");
   gegl_path_add_type ('O', 1, "spiro g2");

Modified: trunk/gegl/property-types/gegl-path.c
==============================================================================
--- trunk/gegl/property-types/gegl-path.c	(original)
+++ trunk/gegl/property-types/gegl-path.c	Wed Nov 19 23:53:34 2008
@@ -1217,7 +1217,7 @@
 
 const GeglPathItem *
 gegl_path_get (GeglPath *vector,
-                      gint        pos)
+               gint        pos)
 {
   GeglPathPrivate *priv = GEGL_PATH_GET_PRIVATE (vector);
   GeglPathList *iter;
@@ -1230,7 +1230,7 @@
         return last;
       count ++;
     }
-  if (count==-1)
+  if (pos==-1)
     {
       return last;
     }
@@ -1537,6 +1537,14 @@
         }
     }
 
+  if (fabs (samples_x[n-1] - samples_x[0]) < 2.1)
+    {
+      if (closest_val == n-1)
+        {
+          closest_val = 0;
+        }
+    }
+
   if (dx)
     {
       *dx = samples_x[closest_val];
@@ -1553,25 +1561,26 @@
       /* what node was the one before us ? */
       iter = priv->path;
       i=0;
-      while (iter)
+
+      for (iter=priv->path,i=0; iter;i++,iter=iter->next)
         {
           gdouble dist;
-          if (iter->d.type !='0')
+          if (iter->d.type == 'z')
+            continue;
+          dist = gegl_path_closest_point (path, 
+                                   iter->d.point[0].x,
+                                   iter->d.point[0].y,
+                                   NULL, NULL, NULL);
+          *node_pos_before = i;
+          if(dist >= closest_val - 2)
             {
-              dist = gegl_path_closest_point (path, 
-                                       iter->d.point[0].x,
-                                       iter->d.point[0].y,
-                                       NULL, NULL, NULL);
-              *node_pos_before = -2;
-              if(dist > closest_val - 2)
-                {
-                  *node_pos_before = i-1;
-                }
-              if(dist > closest_val)
-                  break;
+              *node_pos_before = i-1;
+              break;
             }
-          i++;
-          iter=iter->next;
+          /*if(dist > closest_val)
+            {
+              break;
+            }*/
         }
     }
 
@@ -1579,6 +1588,7 @@
   g_free (samples_x);
   g_free (samples_y);
 
+
   return closest_val * 1.0;
 }
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]