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

📄 gtkcolorsel.c

📁 gtk是linux一款强大的夸平台的图形化开发工具
💻 C
📖 第 1 页 / 共 4 页
字号:
      gdouble c[3];      guchar rc[3];      gint i = 0;      gtk_color_selection_hsv_to_rgb (colorsel->values[HUE],				      colorsel->values[SATURATION],				      v,                                      &c[0], &c[1], &c[2]);      for (n = 0; n < 3; n++)	rc[n] = (guchar) (255.0 * c[n]);      for (x = 0; x < wid; x++)	{	  for (n = 0; n < 3; n++)	    colorsel->value_buf[i++] = rc[n];	}      gtk_preview_draw_row (GTK_PREVIEW (colorsel->value_area), colorsel->value_buf, 0, y, wid);      v -= sv;    }  gtk_widget_queue_draw (colorsel->value_area);}static voidgtk_color_selection_draw_wheel_frame (GtkColorSelection *colorsel){  GtkStyle *style;  gint w, h;  style = gtk_widget_get_style (colorsel->wheel_area);  w = colorsel->wheel_area->allocation.width;  h = colorsel->wheel_area->allocation.height;  gdk_draw_arc (colorsel->wheel_area->window, style->black_gc,		FALSE, 1, 1, w - 1, h - 1, 30 * 64, 180 * 64);  gdk_draw_arc (colorsel->wheel_area->window, style->mid_gc[GTK_STATE_NORMAL],		FALSE, 0, 0, w, h, 30 * 64, 180 * 64);  gdk_draw_arc (colorsel->wheel_area->window, style->bg_gc[GTK_STATE_NORMAL],		FALSE, 1, 1, w - 1, h - 1, 210 * 64, 180 * 64);  gdk_draw_arc (colorsel->wheel_area->window, style->light_gc[GTK_STATE_NORMAL],		FALSE, 0, 0, w, h, 210 * 64, 180 * 64);}static voidgtk_color_selection_draw_wheel (GtkColorSelection *colorsel,                                gint               resize){  gint x, y, i, wid, heig, n;  gdouble cx, cy, h, s, c[3];  guchar bg[3];  GtkStyle *style = gtk_widget_get_style (colorsel->wheel_area);  wid = colorsel->wheel_area->allocation.width;  heig = colorsel->wheel_area->allocation.height;  if (resize)    {      if (colorsel->wheel_buf != NULL)	g_free (colorsel->wheel_buf);      colorsel->wheel_buf = g_new(guchar, 3 * wid);    }  cx = (gdouble) (wid) / 2.0;  cy = (gdouble) (heig) / 2.0;  bg[0] = style->bg[GTK_STATE_NORMAL].red >> 8;  bg[1] = style->bg[GTK_STATE_NORMAL].green >> 8;  bg[2] = style->bg[GTK_STATE_NORMAL].blue >> 8;  for (y = 0; y < heig; y++)    {      i = 0;      for (x = 0; x < wid; x++)	{	  if (gtk_color_selection_eval_wheel (x, y, cx, cy, &h, &s))	    {	      for (n = 0; n < 3; n++)		colorsel->wheel_buf[i++] = bg[n];	    }	  else	    {	      gtk_color_selection_hsv_to_rgb (h, s, 1.0, &c[0], &c[1], &c[2]);	      for (n = 0; n < 3; n++)		colorsel->wheel_buf[i++] = (guchar) (255.0 * c[n]);	    }	}      gtk_preview_draw_row (GTK_PREVIEW (colorsel->wheel_area), colorsel->wheel_buf, 0, y, wid);    }  if (colorsel->wheel_area->window)     {	GdkPixmap *pm = NULL;	GdkGC     *pmgc = NULL;	GdkColor   col;	gint w, h;		pm = gdk_pixmap_new (colorsel->wheel_area->window, wid, heig, 1);	pmgc = gdk_gc_new (pm);		col.pixel = 0;	gdk_gc_set_foreground(pmgc, &col);	gdk_draw_rectangle(pm, pmgc, TRUE, 0, 0, wid, heig);	col.pixel = 1;		gdk_gc_set_foreground(pmgc, &col);	gdk_draw_arc (pm, pmgc, TRUE, 0, 0, wid, heig, 0, 360*64);	w = colorsel->wheel_area->allocation.width;	h = colorsel->wheel_area->allocation.height;		gdk_draw_arc (pm, pmgc,		      FALSE, 1, 1, w - 1, h - 1, 30 * 64, 180 * 64);	gdk_draw_arc (pm, pmgc,		      FALSE, 0, 0, w, h, 30 * 64, 180 * 64);	gdk_draw_arc (pm, pmgc,		      FALSE, 1, 1, w - 1, h - 1, 210 * 64, 180 * 64);	gdk_draw_arc (pm, pmgc,		      FALSE, 0, 0, w, h, 210 * 64, 180 * 64);	gdk_window_shape_combine_mask (colorsel->wheel_area->window, pm, 0, 0);	gdk_pixmap_unref (pm);	gdk_gc_destroy (pmgc);     }}static voidgtk_color_selection_draw_sample (GtkColorSelection *colorsel,                                 gint               resize){  gint x, y, i, wid, heig, f, half, n;  guchar c[3 * 2], cc[3 * 4], *cp = c;  gdouble o, oldo;  wid = colorsel->sample_area->allocation.width;  heig = colorsel->sample_area->allocation.height;  half = wid >> 1;  if (resize)    {      if (colorsel->sample_buf != NULL)	g_free (colorsel->sample_buf);      colorsel->sample_buf = g_new(guchar, 3 * wid);    }  i = RED;  for (n = 0; n < 3; n++)    {      c[n] = (guchar) (255.0 * colorsel->old_values[i]);      c[n + 3] = (guchar) (255.0 * colorsel->values[i++]);    }  if (colorsel->use_opacity)    {      o = colorsel->values[OPACITY];      oldo = colorsel->old_values[OPACITY];      for (n = 0; n < 3; n++)	{	  cc[n] = (guchar) ((1.0 - oldo) * 192 + (oldo * (gdouble) c[n]));	  cc[n + 3] = (guchar) ((1.0 - oldo) * 128 + (oldo * (gdouble) c[n]));	  cc[n + 6] = (guchar) ((1.0 - o) * 192 + (o * (gdouble) c[n + 3]));	  cc[n + 9] = (guchar) ((1.0 - o) * 128 + (o * (gdouble) c[n + 3]));	}      cp = cc;    }  for (y = 0; y < heig; y++)    {      i = 0;      for (x = 0; x < wid; x++)	{	  if (colorsel->use_opacity)	    {	      f = 3 * (((x % 32) < 16) ^ ((y % 32) < 16));	      f += (x > half) * 6;	    }	  else	    f = (x > half) * 3;	  for (n = 0; n < 3; n++)	    colorsel->sample_buf[i++] = cp[n + f];	}      gtk_preview_draw_row (GTK_PREVIEW (colorsel->sample_area), colorsel->sample_buf, 0, y, wid);    }  gtk_widget_queue_draw (colorsel->sample_area);}static gintgtk_color_selection_eval_wheel (gint     x,  gint     y,				gdouble  cx, gdouble  cy,				gdouble *h,  gdouble *s){  gdouble r, rx, ry;  rx = ((gdouble) x - cx);  ry = ((gdouble) y - cy);  rx = rx/cx;  ry = ry/cy;  r = sqrt (SQR (rx) + SQR (ry));  if (r != 0.0)    *h = atan2 (rx / r, ry / r);  else    *h = 0.0;  *s = r;  *h = 360.0 * (*h) / (2.0 * M_PI) + 180;  if (*s == 0.0)    *s = 0.00001;  else if (*s > 1.0)    {      *s = 1.0;      return TRUE;    }  return FALSE;}static voidgtk_color_selection_hsv_to_rgb (gdouble  h, gdouble  s, gdouble  v,				gdouble *r, gdouble *g, gdouble *b){  gint i;  gdouble f, w, q, t;  if (s == 0.0)    s = 0.000001;  if (h == -1.0)    {      *r = v;      *g = v;      *b = v;    }  else    {      if (h == 360.0)	h = 0.0;      h = h / 60.0;      i = (gint) h;      f = h - i;      w = v * (1.0 - s);      q = v * (1.0 - (s * f));      t = v * (1.0 - (s * (1.0 - f)));      switch (i)	{	case 0:	  *r = v;	  *g = t;	  *b = w;	  break;	case 1:	  *r = q;	  *g = v;	  *b = w;	  break;	case 2:	  *r = w;	  *g = v;	  *b = t;	  break;	case 3:	  *r = w;	  *g = q;	  *b = v;	  break;	case 4:	  *r = t;	  *g = w;	  *b = v;	  break;	case 5:	  *r = v;	  *g = w;	  *b = q;	  break;	}    }}static voidgtk_color_selection_rgb_to_hsv (gdouble  r, gdouble  g, gdouble  b,				gdouble *h, gdouble *s, gdouble *v){  double max, min, delta;  max = r;  if (g > max)    max = g;  if (b > max)    max = b;  min = r;  if (g < min)    min = g;  if (b < min)    min = b;  *v = max;  if (max != 0.0)    *s = (max - min) / max;  else    *s = 0.0;  if (*s == 0.0)    *h = -1.0;  else    {      delta = max - min;      if (r == max)	*h = (g - b) / delta;      else if (g == max)	*h = 2.0 + (b - r) / delta;      else if (b == max)	*h = 4.0 + (r - g) / delta;      *h = *h * 60.0;      if (*h < 0.0)	*h = *h + 360;    }}/***************************//* GtkColorSelectionDialog *//***************************/GtkTypegtk_color_selection_dialog_get_type (void){  static GtkType color_selection_dialog_type = 0;  if (!color_selection_dialog_type)    {      GtkTypeInfo colorsel_diag_info =      {	"GtkColorSelectionDialog",	sizeof (GtkColorSelectionDialog),	sizeof (GtkColorSelectionDialogClass),	(GtkClassInitFunc) gtk_color_selection_dialog_class_init,	(GtkObjectInitFunc) gtk_color_selection_dialog_init,	/* reserved_1 */ NULL,	/* reserved_2 */ NULL,        (GtkClassInitFunc) NULL,      };      color_selection_dialog_type = gtk_type_unique (GTK_TYPE_WINDOW, &colorsel_diag_info);    }  return color_selection_dialog_type;}static voidgtk_color_selection_dialog_class_init (GtkColorSelectionDialogClass *klass){  GtkObjectClass *object_class;  object_class = (GtkObjectClass*) klass;  color_selection_dialog_parent_class = gtk_type_class (GTK_TYPE_WINDOW);}static voidgtk_color_selection_dialog_init (GtkColorSelectionDialog *colorseldiag){  GtkWidget *action_area, *frame;  gtk_widget_set_visual (GTK_WIDGET (colorseldiag), gdk_rgb_get_visual ());  gtk_widget_set_colormap (GTK_WIDGET (colorseldiag), gdk_rgb_get_cmap ());  gtk_widget_push_visual (gdk_rgb_get_visual ());  gtk_widget_push_colormap (gdk_rgb_get_cmap ());  colorseldiag->main_vbox = gtk_vbox_new (FALSE, 10);  gtk_container_set_border_width (GTK_CONTAINER (colorseldiag), 10);  gtk_container_add (GTK_CONTAINER (colorseldiag), colorseldiag->main_vbox);  gtk_widget_show (colorseldiag->main_vbox);  frame = gtk_frame_new (NULL);  gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_ETCHED_IN);  gtk_container_add (GTK_CONTAINER (colorseldiag->main_vbox), frame);  gtk_widget_show (frame);  colorseldiag->colorsel = gtk_color_selection_new ();  gtk_container_add (GTK_CONTAINER (frame), colorseldiag->colorsel);  gtk_widget_show (colorseldiag->colorsel);  action_area = gtk_hbutton_box_new ();  gtk_button_box_set_layout(GTK_BUTTON_BOX(action_area), GTK_BUTTONBOX_END);  gtk_button_box_set_spacing(GTK_BUTTON_BOX(action_area), 5);  gtk_box_pack_end (GTK_BOX (colorseldiag->main_vbox), action_area, FALSE, FALSE, 0);  gtk_widget_show (action_area);  colorseldiag->ok_button = gtk_button_new_with_label (_("OK"));  GTK_WIDGET_SET_FLAGS (colorseldiag->ok_button, GTK_CAN_DEFAULT);  gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->ok_button, TRUE, TRUE, 0);  gtk_widget_grab_default (colorseldiag->ok_button);  gtk_widget_show (colorseldiag->ok_button);  colorseldiag->cancel_button = gtk_button_new_with_label (_("Cancel"));  GTK_WIDGET_SET_FLAGS (colorseldiag->cancel_button, GTK_CAN_DEFAULT);  gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->cancel_button, TRUE, TRUE, 0);  gtk_widget_show (colorseldiag->cancel_button);  colorseldiag->help_button = gtk_button_new_with_label (_("Help"));  GTK_WIDGET_SET_FLAGS (colorseldiag->help_button, GTK_CAN_DEFAULT);  gtk_box_pack_start (GTK_BOX (action_area), colorseldiag->help_button, TRUE, TRUE, 0);  gtk_widget_show (colorseldiag->help_button);  gtk_widget_pop_colormap ();  gtk_widget_pop_visual ();}GtkWidget*gtk_color_selection_dialog_new (const gchar *title){  GtkColorSelectionDialog *colorseldiag;  colorseldiag = gtk_type_new (GTK_TYPE_COLOR_SELECTION_DIALOG);  gtk_window_set_title (GTK_WINDOW (colorseldiag), title);  return GTK_WIDGET (colorseldiag);}

⌨️ 快捷键说明

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