Code

Super duper mega (fun!) commit: replaced encoding=utf-8 with fileencoding=utf-8 in...
[inkscape.git] / src / widgets / sp-color-selector.cpp
index 1532eddd74bc6516840136c358676a7d32af07ed..c6f13b391bbb9b50386b2881efb4773dc4bc0724 100644 (file)
@@ -1,6 +1,7 @@
 /*
  *   bulia byak <buliabyak@users.sf.net>
-*/ 
+ *   Jon A. Cruz <jon@joncruz.org>
+ */
 
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #include "sp-color-selector.h"
 
 enum {
-       GRABBED,
-       DRAGGED,
-       RELEASED,
-       CHANGED,
-       LAST_SIGNAL
+    GRABBED,
+    DRAGGED,
+    RELEASED,
+    CHANGED,
+    LAST_SIGNAL
 };
 
 #define noDUMP_CHANGE_INFO
 #define FOO_NAME(x) g_type_name( G_TYPE_FROM_INSTANCE(x) )
 
-static void sp_color_selector_class_init (SPColorSelectorClass *klass);
-static void sp_color_selector_init (SPColorSelector *csel);
-static void sp_color_selector_destroy (GtkObject *object);
+static void sp_color_selector_class_init( SPColorSelectorClass *klass );
+static void sp_color_selector_init( SPColorSelector *csel );
+static void sp_color_selector_destroy( GtkObject *object );
 
-static void sp_color_selector_show_all (GtkWidget *widget);
-static void sp_color_selector_hide_all (GtkWidget *widget);
+static void sp_color_selector_show_all( GtkWidget *widget );
+static void sp_color_selector_hide_all( GtkWidget *widget );
 
 static GtkVBoxClass *parent_class;
 static guint csel_signals[LAST_SIGNAL] = {0};
 
-GType
-sp_color_selector_get_type (void)
+double ColorSelector::_epsilon = 1e-4;
+
+GType sp_color_selector_get_type( void )
 {
-       static GType type = 0;
-       if (!type) {
-               static const GTypeInfo info = {
-                       sizeof (SPColorSelectorClass),
-                       NULL, /* base_init */
-                       NULL, /* base_finalize */
-                       (GClassInitFunc) sp_color_selector_class_init,
-                       NULL, /* class_finalize */
-                       NULL, /* class_data */
-                       sizeof (SPColorSelector),
-                       0,        /* n_preallocs */
-                       (GInstanceInitFunc) sp_color_selector_init,
-                       NULL
-               };
-
-               type = g_type_register_static (GTK_TYPE_VBOX,
-                                                                          "SPColorSelector",
-                                                                          &info,
-                                                                          static_cast< GTypeFlags > (0) );
-       }
-       return type;
+    static GType type = 0;
+    if (!type) {
+        static const GTypeInfo info = {
+            sizeof(SPColorSelectorClass),
+            NULL, /* base_init */
+            NULL, /* base_finalize */
+            (GClassInitFunc) sp_color_selector_class_init,
+            NULL, /* class_finalize */
+            NULL, /* class_data */
+            sizeof(SPColorSelector),
+            0,    /* n_preallocs */
+            (GInstanceInitFunc) sp_color_selector_init,
+            NULL
+        };
+
+        type = g_type_register_static( GTK_TYPE_VBOX,
+                                       "SPColorSelector",
+                                       &info,
+                                       static_cast<GTypeFlags>(0) );
+    }
+    return type;
 }
 
-static void
-sp_color_selector_class_init (SPColorSelectorClass *klass)
+void sp_color_selector_class_init( SPColorSelectorClass *klass )
 {
-       static const gchar* nameset[] = {N_("Unnamed"), 0};
-       GtkObjectClass *object_class;
-       GtkWidgetClass *widget_class;
-
-       object_class = (GtkObjectClass *) klass;
-       widget_class = (GtkWidgetClass *) klass;
-
-       parent_class = (GtkVBoxClass*)gtk_type_class (GTK_TYPE_VBOX);
-
-       csel_signals[GRABBED] = gtk_signal_new ("grabbed",
-                                                (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
-                                                GTK_CLASS_TYPE(object_class),
-                                                GTK_SIGNAL_OFFSET (SPColorSelectorClass, grabbed),
-                                                gtk_marshal_NONE__NONE,
-                                                GTK_TYPE_NONE, 0);
-       csel_signals[DRAGGED] = gtk_signal_new ("dragged",
-                                                (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
-                                                GTK_CLASS_TYPE(object_class),
-                                                GTK_SIGNAL_OFFSET (SPColorSelectorClass, dragged),
-                                                gtk_marshal_NONE__NONE,
-                                                GTK_TYPE_NONE, 0);
-       csel_signals[RELEASED] = gtk_signal_new ("released",
-                                                (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
-                                                GTK_CLASS_TYPE(object_class),
-                                                GTK_SIGNAL_OFFSET (SPColorSelectorClass, released),
-                                                gtk_marshal_NONE__NONE,
-                                                GTK_TYPE_NONE, 0);
-       csel_signals[CHANGED] = gtk_signal_new ("changed",
-                                                (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
-                                                GTK_CLASS_TYPE(object_class),
-                                                GTK_SIGNAL_OFFSET (SPColorSelectorClass, changed),
-                                                gtk_marshal_NONE__NONE,
-                                                GTK_TYPE_NONE, 0);
-
-       klass->name = nameset;
-       klass->submode_count = 1;
-
-       object_class->destroy = sp_color_selector_destroy;
-
-       widget_class->show_all = sp_color_selector_show_all;
-       widget_class->hide_all = sp_color_selector_hide_all;
+    static const gchar* nameset[] = {N_("Unnamed"), 0};
+    GtkObjectClass *object_class;
+    GtkWidgetClass *widget_class;
+
+    object_class = GTK_OBJECT_CLASS(klass);
+    widget_class = GTK_WIDGET_CLASS(klass);
+
+    parent_class = GTK_VBOX_CLASS( gtk_type_class(GTK_TYPE_VBOX) );
+
+    csel_signals[GRABBED] = gtk_signal_new( "grabbed",
+                                            (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+                                            GTK_CLASS_TYPE(object_class),
+                                            GTK_SIGNAL_OFFSET(SPColorSelectorClass, grabbed),
+                                            gtk_marshal_NONE__NONE,
+                                            GTK_TYPE_NONE, 0 );
+    csel_signals[DRAGGED] = gtk_signal_new( "dragged",
+                                            (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+                                            GTK_CLASS_TYPE(object_class),
+                                            GTK_SIGNAL_OFFSET(SPColorSelectorClass, dragged),
+                                            gtk_marshal_NONE__NONE,
+                                            GTK_TYPE_NONE, 0 );
+    csel_signals[RELEASED] = gtk_signal_new( "released",
+                                             (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+                                             GTK_CLASS_TYPE(object_class),
+                                             GTK_SIGNAL_OFFSET(SPColorSelectorClass, released),
+                                             gtk_marshal_NONE__NONE,
+                                             GTK_TYPE_NONE, 0 );
+    csel_signals[CHANGED] = gtk_signal_new( "changed",
+                                            (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
+                                            GTK_CLASS_TYPE(object_class),
+                                            GTK_SIGNAL_OFFSET(SPColorSelectorClass, changed),
+                                            gtk_marshal_NONE__NONE,
+                                            GTK_TYPE_NONE, 0 );
+
+    klass->name = nameset;
+    klass->submode_count = 1;
+
+    object_class->destroy = sp_color_selector_destroy;
+
+    widget_class->show_all = sp_color_selector_show_all;
+    widget_class->hide_all = sp_color_selector_hide_all;
 
 }
 
-void sp_color_selector_init (SPColorSelector *csel)
+void sp_color_selector_init( SPColorSelector *csel )
 {
     if ( csel->base )
     {
         csel->base->init();
     }
-/*   gtk_signal_connect (GTK_OBJECT (csel->rgbae), "changed", GTK_SIGNAL_FUNC (sp_color_selector_rgba_entry_changed), csel); */
+/*   gtk_signal_connect(GTK_OBJECT(csel->rgbae), "changed", GTK_SIGNAL_FUNC(sp_color_selector_rgba_entry_changed), csel); */
 }
 
-static void
-sp_color_selector_destroy (GtkObject *object)
+void sp_color_selector_destroy( GtkObject *object )
 {
-       SPColorSelector *csel;
-
-       csel = SP_COLOR_SELECTOR (object);
+    SPColorSelector *csel = SP_COLOR_SELECTOR( object );
     if ( csel->base )
-    {
-        delete csel->base;
-        csel->base = 0;
-    }
+        {
+            delete csel->base;
+            csel->base = 0;
+        }
 
-       if (((GtkObjectClass *) (parent_class))->destroy)
-               (* ((GtkObjectClass *) (parent_class))->destroy) (object);
+    if ( (GTK_OBJECT_CLASS(parent_class))->destroy ) {
+        (* (GTK_OBJECT_CLASS(parent_class))->destroy)(object);
+    }
 }
 
-static void
-sp_color_selector_show_all (GtkWidget *widget)
+void sp_color_selector_show_all( GtkWidget *widget )
 {
-       gtk_widget_show (widget);
+    gtk_widget_show( widget );
 }
 
-static void
-sp_color_selector_hide_all (GtkWidget *widget)
+void sp_color_selector_hide_all( GtkWidget *widget )
 {
-       gtk_widget_hide (widget);
+    gtk_widget_hide( widget );
 }
 
-GtkWidget *
-sp_color_selector_new (GType selector_type, SPColorSpaceType colorspace)
+GtkWidget *sp_color_selector_new( GType selector_type )
 {
-       SPColorSelector *csel;
-       g_return_val_if_fail (g_type_is_a (selector_type, SP_TYPE_COLOR_SELECTOR), NULL);
+    g_return_val_if_fail( g_type_is_a( selector_type, SP_TYPE_COLOR_SELECTOR ), NULL );
 
-       csel = SP_COLOR_SELECTOR (g_object_new (selector_type, NULL));
+    SPColorSelector *csel = SP_COLOR_SELECTOR( g_object_new( selector_type, NULL ) );
 
-       return GTK_WIDGET (csel);
+    return GTK_WIDGET( csel );
 }
 
-double ColorSelector::_epsilon = 1e-4;
-
-void ColorSelector::setSubmode( guint submode )
+void ColorSelector::setSubmode( guint /*submode*/ )
 {
 }
 
@@ -164,26 +157,14 @@ guint ColorSelector::getSubmode() const
     return mode;
 }
 
-SPColorSpaceType ColorSelector::getColorspace() const
-{
-    SPColorSpaceType type = SP_COLORSPACE_TYPE_UNKNOWN;
-
-    return type;
-}
-
-gboolean ColorSelector::setColorspace( SPColorSpaceType colorspace )
-{
-    return false;
-}
-
 ColorSelector::ColorSelector( SPColorSelector* csel )
     : _csel(csel),
+      _color( 0 ),
       _alpha(1.0),
-      _held(FALSE)
+      _held(FALSE),
+      virgin(true)
 {
-    sp_color_set_rgb_rgba32( &_color, 0 );
-
-    virgin = true;
+    g_return_if_fail( SP_IS_COLOR_SELECTOR(_csel) );
 }
 
 ColorSelector::~ColorSelector()
@@ -216,25 +197,46 @@ gfloat ColorSelector::getAlpha() const
     return _alpha;
 }
 
+#include "svg/svg-icc-color.h"
+
 /**
 Called from the outside to set the color; optionally emits signal (only when called from
 downstream, e.g. the RGBA value field, but not from the rest of the program)
 */
 void ColorSelector::setColorAlpha( const SPColor& color, gfloat alpha, bool emit )
 {
+#ifdef DUMP_CHANGE_INFO
+    g_message("ColorSelector::setColorAlpha( this=%p, %f, %f, %f, %s,   %f,   %s) in %s", this, color.v.c[0], color.v.c[1], color.v.c[2], (color.icc?color.icc->colorProfile.c_str():"<null>"), alpha, (emit?"YES":"no"), FOO_NAME(_csel));
+#endif
+    g_return_if_fail( _csel != NULL );
     g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
 
-    if ( virgin || !sp_color_is_close( &color, &_color, _epsilon ) ||
-         (fabs ((_alpha) - (alpha)) >= _epsilon )) {
+#ifdef DUMP_CHANGE_INFO
+    g_message("---- ColorSelector::setColorAlpha    virgin:%s   !close:%s    alpha is:%s in %s",
+              (virgin?"YES":"no"),
+              (!color.isClose( _color, _epsilon )?"YES":"no"),
+              ((fabs((_alpha) - (alpha)) >= _epsilon )?"YES":"no"),
+              FOO_NAME(_csel)
+              );
+#endif
+
+    if ( virgin || !color.isClose( _color, _epsilon ) ||
+         (fabs((_alpha) - (alpha)) >= _epsilon )) {
 
         virgin = false;
 
-        sp_color_copy (&_color, &color);
+        _color = color;
         _alpha = alpha;
-        _colorChanged( color, alpha );
+        _colorChanged();
 
-        if (emit)
-               gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[CHANGED]);
+        if (emit) {
+            gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[CHANGED]);
+        }
+#ifdef DUMP_CHANGE_INFO
+    } else {
+        g_message("++++ ColorSelector::setColorAlpha   color:%08x  ==>  _color:%08X   isClose:%s   in %s", color.toRGBA32(alpha), _color.toRGBA32(_alpha),
+                  (color.isClose( _color, _epsilon )?"YES":"no"), FOO_NAME(_csel));
+#endif
     }
 }
 
@@ -242,30 +244,30 @@ void ColorSelector::_grabbed()
 {
     _held = TRUE;
 #ifdef DUMP_CHANGE_INFO
-    g_message ("%s:%d: About to signal %s in %s", __FILE__, __LINE__,
+    g_message("%s:%d: About to signal %s in %s", __FILE__, __LINE__,
                "GRABBED",
                FOO_NAME(_csel));
 #endif
-    gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[GRABBED]);
+    gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[GRABBED]);
 }
 
 void ColorSelector::_released()
 {
     _held = false;
 #ifdef DUMP_CHANGE_INFO
-    g_message ("%s:%d: About to signal %s in %s", __FILE__, __LINE__,
+    g_message("%s:%d: About to signal %s in %s", __FILE__, __LINE__,
                "RELEASED",
                FOO_NAME(_csel));
 #endif
-    gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[RELEASED]);
-    gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[CHANGED]);
+    gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[RELEASED]);
+    gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[CHANGED]);
 }
 
 // Called from subclasses to update color and broadcast if needed
 void ColorSelector::_updateInternals( const SPColor& color, gfloat alpha, gboolean held )
 {
     g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
-    gboolean colorDifferent = ( !sp_color_is_close( &color, &_color, _epsilon )
+    gboolean colorDifferent = ( !color.isClose( _color, _epsilon )
                                 || ( fabs((_alpha) - (alpha)) >= _epsilon ) );
 
     gboolean grabbed = held && !_held;
@@ -275,59 +277,55 @@ void ColorSelector::_updateInternals( const SPColor& color, gfloat alpha, gboole
     _held = held;
     if ( colorDifferent )
     {
-        sp_color_copy (&_color, &color);
+        _color = color;
         _alpha = alpha;
     }
 
     if ( grabbed )
     {
 #ifdef DUMP_CHANGE_INFO
-        g_message ("%s:%d: About to signal %s to color %08x in %s", __FILE__, __LINE__,
+        g_message("%s:%d: About to signal %s to color %08x::%s in %s", __FILE__, __LINE__,
                    "GRABBED",
-                   sp_color_get_rgba32_falpha(&color,alpha), FOO_NAME(_csel));
+                   color.toRGBA32( alpha ), (color.icc?color.icc->colorProfile.c_str():"<null>"), FOO_NAME(_csel));
 #endif
-        gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[GRABBED]);
+        gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[GRABBED]);
     }
     else if ( released )
     {
 #ifdef DUMP_CHANGE_INFO
-        g_message ("%s:%d: About to signal %s to color %08x in %s", __FILE__, __LINE__,
+        g_message("%s:%d: About to signal %s to color %08x::%s in %s", __FILE__, __LINE__,
                    "RELEASED",
-                   sp_color_get_rgba32_falpha(&color,alpha), FOO_NAME(_csel));
+                   color.toRGBA32( alpha ), (color.icc?color.icc->colorProfile.c_str():"<null>"), FOO_NAME(_csel));
 #endif
-        gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[RELEASED]);
+        gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[RELEASED]);
     }
 
     if ( colorDifferent || released )
     {
 #ifdef DUMP_CHANGE_INFO
-        g_message ("%s:%d: About to signal %s to color %08x in %s", __FILE__, __LINE__,
+        g_message("%s:%d: About to signal %s to color %08x::%s in %s", __FILE__, __LINE__,
                    (_held ? "CHANGED" : "DRAGGED" ),
-                   sp_color_get_rgba32_falpha(&color,alpha), FOO_NAME(_csel));
+                   color.toRGBA32( alpha ), (color.icc?color.icc->colorProfile.c_str():"<null>"), FOO_NAME(_csel));
 #endif
-        gtk_signal_emit (GTK_OBJECT (_csel), csel_signals[_held ? CHANGED : DRAGGED]);
+        gtk_signal_emit(GTK_OBJECT(_csel), csel_signals[_held ? CHANGED : DRAGGED]);
     }
 }
 
-void ColorSelector::_colorChanged( const SPColor& color, gfloat alpha )
+/**
+ * Called once the color actually changes. Allows subclasses to react to changes.
+ */
+void ColorSelector::_colorChanged()
 {
 }
 
-void ColorSelector::getColorAlpha( SPColor& color, gfloat* alpha ) const
+void ColorSelector::getColorAlpha( SPColor &color, gfloat &alpha ) const
 {
     gint i = 0;
 
-    sp_color_copy (&color, &_color);
-    if ( alpha )
-    {
-        *alpha = _alpha;
-    }
+    color = _color;
+    alpha = _alpha;
 
     // Try to catch uninitialized value usage
-    if ( color.colorspace )
-    {
-        i++;
-    }
     if ( color.v.c[0] )
     {
         i++;
@@ -340,12 +338,19 @@ void ColorSelector::getColorAlpha( SPColor& color, gfloat* alpha ) const
     {
         i++;
     }
-    if ( color.v.c[3] )
-    {
-        i++;
-    }
-    if ( alpha && *alpha )
+    if ( alpha )
     {
         i++;
     }
 }
+
+/*
+  Local Variables:
+  mode:c++
+  c-file-style:"stroustrup"
+  c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
+  indent-tabs-mode:nil
+  fill-column:99
+  End:
+*/
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :