⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gtkcolorsel.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 4 页
字号:
/* GTK - The GIMP Toolkit * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 59 Temple Place - Suite 330, * Boston, MA 02111-1307, USA. *//* * Modified by the GTK+ Team and others 1997-1999.  See the AUTHORS * file for a list of people on the GTK+ Team.  See the ChangeLog * files for a list of changes.  These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/.  */#include <stdlib.h>#include <stdio.h>#include <math.h>#include <gdk/gdk.h>#include "gtkcolorsel.h"#include "gtkwindow.h"#include "gtkhbbox.h"#include "gtkintl.h"#include "gtkdnd.h"#include "gtkselection.h"/* * If you change the way the color values are stored, * please make sure to update the drag & drop support so it sends * across all the color info (currently RGBA). - Elliot */#ifndef M_PI#define M_PI    3.14159265358979323846#endif /* M_PI */#define DEGTORAD(a) (2.0*M_PI*a/360.0)#define SQR(a) (a*a)#define TIMER_DELAY 300#define CIRCLE_RADIUS 65#define WHEEL_WIDTH   2*CIRCLE_RADIUS+2#define WHEEL_HEIGHT  2*CIRCLE_RADIUS+2#define VALUE_WIDTH   32#define VALUE_HEIGHT  WHEEL_HEIGHT#define SAMPLE_WIDTH  WHEEL_WIDTH+VALUE_WIDTH+5#define SAMPLE_HEIGHT 28static void gtk_color_selection_class_init (GtkColorSelectionClass *klass);static void gtk_color_selection_set_arg    (GtkObject              *object,					    GtkArg                 *arg,					    guint                   arg_id);static void gtk_color_selection_get_arg    (GtkObject              *object,					    GtkArg                 *arg,					    guint                   arg_id);static void gtk_color_selection_init (GtkColorSelection *colorsel);static void gtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass);static void gtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag);enum {  COLOR_CHANGED,  LAST_SIGNAL};enum {  RGB_INPUTS     = 1 << 0,  HSV_INPUTS     = 1 << 1,  OPACITY_INPUTS = 1 << 2};enum {  SCALE,  ENTRY,  BOTH};enum {  HUE,  SATURATION,  VALUE,  RED,  GREEN,  BLUE,  OPACITY,  NUM_CHANNELS};enum {  ARG_0,  ARG_UPDATE_POLICY,  ARG_USE_OPACITY};typedef struct{  gchar *label;  gfloat lower, upper, step_inc, page_inc;  GtkSignalFunc updater;} scale_val_type;#define HSV_TO_RGB()  gtk_color_selection_hsv_to_rgb( \                        colorsel->values[HUE], \                        colorsel->values[SATURATION], \                        colorsel->values[VALUE], \                        &colorsel->values[RED], \                        &colorsel->values[GREEN], \                        &colorsel->values[BLUE])#define RGB_TO_HSV()  gtk_color_selection_rgb_to_hsv( \                        colorsel->values[RED], \                        colorsel->values[GREEN], \                        colorsel->values[BLUE], \                        &colorsel->values[HUE], \                        &colorsel->values[SATURATION], \                        &colorsel->values[VALUE])static void gtk_color_selection_hsv_updater       (GtkWidget         *widget,                                                   gpointer           data);static void gtk_color_selection_rgb_updater       (GtkWidget         *widget,                                                   gpointer           data);static void gtk_color_selection_opacity_updater   (GtkWidget         *widget,                                                   gpointer           data);static void gtk_color_selection_realize           (GtkWidget         *widget);static void gtk_color_selection_unrealize         (GtkWidget         *widget);static void gtk_color_selection_finalize          (GtkObject         *object);static void gtk_color_selection_color_changed     (GtkColorSelection *colorsel);static void gtk_color_selection_update_input      (GtkWidget         *scale,                                                   GtkWidget         *entry,                                                   gdouble            value);static void gtk_color_selection_update_inputs     (GtkColorSelection *colorsel,                                                   gint               inputs,                                                   gint               which);static void gtk_color_selection_update_value      (GtkColorSelection *colorsel,                                                   gint               y);static void gtk_color_selection_update_wheel      (GtkColorSelection *colorsel,                                                   gint               x,                                                   gint               y);static void gtk_color_selection_value_resize      (GtkWidget          *widget,                                                   gpointer            data);static gint gtk_color_selection_value_events      (GtkWidget          *area,                                                   GdkEvent           *event);static gint gtk_color_selection_value_timeout     (GtkColorSelection  *colorsel);static void gtk_color_selection_wheel_resize      (GtkWidget          *widget,                                                   gpointer            data);static gint gtk_color_selection_wheel_events      (GtkWidget          *area,                                                   GdkEvent           *event);static gint gtk_color_selection_wheel_timeout     (GtkColorSelection  *colorsel);static void gtk_color_selection_sample_resize     (GtkWidget          *widget,                                                   gpointer            data);static void gtk_color_selection_drag_begin        (GtkWidget          *widget,						   GdkDragContext     *context,						   gpointer            data);static void gtk_color_selection_drag_end          (GtkWidget          *widget,						   GdkDragContext     *context,						   gpointer            data);static void gtk_color_selection_drop_handle       (GtkWidget          *widget, 						   GdkDragContext     *context,						   gint                x,						   gint                y,						   GtkSelectionData   *selection_data,						   guint               info,						   guint               time,						   gpointer            data);static void gtk_color_selection_drag_handle       (GtkWidget        *widget, 						   GdkDragContext   *context,						   GtkSelectionData *selection_data,						   guint             info,						   guint             time,						   gpointer          data);static void gtk_color_selection_draw_wheel_marker (GtkColorSelection  *colorsel);static void gtk_color_selection_draw_wheel_frame  (GtkColorSelection  *colorsel);static void gtk_color_selection_draw_value_marker (GtkColorSelection  *colorsel);static void gtk_color_selection_draw_value_bar    (GtkColorSelection  *colorsel,                                                   gint                resize);static void gtk_color_selection_draw_wheel        (GtkColorSelection  *colorsel,                                                   gint                resize);static void gtk_color_selection_draw_sample       (GtkColorSelection  *colorsel,                                                   gint                resize);static gint gtk_color_selection_eval_wheel        (gint     x, gint     y,					           gdouble cx, gdouble cy,					           gdouble *h, gdouble *s);static void gtk_color_selection_hsv_to_rgb        (gdouble  h, gdouble  s, gdouble  v,				                   gdouble *r, gdouble *g, gdouble *b);static void gtk_color_selection_rgb_to_hsv        (gdouble  r, gdouble  g, gdouble  b,				                   gdouble *h, gdouble *s, gdouble *v);static GtkVBoxClass *color_selection_parent_class = NULL;static GtkWindowClass *color_selection_dialog_parent_class = NULL;static guint color_selection_signals[LAST_SIGNAL] = {0};static const gchar	*value_index_key = "gtk-value-index";#define SF GtkSignalFuncstatic const scale_val_type scale_vals[NUM_CHANNELS] ={  {N_("Hue:"),        0.0, 360.0, 1.00, 10.00, (SF) gtk_color_selection_hsv_updater},  {N_("Saturation:"), 0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_hsv_updater},  {N_("Value:"),      0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_hsv_updater},  {N_("Red:"),        0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_rgb_updater},  {N_("Green:"),      0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_rgb_updater},  {N_("Blue:"),       0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_rgb_updater},  {N_("Opacity:"),    0.0,   1.0, 0.01,  0.01, (SF) gtk_color_selection_opacity_updater}};GtkTypegtk_color_selection_get_type (void){  static GtkType color_selection_type = 0;  if (!color_selection_type)    {      static const GtkTypeInfo colorsel_info =      {	"GtkColorSelection",	sizeof (GtkColorSelection),	sizeof (GtkColorSelectionClass),	(GtkClassInitFunc) gtk_color_selection_class_init,	(GtkObjectInitFunc) gtk_color_selection_init,	/* reserved_1 */ NULL,	/* reserved_2 */ NULL,        (GtkClassInitFunc) NULL,      };      color_selection_type = gtk_type_unique (GTK_TYPE_VBOX, &colorsel_info);    }  return color_selection_type;}static voidgtk_color_selection_class_init (GtkColorSelectionClass *klass){  GtkObjectClass *object_class;  GtkWidgetClass *widget_class;  GtkContainerClass *container_class;  object_class = (GtkObjectClass*) klass;  widget_class = (GtkWidgetClass*) klass;  container_class = (GtkContainerClass*) klass;  color_selection_parent_class = gtk_type_class (GTK_TYPE_VBOX);    gtk_object_add_arg_type ("GtkColorSelection::policy", GTK_TYPE_UPDATE_TYPE,			   GTK_ARG_READWRITE, ARG_UPDATE_POLICY);  gtk_object_add_arg_type ("GtkColorSelection::use_opacity", GTK_TYPE_BOOL,			   GTK_ARG_READWRITE, ARG_USE_OPACITY);    color_selection_signals[COLOR_CHANGED] =     gtk_signal_new ("color_changed",	             GTK_RUN_FIRST,                     object_class->type,		     GTK_SIGNAL_OFFSET (GtkColorSelectionClass, color_changed),                     gtk_marshal_NONE__NONE, GTK_TYPE_NONE, 0);  gtk_object_class_add_signals (object_class, color_selection_signals, LAST_SIGNAL);  object_class->set_arg = gtk_color_selection_set_arg;  object_class->get_arg = gtk_color_selection_get_arg;  object_class->finalize = gtk_color_selection_finalize;  widget_class->realize = gtk_color_selection_realize;  widget_class->unrealize = gtk_color_selection_unrealize;}static voidgtk_color_selection_init (GtkColorSelection *colorsel){  GtkWidget *frame, *hbox, *vbox, *hbox2, *label, *table;  GtkObject *adj;  gint old_mask, n;  gchar txt[32];  for (n = RED; n <= OPACITY; n++)    colorsel->values[n] = 1.0;  RGB_TO_HSV ();  for (n = HUE; n <= OPACITY; n++)    colorsel->old_values[n] = colorsel->values[n];  colorsel->wheel_gc = NULL;  colorsel->value_gc = NULL;  colorsel->sample_gc = NULL;  colorsel->wheel_buf = NULL;  colorsel->value_buf = NULL;  colorsel->sample_buf = NULL;  colorsel->use_opacity = FALSE;  colorsel->timer_active = FALSE;  colorsel->policy = GTK_UPDATE_CONTINUOUS;  hbox = gtk_hbox_new (FALSE, 5);  gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);  gtk_container_add (GTK_CONTAINER (colorsel), hbox);  vbox = gtk_vbox_new (FALSE, 5);  gtk_container_add (GTK_CONTAINER (hbox), vbox);  gtk_widget_show (vbox);  hbox2 = gtk_hbox_new (FALSE, 5);  gtk_container_add (GTK_CONTAINER (vbox), hbox2);  gtk_widget_show (hbox2);  colorsel->wheel_area = gtk_preview_new (GTK_PREVIEW_COLOR);  old_mask = gtk_widget_get_events(colorsel->wheel_area);  gtk_widget_set_events (colorsel->wheel_area,			 old_mask |			 GDK_BUTTON_PRESS_MASK |			 GDK_BUTTON_RELEASE_MASK |			 GDK_BUTTON_MOTION_MASK |			 GDK_POINTER_MOTION_HINT_MASK);  gtk_preview_size (GTK_PREVIEW (colorsel->wheel_area), WHEEL_WIDTH, WHEEL_HEIGHT);  gtk_preview_set_expand (GTK_PREVIEW (colorsel->wheel_area), TRUE);  gtk_container_add (GTK_CONTAINER (hbox2), colorsel->wheel_area);  gtk_widget_show (colorsel->wheel_area);  old_mask = gtk_widget_get_events (colorsel->wheel_area);  gtk_signal_connect (GTK_OBJECT (colorsel->wheel_area), "event",    (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area);  gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "expose_event",    (SF) gtk_color_selection_wheel_events, (gpointer) colorsel->wheel_area);  gtk_signal_connect_after (GTK_OBJECT (colorsel->wheel_area), "size_allocate",    (SF) gtk_color_selection_wheel_resize, (gpointer) colorsel->wheel_area);  gtk_object_set_data (GTK_OBJECT (colorsel->wheel_area), "_GtkColorSelection", (gpointer) colorsel);  frame = gtk_frame_new (NULL);  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);  gtk_container_set_border_width (GTK_CONTAINER (frame), 0);  gtk_box_pack_start (GTK_BOX (hbox2), frame, FALSE, TRUE, 0);  gtk_widget_show (frame);  colorsel->value_area = gtk_preview_new (GTK_PREVIEW_COLOR);  gtk_preview_size (GTK_PREVIEW (colorsel->value_area), VALUE_WIDTH, VALUE_HEIGHT);  gtk_preview_set_expand (GTK_PREVIEW (colorsel->value_area), TRUE);  gtk_container_add (GTK_CONTAINER (frame), colorsel->value_area);  gtk_widget_show (colorsel->value_area);  old_mask = gtk_widget_get_events (colorsel->value_area);  gtk_widget_set_events (colorsel->value_area,			 old_mask |			 GDK_BUTTON_PRESS_MASK |			 GDK_BUTTON_RELEASE_MASK |			 GDK_BUTTON_MOTION_MASK |			 GDK_POINTER_MOTION_HINT_MASK);  gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "expose_event",    (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area);  gtk_signal_connect_after (GTK_OBJECT (colorsel->value_area), "size_allocate",    (SF) gtk_color_selection_value_resize, (gpointer) colorsel->value_area);  gtk_signal_connect (GTK_OBJECT (colorsel->value_area), "event",    (SF) gtk_color_selection_value_events, (gpointer) colorsel->value_area);  gtk_object_set_data (GTK_OBJECT (colorsel->value_area), "_GtkColorSelection", (gpointer) colorsel);  /* New/old color samples */  /* ===================== */  frame = gtk_frame_new (NULL);  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);  gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, TRUE, 0);  gtk_widget_show (frame);/*  colorsel->sample_area_eb = gtk_button_new ();  gtk_container_add (GTK_CONTAINER (frame), colorsel->sample_area_eb);  gtk_widget_show (colorsel->sample_area_eb); */  colorsel->sample_area = gtk_preview_new (GTK_PREVIEW_COLOR);  gtk_preview_size (GTK_PREVIEW (colorsel->sample_area), SAMPLE_WIDTH, SAMPLE_HEIGHT);  gtk_preview_set_expand (GTK_PREVIEW (colorsel->sample_area), TRUE);  gtk_container_add (GTK_CONTAINER (frame),		     colorsel->sample_area);  gtk_widget_set_events(colorsel->sample_area,		gtk_widget_get_events(colorsel->sample_area)		| GDK_BUTTON_MOTION_MASK		| GDK_BUTTON_PRESS_MASK		| GDK_BUTTON_RELEASE_MASK		| GDK_ENTER_NOTIFY_MASK		| GDK_LEAVE_NOTIFY_MASK);  gtk_widget_show (colorsel->sample_area);  gtk_signal_connect_after (GTK_OBJECT (colorsel->sample_area),			    "size_allocate",			    GTK_SIGNAL_FUNC (gtk_color_selection_sample_resize),			    colorsel->sample_area);  gtk_object_set_data (GTK_OBJECT (colorsel->sample_area), "_GtkColorSelection", (gpointer) colorsel);  table = gtk_table_new (NUM_CHANNELS, 3, FALSE);  gtk_table_set_col_spacings (GTK_TABLE (table), 3);  gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, TRUE, 0);  for (n = HUE; n <= OPACITY; n++)    {      label = gtk_label_new (_(scale_vals[n].label));      gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);      gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, n, n + 1);      adj = gtk_adjustment_new (colorsel->values[n], scale_vals[n].lower,				scale_vals[n].upper, scale_vals[n].step_inc,                                scale_vals[n].page_inc, 0.0);      colorsel->scales[n] = gtk_hscale_new (GTK_ADJUSTMENT (adj));      gtk_widget_set_usize (colorsel->scales[n], 128, 0);      gtk_scale_set_value_pos (GTK_SCALE (colorsel->scales[n]), GTK_POS_TOP);      gtk_range_set_update_policy (GTK_RANGE (colorsel->scales[n]), colorsel->policy);      gtk_scale_set_draw_value (GTK_SCALE (colorsel->scales[n]), FALSE);      gtk_scale_set_digits (GTK_SCALE (colorsel->scales[n]), 2);      gtk_table_attach_defaults (GTK_TABLE (table), colorsel->scales[n], 1, 2, n, n + 1);      colorsel->entries[n] = gtk_entry_new ();      gtk_widget_set_usize (colorsel->entries[n], 40, 0);      sprintf (txt, "%.2f", colorsel->values[n]);      gtk_entry_set_text (GTK_ENTRY (colorsel->entries[n]), txt);      gtk_table_attach_defaults (GTK_TABLE (table), colorsel->entries[n], 2, 3, n, n + 1);      if (n != OPACITY)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -