📄 gtkcolorsel.c
字号:
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 + -