sp-color-slider.cpp revision 53650c4839343807b95444a86e89225fc71de648
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define __SP_COLOR_SLIDER_C__
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * A slider with colored background
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Author:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Lauris Kaplinski <lauris@kaplinski.com>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * bulia byak <buliabyak@users.sf.net>
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen *
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen * Copyright (C) 2001-2002 Lauris Kaplinski
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * This code is in public domain
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <gtk/gtkversion.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include <gtk/gtksignal.h>
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "sp-color-scales.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "preferences.h"
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilix#define SLIDER_WIDTH 96
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define SLIDER_HEIGHT 8
77a4a003111bd5cfb771d4849801c898aeb889b0cilix#define ARROW_SIZE 7
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilixenum {
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix GRABBED,
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix DRAGGED,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm RELEASED,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm CHANGED,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm LAST_SIGNAL
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm};
d9c673867f424647c1586c356cc0ac1d34d0a98ajohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_class_init (SPColorSliderClass *klass);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_init (SPColorSlider *slider);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_destroy (GtkObject *object);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_realize (GtkWidget *widget);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenstatic void sp_color_slider_size_request (GtkWidget *widget, GtkRequisition *requisition);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelenstatic void sp_color_slider_size_allocate (GtkWidget *widget, GtkAllocation *allocation);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen/* static void sp_color_slider_draw (GtkWidget *widget, GdkRectangle *area); */
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen/* static void sp_color_slider_draw_focus (GtkWidget *widget); */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/* static void sp_color_slider_draw_default (GtkWidget *widget); */
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelenstatic gint sp_color_slider_expose (GtkWidget *widget, GdkEventExpose *event);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudstatic gint sp_color_slider_button_press (GtkWidget *widget, GdkEventButton *event);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudstatic gint sp_color_slider_button_release (GtkWidget *widget, GdkEventButton *event);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudstatic gint sp_color_slider_motion_notify (GtkWidget *widget, GdkEventMotion *event);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_adjustment_changed (GtkAdjustment *adjustment, SPColorSlider *slider);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_color_slider_adjustment_value_changed (GtkAdjustment *adjustment, SPColorSlider *slider);
8d9f5d586a04809427ce1df284a5720112177991cilix
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilixstatic void sp_color_slider_paint (SPColorSlider *slider, GdkRectangle *area);
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyakstatic const guchar *sp_color_slider_render_gradient (gint x0, gint y0, gint width, gint height,
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen gint c[], gint dc[], guint b0, guint b1, guint mask);
0cc5b8d2f7b87c4222ee3662071bef1cb1f22b06bgkstatic const guchar *sp_color_slider_render_map (gint x0, gint y0, gint width, gint height,
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen guchar *map, gint start, gint step, guint b0, guint b1, guint mask);
f4db63be4e929f4706410914295deccaceea19cdcilix
ab99111a42436818e6902e044c8f3af2b724263bcilixstatic GtkWidgetClass *parent_class;
76db360f5f052775326e6d406b9e1e9e2966e11acilixstatic guint slider_signals[LAST_SIGNAL] = {0};
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix
64aee804a6a47424f7994e60558351b8cf2ea4dbcilixGtkType
b320a8d186114a5122ddc3afbe95110eb6cb10cecilixsp_color_slider_get_type (void)
044d712d4d03f8354962d54e47cfac2346a69ccccilix{
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix //TODO: switch to GObject
2f5c0701b333a695eedb1680beb1adf95c0723dacilix // GtkType and such calls were deprecated a while back with the
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen // introduction of GObject as a separate layer, with GType instead. --JonCruz
e54ce05030e6aab675331e18f46f029f55ed1bf0cilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm static GtkType type = 0;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (!type) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GtkTypeInfo info = {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (gchar*) "SPColorSlider",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sizeof (SPColorSlider),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sizeof (SPColorSliderClass),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (GtkClassInitFunc) sp_color_slider_class_init,
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen (GtkObjectInitFunc) sp_color_slider_init,
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen NULL, NULL, NULL
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix };
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud type = gtk_type_unique (GTK_TYPE_WIDGET, &info);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud }
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud return type;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmsp_color_slider_class_init (SPColorSliderClass *klass)
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen{
8d9f5d586a04809427ce1df284a5720112177991cilix GtkObjectClass *object_class;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix GtkWidgetClass *widget_class;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen object_class = (GtkObjectClass *) klass;
0cc5b8d2f7b87c4222ee3662071bef1cb1f22b06bgk widget_class = (GtkWidgetClass *) klass;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
f4db63be4e929f4706410914295deccaceea19cdcilix parent_class = (GtkWidgetClass*)gtk_type_class (GTK_TYPE_WIDGET);
b0c42c0dfcd02cc05126371948489a5a88b2e4b3cilix
76db360f5f052775326e6d406b9e1e9e2966e11acilix slider_signals[GRABBED] = gtk_signal_new ("grabbed",
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix GTK_CLASS_TYPE(object_class),
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix GTK_SIGNAL_OFFSET (SPColorSliderClass, grabbed),
044d712d4d03f8354962d54e47cfac2346a69ccccilix gtk_marshal_NONE__NONE,
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix GTK_TYPE_NONE, 0);
2f5c0701b333a695eedb1680beb1adf95c0723dacilix slider_signals[DRAGGED] = gtk_signal_new ("dragged",
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_CLASS_TYPE(object_class),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_SIGNAL_OFFSET (SPColorSliderClass, dragged),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_marshal_NONE__NONE,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_TYPE_NONE, 0);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider_signals[RELEASED] = gtk_signal_new ("released",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_CLASS_TYPE(object_class),
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_SIGNAL_OFFSET (SPColorSliderClass, released),
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen gtk_marshal_NONE__NONE,
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen GTK_TYPE_NONE, 0);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider_signals[CHANGED] = gtk_signal_new ("changed",
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix (GtkSignalRunType)(GTK_RUN_FIRST | GTK_RUN_NO_RECURSE),
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix GTK_CLASS_TYPE(object_class),
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix GTK_SIGNAL_OFFSET (SPColorSliderClass, changed),
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen gtk_marshal_NONE__NONE,
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen GTK_TYPE_NONE, 0);
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud object_class->destroy = sp_color_slider_destroy;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud widget_class->realize = sp_color_slider_realize;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud widget_class->size_request = sp_color_slider_size_request;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen widget_class->size_allocate = sp_color_slider_size_allocate;
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud/* widget_class->draw = sp_color_slider_draw; */
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud/* widget_class->draw_focus = sp_color_slider_draw_focus; */
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen/* widget_class->draw_default = sp_color_slider_draw_default; */
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm widget_class->expose_event = sp_color_slider_expose;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm widget_class->button_press_event = sp_color_slider_button_press;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen widget_class->button_release_event = sp_color_slider_button_release;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm widget_class->motion_notify_event = sp_color_slider_motion_notify;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
92fe3142613d000eff89db8a983b3b18b14eee79johanengelenstatic void
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmsp_color_slider_init (SPColorSlider *slider)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen /* We are widget with window */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_WIDGET_UNSET_FLAGS (slider, GTK_NO_WINDOW);
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen slider->dragging = FALSE;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen slider->adjustment = NULL;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen slider->value = 0.0;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
8d9f5d586a04809427ce1df284a5720112177991cilix slider->c0[0] = 0x00;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen slider->c0[1] = 0x00;
8d9f5d586a04809427ce1df284a5720112177991cilix slider->c0[2] = 0x00;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix slider->c0[3] = 0xff;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix slider->cm[0] = 0xff;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak slider->cm[1] = 0x00;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak slider->cm[2] = 0x00;
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak slider->cm[3] = 0xff;
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen slider->c1[0] = 0xff;
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen slider->c1[1] = 0xff;
f4db63be4e929f4706410914295deccaceea19cdcilix slider->c1[2] = 0xff;
f4db63be4e929f4706410914295deccaceea19cdcilix slider->c1[3] = 0xff;
f4db63be4e929f4706410914295deccaceea19cdcilix
ab99111a42436818e6902e044c8f3af2b724263bcilix slider->b0 = 0x5f;
ab99111a42436818e6902e044c8f3af2b724263bcilix slider->b1 = 0xa0;
ab99111a42436818e6902e044c8f3af2b724263bcilix slider->bmask = 0x08;
76db360f5f052775326e6d406b9e1e9e2966e11acilix
76db360f5f052775326e6d406b9e1e9e2966e11acilix slider->map = NULL;
b0c42c0dfcd02cc05126371948489a5a88b2e4b3cilix}
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilixstatic void
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilixsp_color_slider_destroy (GtkObject *object)
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix{
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix SPColorSlider *slider;
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix slider = SP_COLOR_SLIDER (object);
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix if (slider->adjustment) {
044d712d4d03f8354962d54e47cfac2346a69ccccilix gtk_signal_disconnect_by_data (GTK_OBJECT (slider->adjustment), slider);
044d712d4d03f8354962d54e47cfac2346a69ccccilix gtk_object_unref (GTK_OBJECT (slider->adjustment));
044d712d4d03f8354962d54e47cfac2346a69ccccilix slider->adjustment = NULL;
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix }
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix if (((GtkObjectClass *) (parent_class))->destroy)
2f5c0701b333a695eedb1680beb1adf95c0723dacilix (* ((GtkObjectClass *) (parent_class))->destroy) (object);
2f5c0701b333a695eedb1680beb1adf95c0723dacilix}
2f5c0701b333a695eedb1680beb1adf95c0723dacilix
add2ffae3c4686b50d888775bbdf083a4726a210johanengelenstatic void
add2ffae3c4686b50d888775bbdf083a4726a210johanengelensp_color_slider_realize (GtkWidget *widget)
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm SPColorSlider *slider;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GdkWindowAttr attributes;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gint attributes_mask;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider = SP_COLOR_SLIDER (widget);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm attributes.window_type = GDK_WINDOW_CHILD;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm attributes.x = widget->allocation.x;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm attributes.y = widget->allocation.y;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm attributes.width = widget->allocation.width;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm attributes.height = widget->allocation.height;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes.wclass = GDK_INPUT_OUTPUT;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes.visual = gdk_rgb_get_visual ();
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes.colormap = gdk_rgb_get_cmap ();
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes.event_mask = gtk_widget_get_events (widget);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes.event_mask |= (GDK_EXPOSURE_MASK |
6656f193fdace606d1b162d6dea0223bc295f0a6cilix GDK_BUTTON_PRESS_MASK |
6656f193fdace606d1b162d6dea0223bc295f0a6cilix GDK_BUTTON_RELEASE_MASK |
6656f193fdace606d1b162d6dea0223bc295f0a6cilix GDK_POINTER_MOTION_MASK |
6656f193fdace606d1b162d6dea0223bc295f0a6cilix GDK_ENTER_NOTIFY_MASK |
6656f193fdace606d1b162d6dea0223bc295f0a6cilix GDK_LEAVE_NOTIFY_MASK);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilix widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix gdk_window_set_user_data (widget->window, widget);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilix widget->style = gtk_style_attach (widget->style, widget->window);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix}
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilixstatic void
6656f193fdace606d1b162d6dea0223bc295f0a6cilixsp_color_slider_size_request (GtkWidget *widget, GtkRequisition *requisition)
6656f193fdace606d1b162d6dea0223bc295f0a6cilix{
6656f193fdace606d1b162d6dea0223bc295f0a6cilix SPColorSlider *slider;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider = SP_COLOR_SLIDER (widget);
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen
71146abe8aba032d73788a625fee5769a581bd3ccilix requisition->width = SLIDER_WIDTH + widget->style->xthickness * 2;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix requisition->height = SLIDER_HEIGHT + widget->style->ythickness * 2;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix}
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen
9ce14357bb94b9dd92ad40bf43ef435a257b355acilixstatic void
9ce14357bb94b9dd92ad40bf43ef435a257b355acilixsp_color_slider_size_allocate (GtkWidget *widget, GtkAllocation *allocation)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
71146abe8aba032d73788a625fee5769a581bd3ccilix SPColorSlider *slider;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider = SP_COLOR_SLIDER (widget);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm widget->allocation = *allocation;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (GTK_WIDGET_REALIZED (widget)) {
eaa9bdc7bf7b73397e536edd47490d84e4420bd8bryce /* Resize GdkWindow */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gdk_window_move_resize (widget->window, allocation->x, allocation->y, allocation->width, allocation->height);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic gint
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmsp_color_slider_expose (GtkWidget *widget, GdkEventExpose *event)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm SPColorSlider *slider;
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix slider = SP_COLOR_SLIDER (widget);
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix if (GTK_WIDGET_DRAWABLE (widget)) {
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix gint width, height;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix width = widget->allocation.width;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix height = widget->allocation.height;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix sp_color_slider_paint (slider, &event->area);
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix }
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix return FALSE;
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix}
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilixstatic gint
77a4a003111bd5cfb771d4849801c898aeb889b0cilixsp_color_slider_button_press (GtkWidget *widget, GdkEventButton *event)
77a4a003111bd5cfb771d4849801c898aeb889b0cilix{
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk SPColorSlider *slider;
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk slider = SP_COLOR_SLIDER (widget);
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk if (event->button == 1) {
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk gint cx, cw;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix cx = widget->style->xthickness;
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix cw = widget->allocation.width - 2 * cx;
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix gtk_signal_emit (GTK_OBJECT (slider), slider_signals[GRABBED]);
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix slider->dragging = TRUE;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix slider->oldvalue = slider->value;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix ColorScales::setScaled( slider->adjustment, CLAMP ((gfloat) (event->x - cx) / cw, 0.0, 1.0) );
77a4a003111bd5cfb771d4849801c898aeb889b0cilix gtk_signal_emit (GTK_OBJECT (slider), slider_signals[DRAGGED]);
77a4a003111bd5cfb771d4849801c898aeb889b0cilix gdk_pointer_grab (widget->window, FALSE,
77a4a003111bd5cfb771d4849801c898aeb889b0cilix (GdkEventMask)(GDK_POINTER_MOTION_MASK |
77a4a003111bd5cfb771d4849801c898aeb889b0cilix GDK_BUTTON_RELEASE_MASK),
77a4a003111bd5cfb771d4849801c898aeb889b0cilix NULL, NULL, event->time);
77a4a003111bd5cfb771d4849801c898aeb889b0cilix }
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix return FALSE;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix}
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilixstatic gint
77a4a003111bd5cfb771d4849801c898aeb889b0cilixsp_color_slider_button_release (GtkWidget *widget, GdkEventButton *event)
77a4a003111bd5cfb771d4849801c898aeb889b0cilix{
77a4a003111bd5cfb771d4849801c898aeb889b0cilix SPColorSlider *slider;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix slider = SP_COLOR_SLIDER (widget);
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix if (event->button == 1) {
77a4a003111bd5cfb771d4849801c898aeb889b0cilix gdk_pointer_ungrab (event->time);
23d859f2ce09c04ed802cb4912cc9c50f512f0a2bgk slider->dragging = FALSE;
97a20864afec63a0b7bb757b628ee2ae596cf648cilix gtk_signal_emit (GTK_OBJECT (slider), slider_signals[RELEASED]);
97a20864afec63a0b7bb757b628ee2ae596cf648cilix if (slider->value != slider->oldvalue) gtk_signal_emit (GTK_OBJECT (slider), slider_signals[CHANGED]);
97a20864afec63a0b7bb757b628ee2ae596cf648cilix }
97a20864afec63a0b7bb757b628ee2ae596cf648cilix
97a20864afec63a0b7bb757b628ee2ae596cf648cilix return FALSE;
97a20864afec63a0b7bb757b628ee2ae596cf648cilix}
97a20864afec63a0b7bb757b628ee2ae596cf648cilix
97a20864afec63a0b7bb757b628ee2ae596cf648cilixstatic gint
77a4a003111bd5cfb771d4849801c898aeb889b0cilixsp_color_slider_motion_notify (GtkWidget *widget, GdkEventMotion *event)
77a4a003111bd5cfb771d4849801c898aeb889b0cilix{
77a4a003111bd5cfb771d4849801c898aeb889b0cilix SPColorSlider *slider;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
77a4a003111bd5cfb771d4849801c898aeb889b0cilix slider = SP_COLOR_SLIDER (widget);
77a4a003111bd5cfb771d4849801c898aeb889b0cilix
2d2706a9d621c0da51b7c4178fd5c7c5e4765122joncruz if (slider->dragging) {
77a4a003111bd5cfb771d4849801c898aeb889b0cilix gint cx, cw;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix cx = widget->style->xthickness;
77a4a003111bd5cfb771d4849801c898aeb889b0cilix cw = widget->allocation.width - 2 * cx;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm ColorScales::setScaled( slider->adjustment, CLAMP ((gfloat) (event->x - cx) / cw, 0.0, 1.0) );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_signal_emit (GTK_OBJECT (slider), slider_signals[DRAGGED]);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm return FALSE;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
b802808a0226a87371021393c4f1da776aa6a6adjohanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmGtkWidget *
b802808a0226a87371021393c4f1da776aa6a6adjohanengelensp_color_slider_new (GtkAdjustment *adjustment)
dda97aeba7480d08320ebceecae13b8531db1b81johanengelen{
a2fbdfc8e80d3d1845bf0d5df989726ae2ffd5bfjohanengelen SPColorSlider *slider;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider = (SPColorSlider*)gtk_type_new (SP_TYPE_COLOR_SLIDER);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelen sp_color_slider_set_adjustment (slider, adjustment);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
46c4893a7458eda6edcd064121bc000634af7a09johanengelen return GTK_WIDGET (slider);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen}
46c4893a7458eda6edcd064121bc000634af7a09johanengelen
46c4893a7458eda6edcd064121bc000634af7a09johanengelenvoid
46c4893a7458eda6edcd064121bc000634af7a09johanengelensp_color_slider_set_adjustment (SPColorSlider *slider, GtkAdjustment *adjustment)
46c4893a7458eda6edcd064121bc000634af7a09johanengelen{
46c4893a7458eda6edcd064121bc000634af7a09johanengelen g_return_if_fail (slider != NULL);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen g_return_if_fail (SP_IS_COLOR_SLIDER (slider));
46c4893a7458eda6edcd064121bc000634af7a09johanengelen
46c4893a7458eda6edcd064121bc000634af7a09johanengelen if (!adjustment) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen adjustment = (GtkAdjustment *) gtk_adjustment_new (0.0, 0.0, 1.0, 0.01, 0.0, 0.0);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen#if GTK_CHECK_VERSION (2,14,0)
46c4893a7458eda6edcd064121bc000634af7a09johanengelen else {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen gtk_adjustment_set_page_increment(adjustment, 0.0);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen gtk_adjustment_set_page_size(adjustment, 0.0);
46c4893a7458eda6edcd064121bc000634af7a09johanengelen }
46c4893a7458eda6edcd064121bc000634af7a09johanengelen#endif
46c4893a7458eda6edcd064121bc000634af7a09johanengelen
46c4893a7458eda6edcd064121bc000634af7a09johanengelen if (slider->adjustment != adjustment) {
46c4893a7458eda6edcd064121bc000634af7a09johanengelen if (slider->adjustment) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_signal_disconnect_by_data (GTK_OBJECT (slider->adjustment), slider);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_object_unref (GTK_OBJECT (slider->adjustment));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->adjustment = adjustment;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_object_ref (GTK_OBJECT (adjustment));
ecda720053ff791e35dae3c5c1177bc225b6cdf1johanengelen gtk_object_sink (GTK_OBJECT (adjustment));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_signal_connect (GTK_OBJECT (adjustment), "changed",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_SIGNAL_FUNC (sp_color_slider_adjustment_changed), slider);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_signal_connect (GTK_OBJECT (adjustment), "value_changed",
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm GTK_SIGNAL_FUNC (sp_color_slider_adjustment_value_changed), slider);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->value = ColorScales::getScaled( adjustment );
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen sp_color_slider_adjustment_changed (adjustment, slider);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen}
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelensp_color_slider_set_colors (SPColorSlider *slider, guint32 start, guint32 mid, guint32 end)
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen{
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz g_return_if_fail (slider != NULL);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen g_return_if_fail (SP_IS_COLOR_SLIDER (slider));
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen // Remove any map, if set
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->map = 0;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->c0[0] = start >> 24;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->c0[1] = (start >> 16) & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->c0[2] = (start >> 8) & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->c0[3] = start & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->cm[0] = mid >> 24;
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelen slider->cm[1] = (mid >> 16) & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->cm[2] = (mid >> 8) & 0xff;
0fc5ce7045233dae7e15fdc86774370f1b1d73cbjohanengelen slider->cm[3] = mid & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->c1[0] = end >> 24;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->c1[1] = (end >> 16) & 0xff;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->c1[2] = (end >> 8) & 0xff;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->c1[3] = end & 0xff;
2d107ef9730aff3f4d776ae0c2f7d983e289ce02joncruz
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_widget_queue_draw (GTK_WIDGET (slider));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelensp_color_slider_set_map (SPColorSlider *slider, const guchar *map)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_return_if_fail (slider != NULL);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g_return_if_fail (SP_IS_COLOR_SLIDER (slider));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->map = (guchar *) map;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gtk_widget_queue_draw (GTK_WIDGET (slider));
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixsp_color_slider_set_background (SPColorSlider *slider, guint dark, guint light, guint size)
73d455c08e8062e257dd052d2d690b9300434351cilix{
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix g_return_if_fail (slider != NULL);
73d455c08e8062e257dd052d2d690b9300434351cilix g_return_if_fail (SP_IS_COLOR_SLIDER (slider));
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix slider->b0 = dark;
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix slider->b1 = light;
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix slider->bmask = size;
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix gtk_widget_queue_draw (GTK_WIDGET (slider));
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix}
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixstatic void
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixsp_color_slider_adjustment_changed (GtkAdjustment */*adjustment*/, SPColorSlider *slider)
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix{
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix gtk_widget_queue_draw (GTK_WIDGET (slider));
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix}
5be124ad592f5c71eca838ad2eaac9ffa953605fcilix
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixstatic void
5be124ad592f5c71eca838ad2eaac9ffa953605fcilixsp_color_slider_adjustment_value_changed (GtkAdjustment *adjustment, SPColorSlider *slider)
73d455c08e8062e257dd052d2d690b9300434351cilix{
73d455c08e8062e257dd052d2d690b9300434351cilix GtkWidget *widget;
73d455c08e8062e257dd052d2d690b9300434351cilix
1e944d29efb206f5d0b5d1069cb098e22169d548cilix widget = GTK_WIDGET (slider);
79d46cc367c4181803d9a7a327b163643f23e8a7cilix
1e944d29efb206f5d0b5d1069cb098e22169d548cilix if (slider->value != ColorScales::getScaled( adjustment )) {
79d46cc367c4181803d9a7a327b163643f23e8a7cilix gint cx, cy, cw, ch;
79d46cc367c4181803d9a7a327b163643f23e8a7cilix cx = widget->style->xthickness;
1e944d29efb206f5d0b5d1069cb098e22169d548cilix cy = widget->style->ythickness;
5ce8d034d9fe78f969629cfe65d1a2518f173ba9cilix cw = widget->allocation.width - 2 * cx;
5ce8d034d9fe78f969629cfe65d1a2518f173ba9cilix ch = widget->allocation.height - 2 * cy;
1e944d29efb206f5d0b5d1069cb098e22169d548cilix if ((gint) (ColorScales::getScaled( adjustment ) * cw) != (gint) (slider->value * cw)) {
1e944d29efb206f5d0b5d1069cb098e22169d548cilix gint ax, ay;
73d455c08e8062e257dd052d2d690b9300434351cilix gfloat value;
73d455c08e8062e257dd052d2d690b9300434351cilix value = slider->value;
73d455c08e8062e257dd052d2d690b9300434351cilix slider->value = ColorScales::getScaled( adjustment );
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix ax = (int)(cx + value * cw - ARROW_SIZE / 2 - 2);
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix ay = cy;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix gtk_widget_queue_draw_area (widget, ax, ay, ARROW_SIZE + 4, ch);
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix ax = (int)(cx + slider->value * cw - ARROW_SIZE / 2 - 2);
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix ay = cy;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix gtk_widget_queue_draw_area (widget, ax, ay, ARROW_SIZE + 4, ch);
bb78cf2c3a2ee8ea2c98433128556847f03f5799cilix } else {
bb78cf2c3a2ee8ea2c98433128556847f03f5799cilix slider->value = ColorScales::getScaled( adjustment );
147c8e03bb214f85cd5906ddc6413c4293c4baa9cilix }
bb78cf2c3a2ee8ea2c98433128556847f03f5799cilix }
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix}
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilixstatic void
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilixsp_color_slider_paint (SPColorSlider *slider, GdkRectangle *area)
bb78cf2c3a2ee8ea2c98433128556847f03f5799cilix{
732fb09f9c502000068a77667c3356cbbd5d39d5cilix GtkWidget *widget;
732fb09f9c502000068a77667c3356cbbd5d39d5cilix GdkRectangle warea, carea, aarea;
732fb09f9c502000068a77667c3356cbbd5d39d5cilix GdkRectangle wpaint, cpaint, apaint;
732fb09f9c502000068a77667c3356cbbd5d39d5cilix const guchar *b;
732fb09f9c502000068a77667c3356cbbd5d39d5cilix gint w, x, y1, y2;
732fb09f9c502000068a77667c3356cbbd5d39d5cilix gboolean colorsOnTop = Inkscape::Preferences::get()->getBool("/options/workarounds/colorsontop", false);
732fb09f9c502000068a77667c3356cbbd5d39d5cilix
732fb09f9c502000068a77667c3356cbbd5d39d5cilix widget = GTK_WIDGET (slider);
732fb09f9c502000068a77667c3356cbbd5d39d5cilix
732fb09f9c502000068a77667c3356cbbd5d39d5cilix /* Widget area */
732fb09f9c502000068a77667c3356cbbd5d39d5cilix warea.x = 0;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix warea.y = 0;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix warea.width = widget->allocation.width;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix warea.height = widget->allocation.height;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix
2d2706a9d621c0da51b7c4178fd5c7c5e4765122joncruz /* Color gradient area */
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix carea.x = widget->style->xthickness;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix carea.y = widget->style->ythickness;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix carea.width = widget->allocation.width - 2 * carea.x;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix carea.height = widget->allocation.height - 2 * carea.y;
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilix
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen /* Arrow area */
73d455c08e8062e257dd052d2d690b9300434351cilix aarea.x = (int)(slider->value * (carea.width - 1) - ARROW_SIZE / 2 + carea.x);
73d455c08e8062e257dd052d2d690b9300434351cilix aarea.width = ARROW_SIZE;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm aarea.y = carea.y;
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen aarea.height = carea.height;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen /* Actual paintable area */
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen if (!gdk_rectangle_intersect (area, &warea, &wpaint)) {
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen return;
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen b = NULL;
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen // Draw shadow
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen if (colorsOnTop) {
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen gtk_paint_shadow( widget->style, widget->window,
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen (GtkStateType)widget->state, GTK_SHADOW_IN,
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen area, widget, "colorslider",
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen 0, 0,
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen warea.width, warea.height);
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen /* Paintable part of color gradient area */
c0cd5511d3b975ebe07d019c1f5528108725e438johanengelen if (gdk_rectangle_intersect (area, &carea, &cpaint)) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (slider->map) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gint s, d;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm /* Render map pixelstore */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm d = (1024 << 16) / carea.width;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm s = (cpaint.x - carea.x) * d;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm b = sp_color_slider_render_map (cpaint.x - carea.x, cpaint.y - carea.y, cpaint.width, cpaint.height,
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen slider->map, s, d,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm slider->b0, slider->b1, slider->bmask);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (b != NULL) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gdk_draw_rgb_image (widget->window, widget->style->black_gc,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm cpaint.x, cpaint.y,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm cpaint.width, cpaint.height,
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen GDK_RGB_DITHER_MAX,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (guchar *) b, cpaint.width * 3);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm } else {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gint c[4], dc[4];
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gint i;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen /* Render gradient */
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen // part 1: from c0 to cm
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen if ((cpaint.x - carea.x) <= carea.width/2) {
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen for (i = 0; i < 4; i++) {
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen c[i] = slider->c0[i] << 16;
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen dc[i] = ((slider->cm[i] << 16) - c[i]) / (carea.width/2);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen c[i] += (cpaint.x - carea.x) * dc[i];
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen }
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen guint wi = MIN(cpaint.x - carea.x + cpaint.width, carea.width/2) - (cpaint.x - carea.x);
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen b = sp_color_slider_render_gradient (cpaint.x - carea.x, cpaint.y - carea.y, wi, cpaint.height,
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen c, dc,
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen slider->b0, slider->b1, slider->bmask);
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen /* Draw pixelstore */
93bb287e28a818fd5ba61b99d012e0500a49ccf6johanengelen if (b != NULL) {
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen gdk_draw_rgb_image (widget->window, widget->style->black_gc,
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen cpaint.x, cpaint.y,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen wi, cpaint.height,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen GDK_RGB_DITHER_MAX,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen (guchar *) b, wi * 3);
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak }
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak }
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen // part 2: from cm to c1
af8d25189f88abf89cdbe0e180e271c94079624fbuliabyak if ((cpaint.x - carea.x + cpaint.width) > carea.width/2) {
a0334366488989ef25fb812d7030d298c0917c96johanengelen for (i = 0; i < 4; i++) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen c[i] = slider->cm[i] << 16;
a0334366488989ef25fb812d7030d298c0917c96johanengelen dc[i] = ((slider->c1[i] << 16) - c[i]) / (carea.width/2);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if ((cpaint.x - carea.x) > carea.width/2)
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen c[i] += (cpaint.x - carea.x - carea.width/2) * dc[i];
a0334366488989ef25fb812d7030d298c0917c96johanengelen }
a0334366488989ef25fb812d7030d298c0917c96johanengelen guint wi = cpaint.width - MAX(0, (carea.width/2 - (cpaint.x - carea.x)));
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen b = sp_color_slider_render_gradient (MAX(cpaint.x - carea.x, carea.width/2), cpaint.y - carea.y, wi, cpaint.height,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen c, dc,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen slider->b0, slider->b1, slider->bmask);
f9504c822b72a774b910958446fd1e730235b7cbjoncruz
a0334366488989ef25fb812d7030d298c0917c96johanengelen /* Draw pixelstore */
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (b != NULL) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen gdk_draw_rgb_image (widget->window, widget->style->black_gc,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen MAX(cpaint.x, carea.width/2 + carea.x), cpaint.y,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen wi, cpaint.height,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen GDK_RGB_DITHER_MAX,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen (guchar *) b, wi * 3);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen /* Draw shadow */
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (!colorsOnTop) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen gtk_paint_shadow( widget->style, widget->window,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen (GtkStateType)widget->state, GTK_SHADOW_IN,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen area, widget, "colorslider",
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen 0, 0,
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen warea.width, warea.height);
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen }
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen if (gdk_rectangle_intersect (area, &aarea, &apaint)) {
fb5a72174252e0e79107dcad3bf5a2bbd73e349cjohanengelen /* Draw arrow */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gdk_rectangle_intersect (&carea, &apaint, &apaint);
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen gdk_gc_set_clip_rectangle (widget->style->white_gc, &apaint);
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen gdk_gc_set_clip_rectangle (widget->style->black_gc, &apaint);
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen x = aarea.x;
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen y1 = carea.y;
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen y2 = aarea.y + aarea.height - 1;
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen w = aarea.width;
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen while ( w > 0 )
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen {
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen gdk_draw_line (widget->window, widget->style->white_gc, x, y1, x + w - 1, y1 );
a797dcb8e284cab19f60b3eff93a53a62abda263johanengelen gdk_draw_line (widget->window, widget->style->white_gc, x, y2, x + w - 1, y2 );
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen w -=2;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen x++;
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen if ( w > 0 )
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen {
56542e2b97ec8826cc692153b0e2d4f5ac8ef913johanengelen gdk_draw_line (widget->window, widget->style->black_gc, x, y1, x + w - 1, y1 );
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen gdk_draw_line (widget->window, widget->style->black_gc, x, y2, x + w - 1, y2 );
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen }
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen y1++;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen y2--;
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen }
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen
bdd7add6c064afee52d2eabeaa18f745430e5a4djohanengelen gdk_gc_set_clip_rectangle (widget->style->white_gc, NULL);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen gdk_gc_set_clip_rectangle (widget->style->black_gc, NULL);
ddc251b3cf95b0097b6a5ee39ea132bd4d7d5cbcjohanengelen }
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen}
42ba1b712b7b430669fc49aa9facb439181081becilix
42ba1b712b7b430669fc49aa9facb439181081becilix/* Colors are << 16 */
42ba1b712b7b430669fc49aa9facb439181081becilix
42ba1b712b7b430669fc49aa9facb439181081becilixstatic const guchar *
42ba1b712b7b430669fc49aa9facb439181081becilixsp_color_slider_render_gradient (gint x0, gint y0, gint width, gint height,
42ba1b712b7b430669fc49aa9facb439181081becilix gint c[], gint dc[], guint b0, guint b1, guint mask)
42ba1b712b7b430669fc49aa9facb439181081becilix{
42ba1b712b7b430669fc49aa9facb439181081becilix static guchar *buf = NULL;
42ba1b712b7b430669fc49aa9facb439181081becilix static gint bs = 0;
42ba1b712b7b430669fc49aa9facb439181081becilix guchar *dp;
42ba1b712b7b430669fc49aa9facb439181081becilix gint x, y;
42ba1b712b7b430669fc49aa9facb439181081becilix guint r, g, b, a;
42ba1b712b7b430669fc49aa9facb439181081becilix
42ba1b712b7b430669fc49aa9facb439181081becilix if (buf && (bs < width * height)) {
42ba1b712b7b430669fc49aa9facb439181081becilix g_free (buf);
42ba1b712b7b430669fc49aa9facb439181081becilix buf = NULL;
42ba1b712b7b430669fc49aa9facb439181081becilix }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (!buf) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm buf = g_new (guchar, width * height * 3);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm bs = width * height;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm dp = buf;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm r = c[0];
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm g = c[1];
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm b = c[2];
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm a = c[3];
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm for (x = x0; x < x0 + width; x++) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm gint cr, cg, cb, ca;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm guchar *d;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm cr = r >> 16;
cg = g >> 16;
cb = b >> 16;
ca = a >> 16;
d = dp;
for (y = y0; y < y0 + height; y++) {
guint bg, fc;
/* Background value */
bg = ((x & mask) ^ (y & mask)) ? b0 : b1;
fc = (cr - bg) * ca;
d[0] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
fc = (cg - bg) * ca;
d[1] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
fc = (cb - bg) * ca;
d[2] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
d += 3 * width;
}
r += dc[0];
g += dc[1];
b += dc[2];
a += dc[3];
dp += 3;
}
return buf;
}
/* Positions are << 16 */
static const guchar *
sp_color_slider_render_map (gint x0, gint y0, gint width, gint height,
guchar *map, gint start, gint step, guint b0, guint b1, guint mask)
{
static guchar *buf = NULL;
static gint bs = 0;
guchar *dp, *sp;
gint x, y;
if (buf && (bs < width * height)) {
g_free (buf);
buf = NULL;
}
if (!buf) {
buf = g_new (guchar, width * height * 3);
bs = width * height;
}
dp = buf;
for (x = x0; x < x0 + width; x++) {
gint cr, cg, cb, ca;
guchar *d;
sp = map + 4 * (start >> 16);
cr = *sp++;
cg = *sp++;
cb = *sp++;
ca = *sp++;
d = dp;
for (y = y0; y < y0 + height; y++) {
guint bg, fc;
/* Background value */
bg = ((x & mask) ^ (y & mask)) ? b0 : b1;
fc = (cr - bg) * ca;
d[0] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
fc = (cg - bg) * ca;
d[1] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
fc = (cb - bg) * ca;
d[2] = bg + ((fc + (fc >> 8) + 0x80) >> 8);
d += 3 * width;
}
dp += 3;
start += step;
}
return buf;
}