gimp r24770 - in trunk: . app/core app/gegl app/tools



Author: mitch
Date: Fri Feb  1 12:45:32 2008
New Revision: 24770
URL: http://svn.gnome.org/viewvc/gimp?rev=24770&view=rev

Log:
2008-02-01  Michael Natterer  <mitch gimp org>

	* app/core/core-types.h
	* app/gegl/gegl-types.h: have app/gegl know app/core's namespace.

	* app/gegl/gimpoperationcurves.h: remove temp hack includes.

	* app/gegl/gimpoperationcurves.c: include "core/gimpcurve.h"

	* app/gegl/gimpbrightnesscontrastconfig.[ch]
	* app/gegl/gimpcolorbalanceconfig.[ch]
	* app/gegl/gimpcolorizeconfig.[ch]
	* app/gegl/gimpcurvesconfig.[ch]
	* app/gegl/gimphuesaturationconfig.[ch]
	* app/gegl/gimplevelsconfig.[ch]
	* app/gegl/gimpoperationcurves.[ch]
	* app/gegl/gimpposterizeconfig.[ch]
	* app/gegl/gimpthresholdconfig.[ch]: derive from GimpViewable, install
	properties using the GimpConfig macros, add implementations of
	GimpConfigInterface::equal() and ::copy() where needed.

	* app/tools/gimpimagemaptool.[ch]: add prototype of a menu of
	recently used settings so the same color correction can easily be
	applied to many images.



Modified:
   trunk/ChangeLog
   trunk/app/core/core-types.h
   trunk/app/gegl/gegl-types.h
   trunk/app/gegl/gimpbrightnesscontrastconfig.c
   trunk/app/gegl/gimpbrightnesscontrastconfig.h
   trunk/app/gegl/gimpcolorbalanceconfig.c
   trunk/app/gegl/gimpcolorbalanceconfig.h
   trunk/app/gegl/gimpcolorizeconfig.c
   trunk/app/gegl/gimpcolorizeconfig.h
   trunk/app/gegl/gimpcurvesconfig.c
   trunk/app/gegl/gimpcurvesconfig.h
   trunk/app/gegl/gimphuesaturationconfig.c
   trunk/app/gegl/gimphuesaturationconfig.h
   trunk/app/gegl/gimplevelsconfig.c
   trunk/app/gegl/gimplevelsconfig.h
   trunk/app/gegl/gimpoperationcurves.c
   trunk/app/gegl/gimpposterizeconfig.c
   trunk/app/gegl/gimpposterizeconfig.h
   trunk/app/gegl/gimpthresholdconfig.c
   trunk/app/gegl/gimpthresholdconfig.h
   trunk/app/tools/gimpimagemaptool.c
   trunk/app/tools/gimpimagemaptool.h

Modified: trunk/app/core/core-types.h
==============================================================================
--- trunk/app/core/core-types.h	(original)
+++ trunk/app/core/core-types.h	Fri Feb  1 12:45:32 2008
@@ -23,7 +23,7 @@
 #include "libgimpmodule/gimpmoduletypes.h"
 #include "libgimpthumb/gimpthumb-types.h"
 
-#include "gegl/gegl-types.h"
+#include "base/base-types.h"
 
 #include "core/core-enums.h"
 
@@ -206,6 +206,7 @@
 };
 
 
+#include "gegl/gegl-types.h"
 #include "paint/paint-types.h"
 #include "text/text-types.h"
 #include "vectors/vectors-types.h"

Modified: trunk/app/gegl/gegl-types.h
==============================================================================
--- trunk/app/gegl/gegl-types.h	(original)
+++ trunk/app/gegl/gegl-types.h	Fri Feb  1 12:45:32 2008
@@ -22,7 +22,7 @@
 #define __GEGL_TYPES_H__
 
 
-#include "base/base-types.h"
+#include "core/core-types.h"
 #include "gegl/gegl-types.h"
 
 

Modified: trunk/app/gegl/gimpbrightnesscontrastconfig.c
==============================================================================
--- trunk/app/gegl/gimpbrightnesscontrastconfig.c	(original)
+++ trunk/app/gegl/gimpbrightnesscontrastconfig.c	Fri Feb  1 12:45:32 2008
@@ -50,7 +50,7 @@
 
 G_DEFINE_TYPE_WITH_CODE (GimpBrightnessContrastConfig,
                          gimp_brightness_contrast_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, NULL))
 
 #define parent_class gimp_brightness_contrast_config_parent_class
@@ -59,26 +59,23 @@
 static void
 gimp_brightness_contrast_config_class_init (GimpBrightnessContrastConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->set_property = gimp_brightness_contrast_config_set_property;
-  object_class->get_property = gimp_brightness_contrast_config_get_property;
+  object_class->set_property       = gimp_brightness_contrast_config_set_property;
+  object_class->get_property       = gimp_brightness_contrast_config_get_property;
 
-  g_object_class_install_property (object_class, PROP_BRIGHTNESS,
-                                   g_param_spec_double ("brightness",
-                                                        "Brightness",
-                                                        "Brightness",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_CONTRAST,
-                                   g_param_spec_double ("contrast",
-                                                        "Contrast",
-                                                        "Contrast",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
+  viewable_class->default_stock_id = "gimp-tool-brightness-constrast";
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_BRIGHTNESS,
+                                   "brightness",
+                                   "Brightness",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CONTRAST,
+                                   "contrast",
+                                   "Contrast",
+                                   -1.0, 1.0, 0.0, 0);
 }
 
 static void

Modified: trunk/app/gegl/gimpbrightnesscontrastconfig.h
==============================================================================
--- trunk/app/gegl/gimpbrightnesscontrastconfig.h	(original)
+++ trunk/app/gegl/gimpbrightnesscontrastconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_BRIGHTNESS_CONTRAST_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG            (gimp_brightness_contrast_config_get_type ())
 #define GIMP_BRIGHTNESS_CONTRAST_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG, GimpBrightnessContrastConfig))
 #define GIMP_BRIGHTNESS_CONTRAST_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_BRIGHTNESS_CONTRAST_CONFIG, GimpBrightnessContrastConfigClass))
@@ -35,15 +38,15 @@
 
 struct _GimpBrightnessContrastConfig
 {
-  GObject  parent_instance;
+  GimpViewable  parent_instance;
 
-  gdouble  brightness;
-  gdouble  contrast;
+  gdouble       brightness;
+  gdouble       contrast;
 };
 
 struct _GimpBrightnessContrastConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimpcolorbalanceconfig.c
==============================================================================
--- trunk/app/gegl/gimpcolorbalanceconfig.c	(original)
+++ trunk/app/gegl/gimpcolorbalanceconfig.c	Fri Feb  1 12:45:32 2008
@@ -46,22 +46,27 @@
 };
 
 
-static void   gimp_color_balance_config_iface_init   (GimpConfigInterface *iface);
+static void     gimp_color_balance_config_iface_init   (GimpConfigInterface *iface);
 
-static void   gimp_color_balance_config_get_property (GObject      *object,
-                                                      guint         property_id,
-                                                      GValue       *value,
-                                                      GParamSpec   *pspec);
-static void   gimp_color_balance_config_set_property (GObject      *object,
-                                                      guint         property_id,
-                                                      const GValue *value,
-                                                      GParamSpec   *pspec);
-
-static void   gimp_color_balance_config_reset        (GimpConfig   *config);
+static void     gimp_color_balance_config_get_property (GObject      *object,
+                                                        guint         property_id,
+                                                        GValue       *value,
+                                                        GParamSpec   *pspec);
+static void     gimp_color_balance_config_set_property (GObject      *object,
+                                                        guint         property_id,
+                                                        const GValue *value,
+                                                        GParamSpec   *pspec);
+
+static gboolean gimp_color_balance_config_equal        (GimpConfig   *a,
+                                                        GimpConfig   *b);
+static void     gimp_color_balance_config_reset        (GimpConfig   *config);
+static gboolean gimp_color_balance_config_copy         (GimpConfig   *src,
+                                                        GimpConfig   *dest,
+                                                        GParamFlags   flags);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpColorBalanceConfig, gimp_color_balance_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
                                                 gimp_color_balance_config_iface_init))
 
@@ -71,57 +76,47 @@
 static void
 gimp_color_balance_config_class_init (GimpColorBalanceConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
+
+  object_class->set_property       = gimp_color_balance_config_set_property;
+  object_class->get_property       = gimp_color_balance_config_get_property;
 
-  object_class->set_property = gimp_color_balance_config_set_property;
-  object_class->get_property = gimp_color_balance_config_get_property;
+  viewable_class->default_stock_id = "gimp-tool-color-balance";
 
-  g_object_class_install_property (object_class, PROP_RANGE,
-                                   g_param_spec_enum ("range",
-                                                      "range",
-                                                      "The affected range",
-                                                      GIMP_TYPE_TRANSFER_MODE,
-                                                      GIMP_MIDTONES,
-                                                      G_PARAM_READWRITE |
-                                                      G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_CYAN_RED,
-                                   g_param_spec_double ("cyan-red",
-                                                        "Cyan-Red",
-                                                        "Cyan-Red",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_MAGENTA_GREEN,
-                                   g_param_spec_double ("magenta-green",
-                                                        "Magenta-Green",
-                                                        "Magenta-Green",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_YELLOW_BLUE,
-                                   g_param_spec_double ("yellow-blue",
-                                                        "Yellow-Blue",
-                                                        "Yellow-Blue",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_PRESERVE_LUMINOSITY,
-                                   g_param_spec_boolean ("preserve-luminosity",
-                                                         "Preserve Luminosity",
-                                                         "Preserve Luminosity",
-                                                         TRUE,
-                                                         G_PARAM_READWRITE |
-                                                         G_PARAM_CONSTRUCT));
+  GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_RANGE,
+                                 "range",
+                                 "The affected range",
+                                 GIMP_TYPE_TRANSFER_MODE,
+                                 GIMP_MIDTONES, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_CYAN_RED,
+                                   "cyan-red",
+                                   "Cyan-Red",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_MAGENTA_GREEN,
+                                   "magenta-green",
+                                   "Magenta-Green",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_YELLOW_BLUE,
+                                   "yellow-blue",
+                                   "Yellow-Blue",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_BOOLEAN (object_class, PROP_PRESERVE_LUMINOSITY,
+                                    "preserve-luminosity",
+                                    "Preserve Luminosity",
+                                    TRUE, 0);
 }
 
 static void
 gimp_color_balance_config_iface_init (GimpConfigInterface *iface)
 {
+  iface->equal = gimp_color_balance_config_equal;
   iface->reset = gimp_color_balance_config_reset;
+  iface->copy  = gimp_color_balance_config_copy;
 }
 
 static void
@@ -205,14 +200,36 @@
     }
 }
 
+static gboolean
+gimp_color_balance_config_equal (GimpConfig *a,
+                                 GimpConfig *b)
+{
+  GimpColorBalanceConfig *a_config = GIMP_COLOR_BALANCE_CONFIG (a);
+  GimpColorBalanceConfig *b_config = GIMP_COLOR_BALANCE_CONFIG (b);
+  GimpTransferMode        range;
+
+  for (range = GIMP_SHADOWS; range <= GIMP_HIGHLIGHTS; range++)
+    {
+      if (a_config->cyan_red[range]      != b_config->cyan_red[range]      ||
+          a_config->magenta_green[range] != b_config->magenta_green[range] ||
+          a_config->yellow_blue[range]   != b_config->yellow_blue[range])
+        return FALSE;
+    }
+
+  /* don't compare "range" */
+
+  if (a_config->preserve_luminosity != b_config->preserve_luminosity)
+    return FALSE;
+
+  return TRUE;
+}
+
 static void
 gimp_color_balance_config_reset (GimpConfig *config)
 {
   GimpColorBalanceConfig *cb_config = GIMP_COLOR_BALANCE_CONFIG (config);
   GimpTransferMode        range;
 
-  g_object_freeze_notify (G_OBJECT (config));
-
   for (range = GIMP_SHADOWS; range <= GIMP_HIGHLIGHTS; range++)
     {
       cb_config->range = range;
@@ -221,8 +238,35 @@
 
   gimp_config_reset_property (G_OBJECT (config), "range");
   gimp_config_reset_property (G_OBJECT (config), "preserve-luminosity");
+}
 
-  g_object_thaw_notify (G_OBJECT (config));
+static gboolean
+gimp_color_balance_config_copy (GimpConfig  *src,
+                                GimpConfig  *dest,
+                                GParamFlags  flags)
+{
+  GimpColorBalanceConfig *src_config  = GIMP_COLOR_BALANCE_CONFIG (src);
+  GimpColorBalanceConfig *dest_config = GIMP_COLOR_BALANCE_CONFIG (dest);
+  GimpTransferMode        range;
+
+  for (range = GIMP_SHADOWS; range <= GIMP_HIGHLIGHTS; range++)
+    {
+      dest_config->cyan_red[range]      = src_config->cyan_red[range];
+      dest_config->magenta_green[range] = src_config->magenta_green[range];
+      dest_config->yellow_blue[range]   = src_config->yellow_blue[range];
+    }
+
+  g_object_notify (G_OBJECT (dest), "cyan-red");
+  g_object_notify (G_OBJECT (dest), "magenta-green");
+  g_object_notify (G_OBJECT (dest), "yellow-blue");
+
+  dest_config->range               = src_config->range;
+  dest_config->preserve_luminosity = src_config->preserve_luminosity;
+
+  g_object_notify (G_OBJECT (dest), "range");
+  g_object_notify (G_OBJECT (dest), "preserve-luminosity");
+
+  return TRUE;
 }
 
 

Modified: trunk/app/gegl/gimpcolorbalanceconfig.h
==============================================================================
--- trunk/app/gegl/gimpcolorbalanceconfig.h	(original)
+++ trunk/app/gegl/gimpcolorbalanceconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_COLOR_BALANCE_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_COLOR_BALANCE_CONFIG            (gimp_color_balance_config_get_type ())
 #define GIMP_COLOR_BALANCE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COLOR_BALANCE_CONFIG, GimpColorBalanceConfig))
 #define GIMP_COLOR_BALANCE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_COLOR_BALANCE_CONFIG, GimpColorBalanceConfigClass))
@@ -35,7 +38,7 @@
 
 struct _GimpColorBalanceConfig
 {
-  GObject           parent_instance;
+  GimpViewable      parent_instance;
 
   GimpTransferMode  range;
 
@@ -48,7 +51,7 @@
 
 struct _GimpColorBalanceConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimpcolorizeconfig.c
==============================================================================
--- trunk/app/gegl/gimpcolorizeconfig.c	(original)
+++ trunk/app/gegl/gimpcolorizeconfig.c	Fri Feb  1 12:45:32 2008
@@ -53,7 +53,7 @@
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpColorizeConfig, gimp_colorize_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, NULL))
 
 #define parent_class gimp_colorize_config_parent_class
@@ -62,34 +62,28 @@
 static void
 gimp_colorize_config_class_init (GimpColorizeConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->set_property = gimp_colorize_config_set_property;
-  object_class->get_property = gimp_colorize_config_get_property;
+  object_class->set_property       = gimp_colorize_config_set_property;
+  object_class->get_property       = gimp_colorize_config_get_property;
 
-  g_object_class_install_property (object_class, PROP_HUE,
-                                   g_param_spec_double ("hue",
-                                                        "Hue",
-                                                        "Hue",
-                                                        0.0, 1.0, 0.5,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_SATURATION,
-                                   g_param_spec_double ("saturation",
-                                                        "Saturation",
-                                                        "Saturation",
-                                                        0.0, 1.0, 0.5,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_LIGHTNESS,
-                                   g_param_spec_double ("lightness",
-                                                        "Lightness",
-                                                        "Lightness",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
+  viewable_class->default_stock_id = "gimp-tool-colorize";
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HUE,
+                                   "hue",
+                                   "Hue",
+                                   0.0, 1.0, 0.5, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_SATURATION,
+                                   "saturation",
+                                   "Saturation",
+                                   0.0, 1.0, 0.5, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_LIGHTNESS,
+                                   "lightness",
+                                   "Lightness",
+                                   -1.0, 1.0, 0.0, 0);
 }
 
 static void

Modified: trunk/app/gegl/gimpcolorizeconfig.h
==============================================================================
--- trunk/app/gegl/gimpcolorizeconfig.h	(original)
+++ trunk/app/gegl/gimpcolorizeconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_COLORIZE_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_COLORIZE_CONFIG            (gimp_colorize_config_get_type ())
 #define GIMP_COLORIZE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_COLORIZE_CONFIG, GimpColorizeConfig))
 #define GIMP_COLORIZE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_COLORIZE_CONFIG, GimpColorizeConfigClass))
@@ -35,16 +38,16 @@
 
 struct _GimpColorizeConfig
 {
-  GObject  parent_instance;
+  GimpViewable  parent_instance;
 
-  gdouble  hue;
-  gdouble  saturation;
-  gdouble  lightness;
+  gdouble       hue;
+  gdouble       saturation;
+  gdouble       lightness;
 };
 
 struct _GimpColorizeConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimpcurvesconfig.c
==============================================================================
--- trunk/app/gegl/gimpcurvesconfig.c	(original)
+++ trunk/app/gegl/gimpcurvesconfig.c	Fri Feb  1 12:45:32 2008
@@ -37,6 +37,8 @@
 /*  temp cruft  */
 #include "base/curves.h"
 
+#include "core/gimpcurve.h"
+
 #include "gimpcurvesconfig.h"
 
 #include "gimp-intl.h"
@@ -50,26 +52,31 @@
 };
 
 
-static void   gimp_curves_config_iface_init   (GimpConfigInterface *iface);
-
-static void   gimp_curves_config_finalize     (GObject          *object);
-static void   gimp_curves_config_get_property (GObject          *object,
-                                               guint             property_id,
-                                               GValue           *value,
-                                               GParamSpec       *pspec);
-static void   gimp_curves_config_set_property (GObject          *object,
-                                               guint             property_id,
-                                               const GValue     *value,
-                                               GParamSpec       *pspec);
+static void     gimp_curves_config_iface_init   (GimpConfigInterface *iface);
 
-static void   gimp_curves_config_reset        (GimpConfig       *config);
+static void     gimp_curves_config_finalize     (GObject          *object);
+static void     gimp_curves_config_get_property (GObject          *object,
+                                                 guint             property_id,
+                                                 GValue           *value,
+                                                 GParamSpec       *pspec);
+static void     gimp_curves_config_set_property (GObject          *object,
+                                                 guint             property_id,
+                                                 const GValue     *value,
+                                                 GParamSpec       *pspec);
+
+static gboolean gimp_curves_config_equal        (GimpConfig       *a,
+                                                 GimpConfig       *b);
+static void     gimp_curves_config_reset        (GimpConfig       *config);
+static gboolean gimp_curves_config_copy         (GimpConfig       *src,
+                                                 GimpConfig       *dest,
+                                                 GParamFlags       flags);
 
-static void   gimp_curves_config_curve_dirty  (GimpCurve        *curve,
-                                               GimpCurvesConfig *config);
+static void     gimp_curves_config_curve_dirty  (GimpCurve        *curve,
+                                                 GimpCurvesConfig *config);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpCurvesConfig, gimp_curves_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
                                                 gimp_curves_config_iface_init))
 
@@ -79,33 +86,34 @@
 static void
 gimp_curves_config_class_init (GimpCurvesConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->finalize     = gimp_curves_config_finalize;
-  object_class->set_property = gimp_curves_config_set_property;
-  object_class->get_property = gimp_curves_config_get_property;
-
-  g_object_class_install_property (object_class, PROP_CHANNEL,
-                                   g_param_spec_enum ("channel",
-                                                      "Channel",
-                                                      "The affected channel",
-                                                      GIMP_TYPE_HISTOGRAM_CHANNEL,
-                                                      GIMP_HISTOGRAM_VALUE,
-                                                      G_PARAM_READWRITE |
-                                                      G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_CURVE,
-                                   g_param_spec_object ("curve",
-                                                        "Curve",
-                                                        "Curve",
-                                                        GIMP_TYPE_CURVE,
-                                                        G_PARAM_READWRITE));
+  object_class->finalize           = gimp_curves_config_finalize;
+  object_class->set_property       = gimp_curves_config_set_property;
+  object_class->get_property       = gimp_curves_config_get_property;
+
+  viewable_class->default_stock_id = "gimp-tool-curves";
+
+  GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_CHANNEL,
+                                 "channel",
+                                 "The affected channel",
+                                 GIMP_TYPE_HISTOGRAM_CHANNEL,
+                                 GIMP_HISTOGRAM_VALUE, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_OBJECT (object_class, PROP_CURVE,
+                                   "curve",
+                                   "Curve",
+                                   GIMP_TYPE_CURVE,
+                                   GIMP_CONFIG_PARAM_AGGREGATE);
 }
 
 static void
 gimp_curves_config_iface_init (GimpConfigInterface *iface)
 {
+  iface->equal = gimp_curves_config_equal;
   iface->reset = gimp_curves_config_reset;
+  iface->copy  = gimp_curves_config_copy;
 }
 
 static void
@@ -137,11 +145,8 @@
        channel <= GIMP_HISTOGRAM_ALPHA;
        channel++)
     {
-      if (self->curve[channel])
-        {
-          g_object_unref (self->curve[channel]);
-          self->curve[channel] = NULL;
-        }
+      g_object_unref (self->curve[channel]);
+      self->curve[channel] = NULL;
     }
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -187,9 +192,20 @@
       break;
 
     case PROP_CURVE:
-      if (self->curve[self->channel])
-        g_object_unref (self->curve[self->channel]);
-      self->curve[self->channel] = g_value_dup_object (value);
+      {
+        GimpCurve *src_curve  = g_value_get_object (value);
+        GimpCurve *dest_curve = self->curve[self->channel];
+
+        if (src_curve && dest_curve)
+          {
+            gimp_config_sync (G_OBJECT (src_curve), G_OBJECT (dest_curve), 0);
+
+            memcpy (dest_curve->points, src_curve->points,
+                    sizeof (src_curve->points));
+            memcpy (dest_curve->curve, src_curve->curve,
+                    sizeof (src_curve->curve));
+          }
+      }
       break;
 
    default:
@@ -198,14 +214,49 @@
     }
 }
 
+static gboolean
+gimp_curves_config_equal (GimpConfig *a,
+                          GimpConfig *b)
+{
+  GimpCurvesConfig     *a_config = GIMP_CURVES_CONFIG (a);
+  GimpCurvesConfig     *b_config = GIMP_CURVES_CONFIG (b);
+  GimpHistogramChannel  channel;
+
+  for (channel = GIMP_HISTOGRAM_VALUE;
+       channel <= GIMP_HISTOGRAM_ALPHA;
+       channel++)
+    {
+      GimpCurve *a_curve = a_config->curve[channel];
+      GimpCurve *b_curve = b_config->curve[channel];
+
+      if (a_curve && b_curve)
+        {
+          if (a_curve->curve_type != b_curve->curve_type)
+            return FALSE;
+
+          if (memcmp (a_curve->points, b_curve->points,
+                      sizeof (b_curve->points)) ||
+              memcmp (a_curve->curve, b_curve->curve,
+                      sizeof (b_curve->curve)))
+            return FALSE;
+        }
+      else if (a_curve || b_curve)
+        {
+          return FALSE;
+        }
+    }
+
+  /* don't compare "channel" */
+
+  return TRUE;
+}
+
 static void
 gimp_curves_config_reset (GimpConfig *config)
 {
   GimpCurvesConfig     *c_config = GIMP_CURVES_CONFIG (config);
   GimpHistogramChannel  channel;
 
-  g_object_freeze_notify (G_OBJECT (config));
-
   for (channel = GIMP_HISTOGRAM_VALUE;
        channel <= GIMP_HISTOGRAM_ALPHA;
        channel++)
@@ -215,8 +266,42 @@
     }
 
   gimp_config_reset_property (G_OBJECT (config), "channel");
+}
 
-  g_object_thaw_notify (G_OBJECT (config));
+static gboolean
+gimp_curves_config_copy (GimpConfig  *src,
+                         GimpConfig  *dest,
+                         GParamFlags  flags)
+{
+  GimpCurvesConfig     *src_config  = GIMP_CURVES_CONFIG (src);
+  GimpCurvesConfig     *dest_config = GIMP_CURVES_CONFIG (dest);
+  GimpHistogramChannel  channel;
+
+  for (channel = GIMP_HISTOGRAM_VALUE;
+       channel <= GIMP_HISTOGRAM_ALPHA;
+       channel++)
+    {
+      GimpCurve *src_curve  = src_config->curve[channel];
+      GimpCurve *dest_curve = dest_config->curve[channel];
+
+      if (src_curve && dest_curve)
+        {
+          gimp_config_sync (G_OBJECT (src_curve), G_OBJECT (dest_curve), 0);
+
+          memcpy (dest_curve->points,
+                  src_curve->points, sizeof (src_curve->points));
+          memcpy (dest_curve->curve,
+                  src_curve->curve, sizeof (src_curve->curve));
+        }
+    }
+
+  g_object_notify (G_OBJECT (dest), "curve");
+
+  dest_config->channel = src_config->channel;
+
+  g_object_notify (G_OBJECT (dest), "channel");
+
+  return TRUE;
 }
 
 static void

Modified: trunk/app/gegl/gimpcurvesconfig.h
==============================================================================
--- trunk/app/gegl/gimpcurvesconfig.h	(original)
+++ trunk/app/gegl/gimpcurvesconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,9 +23,7 @@
 #define __GIMP_CURVES_CONFIG_H__
 
 
-#include <gdk-pixbuf/gdk-pixbuf.h> /* eek */
-#include "core/core-types.h" /* eek */
-#include "core/gimpcurve.h" /* eek */
+#include "core/gimpviewable.h"
 
 
 #define GIMP_TYPE_CURVES_CONFIG            (gimp_curves_config_get_type ())
@@ -40,7 +38,7 @@
 
 struct _GimpCurvesConfig
 {
-  GObject               parent_instance;
+  GimpViewable          parent_instance;
 
   GimpHistogramChannel  channel;
 
@@ -49,7 +47,7 @@
 
 struct _GimpCurvesConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimphuesaturationconfig.c
==============================================================================
--- trunk/app/gegl/gimphuesaturationconfig.c	(original)
+++ trunk/app/gegl/gimphuesaturationconfig.c	Fri Feb  1 12:45:32 2008
@@ -44,22 +44,27 @@
 };
 
 
-static void   gimp_hue_saturation_config_iface_init   (GimpConfigInterface *iface);
+static void     gimp_hue_saturation_config_iface_init   (GimpConfigInterface *iface);
 
-static void   gimp_hue_saturation_config_get_property (GObject      *object,
-                                                       guint         property_id,
-                                                       GValue       *value,
-                                                       GParamSpec   *pspec);
-static void   gimp_hue_saturation_config_set_property (GObject      *object,
-                                                       guint         property_id,
-                                                       const GValue *value,
-                                                       GParamSpec   *pspec);
-
-static void   gimp_hue_saturation_config_reset        (GimpConfig   *config);
+static void     gimp_hue_saturation_config_get_property (GObject      *object,
+                                                         guint         property_id,
+                                                         GValue       *value,
+                                                         GParamSpec   *pspec);
+static void     gimp_hue_saturation_config_set_property (GObject      *object,
+                                                         guint         property_id,
+                                                         const GValue *value,
+                                                         GParamSpec   *pspec);
+
+static gboolean gimp_hue_saturation_config_equal        (GimpConfig   *a,
+                                                         GimpConfig   *b);
+static void     gimp_hue_saturation_config_reset        (GimpConfig   *config);
+static gboolean gimp_hue_saturation_config_copy         (GimpConfig   *src,
+                                                         GimpConfig   *dest,
+                                                         GParamFlags   flags);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpHueSaturationConfig, gimp_hue_saturation_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
                                                 gimp_hue_saturation_config_iface_init))
 
@@ -69,57 +74,47 @@
 static void
 gimp_hue_saturation_config_class_init (GimpHueSaturationConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
+
+  object_class->set_property       = gimp_hue_saturation_config_set_property;
+  object_class->get_property       = gimp_hue_saturation_config_get_property;
 
-  object_class->set_property = gimp_hue_saturation_config_set_property;
-  object_class->get_property = gimp_hue_saturation_config_get_property;
+  viewable_class->default_stock_id = "gimp-tool-hue-saturation";
 
-  g_object_class_install_property (object_class, PROP_RANGE,
-                                   g_param_spec_enum ("range",
-                                                      "range",
-                                                      "The affected range",
-                                                      GIMP_TYPE_HUE_RANGE,
-                                                      GIMP_ALL_HUES,
-                                                      G_PARAM_READWRITE |
-                                                      G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_HUE,
-                                   g_param_spec_double ("hue",
-                                                        "Hue",
-                                                        "Hue",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_SATURATION,
-                                   g_param_spec_double ("saturation",
-                                                        "Saturation",
-                                                        "Saturation",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_LIGHTNESS,
-                                   g_param_spec_double ("lightness",
-                                                        "Lightness",
-                                                        "Lightness",
-                                                        -1.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_OVERLAP,
-                                   g_param_spec_double ("overlap",
-                                                        "Overlap",
-                                                        "Overlap",
-                                                        0.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
+  GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_RANGE,
+                                 "range",
+                                 "The affected range",
+                                 GIMP_TYPE_HUE_RANGE,
+                                 GIMP_ALL_HUES, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HUE,
+                                   "hue",
+                                   "Hue",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_SATURATION,
+                                   "saturation",
+                                   "Saturation",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_LIGHTNESS,
+                                   "lightness",
+                                   "Lightness",
+                                   -1.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_OVERLAP,
+                                   "overlap",
+                                   "Overlap",
+                                   0.0, 1.0, 0.0, 0);
 }
 
 static void
 gimp_hue_saturation_config_iface_init (GimpConfigInterface *iface)
 {
+  iface->equal = gimp_hue_saturation_config_equal;
   iface->reset = gimp_hue_saturation_config_reset;
+  iface->copy  = gimp_hue_saturation_config_copy;
 }
 
 static void
@@ -203,14 +198,36 @@
     }
 }
 
+static gboolean
+gimp_hue_saturation_config_equal (GimpConfig *a,
+                                  GimpConfig *b)
+{
+  GimpHueSaturationConfig *a_config = GIMP_HUE_SATURATION_CONFIG (a);
+  GimpHueSaturationConfig *b_config = GIMP_HUE_SATURATION_CONFIG (b);
+  GimpHueRange             range;
+
+  for (range = GIMP_ALL_HUES; range <= GIMP_MAGENTA_HUES; range++)
+    {
+      if (a_config->hue[range]        != b_config->hue[range]        ||
+          a_config->saturation[range] != b_config->saturation[range] ||
+          a_config->lightness[range]  != b_config->lightness[range])
+        return FALSE;
+    }
+
+  /* don't compare "range" */
+
+  if (a_config->overlap != b_config->overlap)
+    return FALSE;
+
+  return TRUE;
+}
+
 static void
 gimp_hue_saturation_config_reset (GimpConfig *config)
 {
   GimpHueSaturationConfig *hs_config = GIMP_HUE_SATURATION_CONFIG (config);
   GimpHueRange             range;
 
-  g_object_freeze_notify (G_OBJECT (config));
-
   for (range = GIMP_ALL_HUES; range <= GIMP_MAGENTA_HUES; range++)
     {
       hs_config->range = range;
@@ -219,8 +236,35 @@
 
   gimp_config_reset_property (G_OBJECT (config), "range");
   gimp_config_reset_property (G_OBJECT (config), "overlap");
+}
 
-  g_object_thaw_notify (G_OBJECT (config));
+static gboolean
+gimp_hue_saturation_config_copy (GimpConfig   *src,
+                                 GimpConfig   *dest,
+                                 GParamFlags   flags)
+{
+  GimpHueSaturationConfig *src_config  = GIMP_HUE_SATURATION_CONFIG (src);
+  GimpHueSaturationConfig *dest_config = GIMP_HUE_SATURATION_CONFIG (dest);
+  GimpHueRange             range;
+
+  for (range = GIMP_ALL_HUES; range <= GIMP_MAGENTA_HUES; range++)
+    {
+      dest_config->hue[range]        = src_config->hue[range];
+      dest_config->saturation[range] = src_config->saturation[range];
+      dest_config->lightness[range]  = src_config->lightness[range];
+    }
+
+  g_object_notify (G_OBJECT (dest), "hue");
+  g_object_notify (G_OBJECT (dest), "saturation");
+  g_object_notify (G_OBJECT (dest), "lightness");
+
+  dest_config->range   = src_config->range;
+  dest_config->overlap = src_config->overlap;
+
+  g_object_notify (G_OBJECT (dest), "range");
+  g_object_notify (G_OBJECT (dest), "overlap");
+
+  return TRUE;
 }
 
 

Modified: trunk/app/gegl/gimphuesaturationconfig.h
==============================================================================
--- trunk/app/gegl/gimphuesaturationconfig.h	(original)
+++ trunk/app/gegl/gimphuesaturationconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_HUE_SATURATION_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_HUE_SATURATION_CONFIG            (gimp_hue_saturation_config_get_type ())
 #define GIMP_HUE_SATURATION_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_HUE_SATURATION_CONFIG, GimpHueSaturationConfig))
 #define GIMP_HUE_SATURATION_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_HUE_SATURATION_CONFIG, GimpHueSaturationConfigClass))
@@ -35,7 +38,7 @@
 
 struct _GimpHueSaturationConfig
 {
-  GObject       parent_instance;
+  GimpViewable  parent_instance;
 
   GimpHueRange  range;
 
@@ -48,7 +51,7 @@
 
 struct _GimpHueSaturationConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimplevelsconfig.c
==============================================================================
--- trunk/app/gegl/gimplevelsconfig.c	(original)
+++ trunk/app/gegl/gimplevelsconfig.c	Fri Feb  1 12:45:32 2008
@@ -55,22 +55,27 @@
 };
 
 
-static void   gimp_levels_config_iface_init   (GimpConfigInterface *iface);
+static void     gimp_levels_config_iface_init   (GimpConfigInterface *iface);
 
-static void   gimp_levels_config_get_property (GObject       *object,
-                                               guint          property_id,
-                                               GValue        *value,
-                                               GParamSpec    *pspec);
-static void   gimp_levels_config_set_property (GObject       *object,
-                                               guint          property_id,
-                                               const GValue  *value,
-                                               GParamSpec    *pspec);
-
-static void   gimp_levels_config_reset        (GimpConfig    *config);
+static void     gimp_levels_config_get_property (GObject       *object,
+                                                 guint          property_id,
+                                                 GValue        *value,
+                                                 GParamSpec    *pspec);
+static void     gimp_levels_config_set_property (GObject       *object,
+                                                 guint          property_id,
+                                                 const GValue  *value,
+                                                 GParamSpec    *pspec);
+
+static gboolean gimp_levels_config_equal        (GimpConfig    *a,
+                                                 GimpConfig    *b);
+static void     gimp_levels_config_reset        (GimpConfig    *config);
+static gboolean gimp_levels_config_copy         (GimpConfig    *src,
+                                                 GimpConfig    *dest,
+                                                 GParamFlags    flags);
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpLevelsConfig, gimp_levels_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG,
                                                 gimp_levels_config_iface_init))
 
@@ -80,65 +85,52 @@
 static void
 gimp_levels_config_class_init (GimpLevelsConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
+
+  object_class->set_property       = gimp_levels_config_set_property;
+  object_class->get_property       = gimp_levels_config_get_property;
 
-  object_class->set_property = gimp_levels_config_set_property;
-  object_class->get_property = gimp_levels_config_get_property;
+  viewable_class->default_stock_id = "gimp-tool-levels";
 
-  g_object_class_install_property (object_class, PROP_CHANNEL,
-                                   g_param_spec_enum ("channel",
-                                                      "Channel",
-                                                      "The affected channel",
-                                                      GIMP_TYPE_HISTOGRAM_CHANNEL,
-                                                      GIMP_HISTOGRAM_VALUE,
-                                                      G_PARAM_READWRITE |
-                                                      G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_GAMMA,
-                                   g_param_spec_double ("gamma",
-                                                        "Gamma",
-                                                        "Gamma",
-                                                        0.1, 10.0, 1.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_LOW_INPUT,
-                                   g_param_spec_double ("low-input",
-                                                        "Low Input",
-                                                        "Low Input",
-                                                        0.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_HIGH_INPUT,
-                                   g_param_spec_double ("high-input",
-                                                        "High Input",
-                                                        "High Input",
-                                                        0.0, 1.0, 1.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_LOW_OUTPUT,
-                                   g_param_spec_double ("low-output",
-                                                        "Low Output",
-                                                        "Low Output",
-                                                        0.0, 1.0, 0.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_HIGH_OUTPUT,
-                                   g_param_spec_double ("high-output",
-                                                        "High Output",
-                                                        "High Output",
-                                                        0.0, 1.0, 1.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
+  GIMP_CONFIG_INSTALL_PROP_ENUM (object_class, PROP_CHANNEL,
+                                 "channel",
+                                 "The affected channel",
+                                 GIMP_TYPE_HISTOGRAM_CHANNEL,
+                                 GIMP_HISTOGRAM_VALUE, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_GAMMA,
+                                   "gamma",
+                                   "Gamma",
+                                   0.1, 10.0, 1.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_LOW_INPUT,
+                                   "low-input",
+                                   "Low Input",
+                                   0.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HIGH_INPUT,
+                                   "high-input",
+                                   "High Input",
+                                   0.0, 1.0, 1.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_LOW_OUTPUT,
+                                   "low-output",
+                                   "Low Output",
+                                   0.0, 1.0, 0.0, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HIGH_OUTPUT,
+                                   "high-output",
+                                   "High Output",
+                                   0.0, 1.0, 1.0, 0);
 }
 
 static void
 gimp_levels_config_iface_init (GimpConfigInterface *iface)
 {
+  iface->equal = gimp_levels_config_equal;
   iface->reset = gimp_levels_config_reset;
+  iface->copy  = gimp_levels_config_copy;
 }
 
 static void
@@ -232,14 +224,37 @@
     }
 }
 
+static gboolean
+gimp_levels_config_equal (GimpConfig *a,
+                          GimpConfig *b)
+{
+  GimpLevelsConfig     *a_config = GIMP_LEVELS_CONFIG (a);
+  GimpLevelsConfig     *b_config = GIMP_LEVELS_CONFIG (b);
+  GimpHistogramChannel  channel;
+
+  for (channel = GIMP_HISTOGRAM_VALUE;
+       channel <= GIMP_HISTOGRAM_ALPHA;
+       channel++)
+    {
+      if (a_config->gamma[channel]       != b_config->gamma[channel]      ||
+          a_config->low_input[channel]   != b_config->low_input[channel]  ||
+          a_config->high_input[channel]  != b_config->high_input[channel] ||
+          a_config->low_output[channel]  != b_config->low_output[channel] ||
+          a_config->high_output[channel] != b_config->high_output[channel])
+        return FALSE;
+    }
+
+  /* don't compare "channel" */
+
+  return TRUE;
+}
+
 static void
 gimp_levels_config_reset (GimpConfig *config)
 {
   GimpLevelsConfig     *l_config = GIMP_LEVELS_CONFIG (config);
   GimpHistogramChannel  channel;
 
-  g_object_freeze_notify (G_OBJECT (config));
-
   for (channel = GIMP_HISTOGRAM_VALUE;
        channel <= GIMP_HISTOGRAM_ALPHA;
        channel++)
@@ -249,8 +264,39 @@
     }
 
   gimp_config_reset_property (G_OBJECT (config), "channel");
+}
 
-  g_object_thaw_notify (G_OBJECT (config));
+static gboolean
+gimp_levels_config_copy (GimpConfig  *src,
+                         GimpConfig  *dest,
+                         GParamFlags  flags)
+{
+  GimpLevelsConfig     *src_config  = GIMP_LEVELS_CONFIG (src);
+  GimpLevelsConfig     *dest_config = GIMP_LEVELS_CONFIG (dest);
+  GimpHistogramChannel  channel;
+
+  for (channel = GIMP_HISTOGRAM_VALUE;
+       channel <= GIMP_HISTOGRAM_ALPHA;
+       channel++)
+    {
+      dest_config->gamma[channel]       = src_config->gamma[channel];
+      dest_config->low_input[channel]   = src_config->low_input[channel];
+      dest_config->high_input[channel]  = src_config->high_input[channel];
+      dest_config->low_output[channel]  = src_config->low_output[channel];
+      dest_config->high_output[channel] = src_config->high_output[channel];
+    }
+
+  g_object_notify (G_OBJECT (dest), "gamma");
+  g_object_notify (G_OBJECT (dest), "low-input");
+  g_object_notify (G_OBJECT (dest), "high-input");
+  g_object_notify (G_OBJECT (dest), "low-output");
+  g_object_notify (G_OBJECT (dest), "high-output");
+
+  dest_config->channel = src_config->channel;
+
+  g_object_notify (G_OBJECT (dest), "channel");
+
+  return TRUE;
 }
 
 

Modified: trunk/app/gegl/gimplevelsconfig.h
==============================================================================
--- trunk/app/gegl/gimplevelsconfig.h	(original)
+++ trunk/app/gegl/gimplevelsconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_LEVELS_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_LEVELS_CONFIG            (gimp_levels_config_get_type ())
 #define GIMP_LEVELS_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_LEVELS_CONFIG, GimpLevelsConfig))
 #define GIMP_LEVELS_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_LEVELS_CONFIG, GimpLevelsConfigClass))
@@ -35,7 +38,7 @@
 
 struct _GimpLevelsConfig
 {
-  GObject               parent_instance;
+  GimpViewable          parent_instance;
 
   GimpHistogramChannel  channel;
 
@@ -50,7 +53,7 @@
 
 struct _GimpLevelsConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimpoperationcurves.c
==============================================================================
--- trunk/app/gegl/gimpoperationcurves.c	(original)
+++ trunk/app/gegl/gimpoperationcurves.c	Fri Feb  1 12:45:32 2008
@@ -28,6 +28,8 @@
 
 #include "gegl-types.h"
 
+#include "core/gimpcurve.h"
+
 #include "gimpcurvesconfig.h"
 #include "gimpoperationcurves.h"
 

Modified: trunk/app/gegl/gimpposterizeconfig.c
==============================================================================
--- trunk/app/gegl/gimpposterizeconfig.c	(original)
+++ trunk/app/gegl/gimpposterizeconfig.c	Fri Feb  1 12:45:32 2008
@@ -48,7 +48,7 @@
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpPosterizeConfig, gimp_posterize_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, NULL))
 
 #define parent_class gimp_posterize_config_parent_class
@@ -57,18 +57,18 @@
 static void
 gimp_posterize_config_class_init (GimpPosterizeConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->set_property = gimp_posterize_config_set_property;
-  object_class->get_property = gimp_posterize_config_get_property;
+  object_class->set_property       = gimp_posterize_config_set_property;
+  object_class->get_property       = gimp_posterize_config_get_property;
 
-  g_object_class_install_property (object_class, PROP_LEVELS,
-                                   g_param_spec_int ("levels",
-                                                     "Levels",
-                                                     "Posterize levels",
-                                                     2, 256, 3,
-                                                     G_PARAM_READWRITE |
-                                                     G_PARAM_CONSTRUCT));
+  viewable_class->default_stock_id = "gimp-tool-posterize";
+
+  GIMP_CONFIG_INSTALL_PROP_INT (object_class, PROP_LEVELS,
+                                "levels",
+                                "Posterize levels",
+                                2, 256, 3, 0);
 }
 
 static void

Modified: trunk/app/gegl/gimpposterizeconfig.h
==============================================================================
--- trunk/app/gegl/gimpposterizeconfig.h	(original)
+++ trunk/app/gegl/gimpposterizeconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_POSTERIZE_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_POSTERIZE_CONFIG            (gimp_posterize_config_get_type ())
 #define GIMP_POSTERIZE_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_POSTERIZE_CONFIG, GimpPosterizeConfig))
 #define GIMP_POSTERIZE_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_POSTERIZE_CONFIG, GimpPosterizeConfigClass))
@@ -35,14 +38,14 @@
 
 struct _GimpPosterizeConfig
 {
-  GObject  parent_instance;
+  GimpViewable  parent_instance;
 
-  gint     levels;
+  gint          levels;
 };
 
 struct _GimpPosterizeConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/gegl/gimpthresholdconfig.c
==============================================================================
--- trunk/app/gegl/gimpthresholdconfig.c	(original)
+++ trunk/app/gegl/gimpthresholdconfig.c	Fri Feb  1 12:45:32 2008
@@ -52,7 +52,7 @@
 
 
 G_DEFINE_TYPE_WITH_CODE (GimpThresholdConfig, gimp_threshold_config,
-                         G_TYPE_OBJECT,
+                         GIMP_TYPE_VIEWABLE,
                          G_IMPLEMENT_INTERFACE (GIMP_TYPE_CONFIG, NULL))
 
 #define parent_class gimp_threshold_config_parent_class
@@ -61,26 +61,23 @@
 static void
 gimp_threshold_config_class_init (GimpThresholdConfigClass *klass)
 {
-  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  GObjectClass      *object_class   = G_OBJECT_CLASS (klass);
+  GimpViewableClass *viewable_class = GIMP_VIEWABLE_CLASS (klass);
 
-  object_class->set_property = gimp_threshold_config_set_property;
-  object_class->get_property = gimp_threshold_config_get_property;
+  object_class->set_property       = gimp_threshold_config_set_property;
+  object_class->get_property       = gimp_threshold_config_get_property;
 
-  g_object_class_install_property (object_class, PROP_LOW,
-                                   g_param_spec_double ("low",
-                                                        "Low",
-                                                        "Low threshold",
-                                                        0.0, 1.0, 0.5,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
-
-  g_object_class_install_property (object_class, PROP_HIGH,
-                                   g_param_spec_double ("high",
-                                                        "High",
-                                                        "High threshold",
-                                                        0.0, 1.0, 1.0,
-                                                        G_PARAM_READWRITE |
-                                                        G_PARAM_CONSTRUCT));
+  viewable_class->default_stock_id = "gimp-tool-threshold";
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_LOW,
+                                   "low",
+                                   "Low threshold",
+                                   0.0, 1.0, 0.5, 0);
+
+  GIMP_CONFIG_INSTALL_PROP_DOUBLE (object_class, PROP_HIGH,
+                                   "high",
+                                   "High threshold",
+                                   0.0, 1.0, 1.0, 0);
 }
 
 static void

Modified: trunk/app/gegl/gimpthresholdconfig.h
==============================================================================
--- trunk/app/gegl/gimpthresholdconfig.h	(original)
+++ trunk/app/gegl/gimpthresholdconfig.h	Fri Feb  1 12:45:32 2008
@@ -23,6 +23,9 @@
 #define __GIMP_THRESHOLD_CONFIG_H__
 
 
+#include "core/gimpviewable.h"
+
+
 #define GIMP_TYPE_THRESHOLD_CONFIG            (gimp_threshold_config_get_type ())
 #define GIMP_THRESHOLD_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_THRESHOLD_CONFIG, GimpThresholdConfig))
 #define GIMP_THRESHOLD_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  GIMP_TYPE_THRESHOLD_CONFIG, GimpThresholdConfigClass))
@@ -35,15 +38,15 @@
 
 struct _GimpThresholdConfig
 {
-  GObject  parent_instance;
+  GimpViewable  parent_instance;
 
-  gdouble  low;
-  gdouble  high;
+  gdouble       low;
+  gdouble       high;
 };
 
 struct _GimpThresholdConfigClass
 {
-  GObjectClass  parent_class;
+  GimpViewableClass  parent_class;
 };
 
 

Modified: trunk/app/tools/gimpimagemaptool.c
==============================================================================
--- trunk/app/tools/gimpimagemaptool.c	(original)
+++ trunk/app/tools/gimpimagemaptool.c	Fri Feb  1 12:45:32 2008
@@ -36,10 +36,13 @@
 #include "core/gimpimage.h"
 #include "core/gimpimage-pick-color.h"
 #include "core/gimpimagemap.h"
+#include "core/gimplist.h"
 #include "core/gimppickable.h"
 #include "core/gimpprojection.h"
 #include "core/gimptoolinfo.h"
 
+#include "widgets/gimpcontainercombobox.h"
+#include "widgets/gimpcontainerview.h"
 #include "widgets/gimpdialogfactory.h"
 #include "widgets/gimptooldialog.h"
 #include "widgets/gimpwidgets-utils.h"
@@ -57,6 +60,11 @@
 
 /*  local function prototypes  */
 
+static void      gimp_image_map_tool_class_init  (GimpImageMapToolClass *klass);
+static void      gimp_image_map_tool_base_init   (GimpImageMapToolClass *klass);
+
+static void      gimp_image_map_tool_init        (GimpImageMapTool *im_tool);
+
 static GObject * gimp_image_map_tool_constructor (GType             type,
                                                   guint             n_params,
                                                   GObjectConstructParam *params);
@@ -91,31 +99,63 @@
                                                   gint              response_id,
                                                   GimpImageMapTool *im_tool);
 
-static void      gimp_image_map_tool_load_clicked     (GtkWidget        *widget,
-                                                       GimpImageMapTool *tool);
-static void      gimp_image_map_tool_load_ext_clicked (GtkWidget        *widget,
-                                                       GdkModifierType   state,
-                                                       GimpImageMapTool *tool);
-static void      gimp_image_map_tool_save_clicked     (GtkWidget        *widget,
-                                                       GimpImageMapTool *tool);
-static void      gimp_image_map_tool_save_ext_clicked (GtkWidget        *widget,
-                                                       GdkModifierType   state,
-                                                       GimpImageMapTool *tool);
-
-static void      gimp_image_map_tool_settings_dialog  (GimpImageMapTool *im_tool,
-                                                       const gchar      *title,
-                                                       gboolean          save);
-static void      gimp_image_map_tool_notify_preview   (GObject          *config,
-                                                       GParamSpec       *pspec,
-                                                       GimpImageMapTool *im_tool);
-static void      gimp_image_map_tool_gegl_notify      (GObject          *config,
-                                                       const GParamSpec *pspec,
-                                                       GimpImageMapTool *im_tool);
-
-
-G_DEFINE_TYPE (GimpImageMapTool, gimp_image_map_tool, GIMP_TYPE_COLOR_TOOL)
+static void      gimp_image_map_tool_recent_selected  (GimpContainerView *view,
+                                                       GimpViewable      *object,
+                                                       gpointer           insert_data,
+                                                       GimpImageMapTool  *tool);
+
+static void      gimp_image_map_tool_load_clicked     (GtkWidget         *widget,
+                                                       GimpImageMapTool  *tool);
+static void      gimp_image_map_tool_load_ext_clicked (GtkWidget         *widget,
+                                                       GdkModifierType    state,
+                                                       GimpImageMapTool  *tool);
+static void      gimp_image_map_tool_save_clicked     (GtkWidget         *widget,
+                                                       GimpImageMapTool  *tool);
+static void      gimp_image_map_tool_save_ext_clicked (GtkWidget         *widget,
+                                                       GdkModifierType    state,
+                                                       GimpImageMapTool  *tool);
+
+static void      gimp_image_map_tool_settings_dialog  (GimpImageMapTool  *im_tool,
+                                                       const gchar       *title,
+                                                       gboolean           save);
+static void      gimp_image_map_tool_notify_preview   (GObject           *config,
+                                                       GParamSpec        *pspec,
+                                                       GimpImageMapTool  *im_tool);
+static void      gimp_image_map_tool_gegl_notify      (GObject           *config,
+                                                       const GParamSpec  *pspec,
+                                                       GimpImageMapTool  *im_tool);
+
+
+static GimpColorToolClass *parent_class = NULL;
+
+
+GType
+gimp_image_map_tool_get_type (void)
+{
+  static GType type = 0;
+
+  if (! type)
+    {
+      const GTypeInfo info =
+      {
+        sizeof (GimpImageMapToolClass),
+        (GBaseInitFunc) gimp_image_map_tool_base_init,
+        (GBaseFinalizeFunc) NULL,
+        (GClassInitFunc) gimp_image_map_tool_class_init,
+        NULL,           /* class_finalize */
+        NULL,           /* class_data */
+        sizeof (GimpImageMapTool),
+        0,              /* n_preallocs */
+        (GInstanceInitFunc) gimp_image_map_tool_init,
+      };
+
+      type = g_type_register_static (GIMP_TYPE_COLOR_TOOL,
+                                     "GimpImageMapTool",
+                                     &info, 0);
+    }
 
-#define parent_class gimp_image_map_tool_parent_class
+  return type;
+}
 
 
 static void
@@ -125,6 +165,8 @@
   GimpToolClass      *tool_class       = GIMP_TOOL_CLASS (klass);
   GimpColorToolClass *color_tool_class = GIMP_COLOR_TOOL_CLASS (klass);
 
+  parent_class = g_type_class_peek_parent (klass);
+
   object_class->constructor = gimp_image_map_tool_constructor;
   object_class->finalize    = gimp_image_map_tool_finalize;
 
@@ -150,6 +192,12 @@
 }
 
 static void
+gimp_image_map_tool_base_init (GimpImageMapToolClass *klass)
+{
+  klass->recent_settings = gimp_list_new (GIMP_TYPE_VIEWABLE, FALSE);
+}
+
+static void
 gimp_image_map_tool_init (GimpImageMapTool *image_map_tool)
 {
   GimpTool *tool = GIMP_TOOL (image_map_tool);
@@ -243,6 +291,9 @@
       GimpImageMapToolClass *klass;
       GtkWidget             *shell;
       GtkWidget             *vbox;
+      GtkWidget             *hbox;
+      GtkWidget             *label;
+      GtkWidget             *combo;
       GtkWidget             *toggle;
       const gchar           *stock_id;
 
@@ -275,6 +326,27 @@
       gtk_container_set_border_width (GTK_CONTAINER (vbox), 6);
       gtk_container_add (GTK_CONTAINER (GTK_DIALOG (shell)->vbox), vbox);
 
+      hbox = gtk_hbox_new (FALSE, 4);
+      gtk_box_pack_start (GTK_BOX (image_map_tool->main_vbox), hbox,
+                          FALSE, FALSE, 0);
+      gtk_widget_show (hbox);
+
+      label = gtk_label_new (_("Recent Settings:"));
+      gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+      gtk_widget_show (label);
+
+      combo = gimp_container_combo_box_new (klass->recent_settings,
+                                            GIMP_CONTEXT (tool_info->tool_options),
+                                            16, 0);
+      gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
+      gtk_widget_show (combo);
+
+      gimp_help_set_help_data (combo, _("Pick a setting from the list"), NULL);
+
+      g_signal_connect_after (combo, "select-item",
+                              G_CALLBACK (gimp_image_map_tool_recent_selected),
+                              image_map_tool);
+
       /*  The preview toggle  */
       toggle = gimp_prop_check_button_new (G_OBJECT (tool_info->tool_options),
                                            "preview",
@@ -566,6 +638,49 @@
 }
 
 static void
+gimp_image_map_tool_add_recent (GimpImageMapTool *image_map_tool)
+{
+  GimpContainer *recent;
+  GimpConfig    *current;
+  GimpConfig    *config = NULL;
+  GList         *list;
+  time_t         now;
+  struct tm      tm;
+  gchar          buf[64];
+  gchar         *name;
+
+  recent  = GIMP_IMAGE_MAP_TOOL_GET_CLASS (image_map_tool)->recent_settings;
+  current = GIMP_CONFIG (image_map_tool->config);
+
+  for (list = GIMP_LIST (recent)->list; list; list = g_list_next (list))
+    {
+      config = list->data;
+
+      if (gimp_config_is_equal_to (config, current))
+        {
+          gimp_container_reorder (recent, GIMP_OBJECT (config), 0);
+          break;
+        }
+
+      config = NULL;
+    }
+
+  if (! config)
+    {
+      config = gimp_config_duplicate (current);
+      gimp_container_insert (recent, GIMP_OBJECT (config), 0);
+    }
+
+  now = time (NULL);
+  localtime_r (&now, &tm);
+  strftime (buf, sizeof (buf), "%F %T", &tm);
+
+  name = g_locale_to_utf8 (buf, -1, NULL, NULL, NULL);
+  gimp_object_set_name (GIMP_OBJECT (config), name);
+  g_free (name);
+}
+
+static void
 gimp_image_map_tool_response (GtkWidget        *widget,
                               gint              response_id,
                               GimpImageMapTool *image_map_tool)
@@ -598,6 +713,8 @@
           gimp_tool_control_set_preserve (tool->control, FALSE);
 
           gimp_image_flush (tool->display->image);
+
+          gimp_image_map_tool_add_recent (image_map_tool);
         }
 
       tool->display  = NULL;
@@ -627,6 +744,21 @@
 }
 
 static void
+gimp_image_map_tool_recent_selected (GimpContainerView *view,
+                                     GimpViewable      *object,
+                                     gpointer           insert_data,
+                                     GimpImageMapTool  *tool)
+{
+  if (object)
+    {
+      gimp_config_copy (GIMP_CONFIG (object),
+                        GIMP_CONFIG (tool->config), 0);
+
+      gimp_container_view_select_item (view, NULL);
+    }
+}
+
+static void
 gimp_image_map_tool_notify_preview (GObject          *config,
                                     GParamSpec       *pspec,
                                     GimpImageMapTool *image_map_tool)

Modified: trunk/app/tools/gimpimagemaptool.h
==============================================================================
--- trunk/app/tools/gimpimagemaptool.h	(original)
+++ trunk/app/tools/gimpimagemaptool.h	Fri Feb  1 12:45:32 2008
@@ -69,6 +69,8 @@
   const gchar        *save_button_tip;
   const gchar        *save_dialog_title;
 
+  GimpContainer      *recent_settings;
+
   /* virtual functions */
   GeglNode * (* get_operation) (GimpImageMapTool  *image_map_tool,
                                 GObject          **config);



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