Hello,
the attached patch changes the curve tool in the following way.

1. the setting of the curve is remembered if the tool is closed. (this change 
does not increase ram usage, but increases speed a little bit)

2. added a little bit comments.

3. some further small changes.

Ralf Engels
diff -Naur tools-alt/gimpcurvestool.c tools/gimpcurvestool.c
--- tools-alt/gimpcurvestool.c	Sat Aug  4 19:31:11 2001
+++ tools/gimpcurvestool.c	Sat Aug  4 22:15:02 2001
@@ -138,7 +138,8 @@
 static void   curves_free_callback        (GtkWidget      *widget,
 					   gpointer        data);
 
-static void   curves_channel_reset        (gint            );
+static void   curves_channel_reset        (CurvesDialog   *cd,
+					   gint            );
 static void   curves_reset_callback       (GtkWidget      *widget,
 					   gpointer        data);
 static void   curves_ok_callback          (GtkWidget      *widget,
@@ -186,7 +187,7 @@
 static GtkWidget *file_dlg = NULL;
 static gboolean   load_save;
 
-static GtkWidget *channel_items[5];
+static GtkWidget *channel_items[CURVE_NUM_CHANNELS];
 
 static CRMatrix CR_basis =
 {
@@ -307,16 +308,7 @@
       curves_dialog = curves_dialog_new ();
     }
      
-  /*  Initialize the values  */
-  curves_dialog->channel = GIMP_HISTOGRAM_VALUE;
-  for (i = 0; i < 5; i++)
-    for (j = 0; j < 256; j++)
-      curves_dialog->curve[i][j] = j;
-  
-  for (i = 0; i < 5; i++)
-    {
-      curves_channel_reset (i);
-    }
+  /*  Initialize image dependent values  */
 
   curves_dialog->drawable  = gimp_image_active_drawable (gdisp->gimage);
   curves_dialog->color     = gimp_drawable_is_rgb (curves_dialog->drawable);
@@ -349,6 +341,9 @@
     gtk_widget_show (curves_dialog->shell);
 
   curves_update (curves_dialog, GRAPH | DRAW);
+
+  if (curves_dialog->preview)
+    curves_preview (curves_dialog);
 }
 
 static void
@@ -650,24 +645,44 @@
   gint i, j;
 
   cd = g_new (CurvesDialog, 1);
-  cd->cursor_ind_height = -1;
-  cd->cursor_ind_width  = -1;
-  cd->preview           = TRUE;
+
+  /* Try to init all parameters with good values */
   cd->pixmap            = NULL;
+  cd->drawable          = NULL;
+  cd->color             = TRUE;
   cd->channel           = GIMP_HISTOGRAM_VALUE;
+  cd->preview           = TRUE;
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     cd->curve_type[i] = SMOOTH;
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     for (j = 0; j < 256; j++)
       cd->curve[i][j] = j;
 
   for (i = 0; i < (sizeof (cd->col_value) / sizeof (cd->col_value[0])); i++)
     cd->col_value[i] = 0;
 
+  cd->channel = GIMP_HISTOGRAM_VALUE;
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
+    for (j = 0; j < 256; j++)
+      cd->curve[i][j] = j;
+  
+  /* reset all channels */
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
+    {
+      curves_channel_reset (cd, i);
+    }
+
+  /* the next three values are computed on demand. */
+  cd->cursor_ind_height = -1;
+  cd->cursor_ind_width  = -1;
+  cd->cursor_ind_ascent = -1;
+
   cd->lut = gimp_lut_new ();
 
+
+
   /*  The shell and main vbox  */
   cd->shell = gimp_dialog_new (_("Curves"), "curves",
 			       tool_manager_help_func, NULL,
@@ -1324,21 +1339,21 @@
 }
 
 static void
-curves_channel_reset (int i)
+curves_channel_reset (CurvesDialog *cd, int i)
 {
   gint j;
 
-  curves_dialog->grab_point = -1;
+  cd->grab_point = -1;
 
   for (j = 0; j < 17; j++)
   {
-    curves_dialog->points[i][j][0] = -1;
-    curves_dialog->points[i][j][1] = -1;
+    cd->points[i][j][0] = -1;
+    cd->points[i][j][1] = -1;
   }
-  curves_dialog->points[i][0][0] = 0;
-  curves_dialog->points[i][0][1] = 0;
-  curves_dialog->points[i][16][0] = 255;
-  curves_dialog->points[i][16][1] = 255;
+  cd->points[i][0][0] = 0;
+  cd->points[i][0][1] = 0;
+  cd->points[i][16][0] = 255;
+  cd->points[i][16][1] = 255;
 }
 
 
@@ -1355,7 +1370,7 @@
   for (i = 0; i < 256; i++)
     cd->curve[cd->channel][i] = i;
 
-  curves_channel_reset (cd->channel);
+  curves_channel_reset (cd, cd->channel);
 
   curves_calculate_curve (cd);
   curves_update (cd, GRAPH | XRANGE_TOP | DRAW);
@@ -1834,8 +1849,8 @@
   gint  i, j;
   gint  fields;
   gchar buf[50];
-  gint  index[5][17];
-  gint  value[5][17];
+  gint  index[CURVE_NUM_CHANNELS][17];
+  gint  value[CURVE_NUM_CHANNELS][17];
   gint  current_channel;
   
   if (!fgets (buf, 50, f))
@@ -1844,7 +1859,7 @@
   if (strcmp (buf, "# GIMP Curves File\n") != 0)
     return FALSE;
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     {
       for (j = 0; j < 17; j++)
 	{
@@ -1857,7 +1872,7 @@
 	}
     }
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     {
       curves_dialog->curve_type[i] = SMOOTH;
       for (j = 0; j < 17; j++)
@@ -1869,7 +1884,7 @@
 
   /* this is ugly, but works ... */
   current_channel = curves_dialog->channel;
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     {
       curves_dialog->channel = i;
       curves_calculate_curve (curves_dialog);
@@ -1892,7 +1907,7 @@
   gint   i, j;
   gint32 index;
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     if (curves_dialog->curve_type[i] == GFREE)
       {  
 	/*  pick representative points from the curve and make them control points  */
@@ -1906,7 +1921,7 @@
   
   fprintf (f, "# GIMP Curves File\n");
 
-  for (i = 0; i < 5; i++)
+  for (i = 0; i < CURVE_NUM_CHANNELS; i++)
     {
       for (j = 0; j < 17; j++)
 	fprintf (f, "%d %d ", curves_dialog->points[i][j][0], 
diff -Naur tools-alt/gimpcurvestool.h tools/gimpcurvestool.h
--- tools-alt/gimpcurvestool.h	Sat Aug  4 19:31:11 2001
+++ tools/gimpcurvestool.h	Sat Aug  4 20:05:36 2001
@@ -22,6 +22,8 @@
 
 #include "gimpimagemaptool.h"
 
+/* number of channels of curve tool */
+#define CURVE_NUM_CHANNELS 5
 
 #define SMOOTH 0
 #define GFREE  1
@@ -64,19 +66,23 @@
   GimpDrawable *drawable;
   ImageMap     *image_map;
 
-  gint          color;
-  gint          channel;
-  gboolean      preview;
+  gint          color;   /* true if drawable is color */
+  gint          channel; /* active channel (in dialog) */
+  gboolean      preview; /* do we make a preview */
 
+  /* the following values are used when editing the curve */
   gint          grab_point;
   gint          last;
   gint          leftmost;
   gint          rightmost;
-  gint          curve_type[5];
-  gint          points[5][17][2];
-  guchar        curve[5][256];
-  gint          col_value[5];
+
+  /* and now the curve */
+  gint          curve_type[CURVE_NUM_CHANNELS];
+  gint          points[CURVE_NUM_CHANNELS][17][2];
+  guchar        curve[CURVE_NUM_CHANNELS][256];
+  gint          col_value[CURVE_NUM_CHANNELS];
   
+  /* the following values are used when painting the curve */
   gint          cursor_ind_height;
   gint          cursor_ind_width;
   gint          cursor_ind_ascent;

Reply via email to