index b4af6bf869d8dfa5d61663a292ca886817a95dcf..c6f13b391bbb9b50386b2881efb4773dc4bc0724 100644 (file)
/*
* 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*/ )
{
}
return mode;
}
-SPColorSpaceType ColorSelector::getColorspace() const
-{
- SPColorSpaceType type = SP_COLORSPACE_TYPE_UNKNOWN;
-
- return type;
-}
-
-bool 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()
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
}
}
{
_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, bool held )
+void ColorSelector::_updateInternals( const SPColor& color, gfloat alpha, gboolean held )
{
g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
- bool colorDifferent = ( !sp_color_is_close( &color, &_color, _epsilon )
+ gboolean colorDifferent = ( !color.isClose( _color, _epsilon )
|| ( fabs((_alpha) - (alpha)) >= _epsilon ) );
- bool grabbed = held && !_held;
- bool released = !held && _held;
+ gboolean grabbed = held && !_held;
+ gboolean released = !held && _held;
// Store these before emmiting any signals
_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++;
{
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 :