static void gstyle_color_widget_rgba_notify_cb (GstyleColorWidget *self, GParamSpec *pspec, GstyleColor *color) { GdkRGBA rgba; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (G_IS_PARAM_SPEC (pspec)); g_assert (GSTYLE_IS_COLOR (color)); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) { gstyle_color_fill_rgba (color, &rgba); self->filter_func (&rgba, &rgba, self->filter_user_data); gstyle_color_set_rgba (self->filtered_color, &rgba); } update_label_visibility (self); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) match_label_color (self, self->filtered_color); else match_label_color (self, color); gtk_widget_queue_draw (GTK_WIDGET (self)); }
/** * gstyle_color_widget_set_filter_func: * @self: A #GstyleColorPlane * @filter_func: (scope notified) (nullable): A GstyleColorFilterFunc filter function or * %NULL to unset the current filter. In this case, user_data is ignored * @user_data: (closure) (nullable): user data to pass when calling the filter function * * Set a filter to be used to change the color drawn. * */ void gstyle_color_widget_set_filter_func (GstyleColorWidget *self, GstyleColorFilterFunc filter_func, gpointer user_data) { GdkRGBA rgba; GdkRGBA filtered_rgba; g_return_if_fail (GSTYLE_IS_COLOR_WIDGET (self)); self->filter_func = filter_func; self->filter_user_data = (filter_func == NULL) ? NULL : user_data; if (filter_func == NULL) g_clear_object (&self->filtered_color); else { gstyle_color_fill_rgba (self->color, &rgba); self->filter_func (&rgba, &filtered_rgba, self->filter_user_data); g_clear_object (&self->filtered_color); self->filtered_color = gstyle_color_copy (self->color); gstyle_color_set_rgba (self->filtered_color, &filtered_rgba); if (!gdk_rgba_equal (&rgba, &filtered_rgba)) { update_label_visibility (self); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR]); } } gtk_widget_queue_draw (GTK_WIDGET (self)); }
static void match_label_color (GstyleColorWidget *self, GstyleColor *color) { PangoLayout *layout; PangoAttrList *attr_list; PangoAttribute *attr; GdkRGBA rgba; GdkRGBA dst_rgba; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GSTYLE_IS_COLOR (color)); layout = gtk_label_get_layout (self->label); attr_list = pango_layout_get_attributes (layout); if (attr_list == NULL) { attr_list = pango_attr_list_new (); gtk_label_set_attributes (self->label, attr_list); pango_attr_list_unref (attr_list); } gstyle_color_fill_rgba (color, &rgba); gstyle_utils_get_contrasted_rgba (rgba, &dst_rgba); attr = pango_attr_foreground_new (dst_rgba.red * 0xffff, dst_rgba.green * 0xffff, dst_rgba.blue * 0xffff); pango_attr_list_change (attr_list, attr); attr = pango_attr_background_new (rgba.red * 0xffff, rgba.green * 0xffff, rgba.blue * 0xffff); pango_attr_list_change (attr_list, attr); }
/** * gstyle_color_widget_set_color: * @self: A #GstyleColorWidget * @color: (nullable): A #GstyleColor or %NULL * * Set the #GstyleColor for the #GstyleColorWidget. * */ void gstyle_color_widget_set_color (GstyleColorWidget *self, GstyleColor *color) { GdkRGBA rgba; g_return_if_fail (GSTYLE_IS_COLOR_WIDGET (self)); g_return_if_fail (GSTYLE_IS_COLOR (color) || color == NULL); if (self->color != color) { if (self->color != NULL) { gstyle_color_widget_disconnect_color (self); g_clear_object (&self->color); } if (color != NULL) { self->color = g_object_ref (color); if (self->filter_func != NULL) { gstyle_color_fill_rgba (color, &rgba); self->filter_func (&rgba, &rgba, self->filter_user_data); g_clear_object (&self->filtered_color); self->filtered_color = gstyle_color_copy (color); gstyle_color_set_rgba (self->filtered_color, &rgba); } g_signal_connect_object (self->color, "notify::rgba", G_CALLBACK (gstyle_color_widget_rgba_notify_cb), self, G_CONNECT_SWAPPED); g_signal_connect_object (self->color, "notify::name", G_CALLBACK (gstyle_color_widget_name_notify_cb), self, G_CONNECT_SWAPPED); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) match_label_color (self, self->filtered_color); else match_label_color (self, color); } update_label_visibility (self); g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_COLOR]); } }
gboolean gstyle_utils_is_array_contains_same_color (GPtrArray *ar, GstyleColor *color) { GstyleColor *tmp_color; GdkRGBA color_rgba; GdkRGBA tmp_rgba; g_return_val_if_fail (GSTYLE_IS_COLOR (color), FALSE); g_return_val_if_fail (ar != NULL, FALSE); gstyle_color_fill_rgba (color, &color_rgba); for (gint i = 0; i < ar->len; ++i) { tmp_color = g_ptr_array_index (ar, i); gstyle_color_fill_rgba (tmp_color, &tmp_rgba); if (gdk_rgba_equal (&color_rgba, &tmp_rgba)) return TRUE; } return FALSE; }
static void test_parse_string (void) { ColorItem *item; GstyleColor *color; GdkRGBA rgba; GstyleColorKind kind; GstyleCielab lab; printf ("\n"); for (item = rgba_table; item->rgb != NULL; item++) { g_autofree gchar *str_hex3 = NULL; g_autofree gchar *str_hex6 = NULL; g_autofree gchar *str_rgba = NULL; g_autofree gchar *str_rgba_percent = NULL; g_autofree gchar *str_hsla = NULL; g_autofree gchar *str_original = NULL; g_autofree gchar *dst_str = NULL; color = gstyle_color_new_from_string (NULL, item->rgb); str_hex3 = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGB_HEX3); str_hex6 = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGB_HEX6); str_rgba = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGBA); str_rgba_percent = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGBA_PERCENT); str_hsla = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_HSLA); str_original = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_ORIGINAL); gstyle_color_fill_rgba (color, &rgba); gstyle_color_convert_rgb_to_cielab (&rgba, &lab); kind = gstyle_color_get_kind (color); dst_str = gstyle_color_to_string (color, kind); printf ("dst:'%s'\n", dst_str); printf ("\n----- '%s': rgba: kind:%i\n%s\n%s\n%s\n%s\n%s\n Original: %s\n", item->rgb, kind, str_hex3, str_hex6, str_rgba, str_rgba_percent, str_hsla, str_original); printf ("lab : L=%.3f a=%.3f b=%.3f\n", lab.l, lab.a, lab.b); g_assert (g_ascii_strcasecmp (item->rgb, dst_str) == 0); g_object_unref (color); printf ("\n"); } }
static void dnd_color_fill (GstyleColorWidget *self, GstyleColor *src_color, GstyleColor *dst_color) { const gchar *name; GdkRGBA src_rgba; GdkRGBA dst_rgba; g_assert (GSTYLE_COLOR_WIDGET (self)); g_assert (GSTYLE_COLOR (src_color)); g_assert (GSTYLE_COLOR (dst_color)); gstyle_color_fill_rgba (src_color, &src_rgba); gstyle_color_fill_rgba (dst_color, &dst_rgba); if (!(self->dnd_lock & GSTYLE_COLOR_WIDGET_DND_LOCK_FLAGS_COLOR)) { dst_rgba.red = src_rgba.red; dst_rgba.green = src_rgba.green; dst_rgba.blue = src_rgba.blue; } if (!(self->dnd_lock & GSTYLE_COLOR_WIDGET_DND_LOCK_FLAGS_ALPHA)) dst_rgba.alpha = src_rgba.alpha; gstyle_color_set_rgba (self->color, &dst_rgba); if (!(self->dnd_lock & GSTYLE_COLOR_WIDGET_DND_LOCK_FLAGS_KIND)) gstyle_color_set_kind (dst_color, gstyle_color_get_kind (src_color)); if (!(self->dnd_lock & GSTYLE_COLOR_WIDGET_DND_LOCK_FLAGS_NAME)) { name = gstyle_color_get_name (src_color); gstyle_color_set_name (dst_color, name); } }
static void gstyle_color_widget_on_drag_data_get (GtkWidget *widget, GdkDragContext *context, GtkSelectionData *data, guint info, guint time) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GdkAtom target = gtk_selection_data_get_target (data); GstyleColor *color; guint16 data_rgba[4]; GdkRGBA rgba; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (GDK_IS_DRAG_CONTEXT (context)); if (self->filter_func != NULL && GSTYLE_IS_COLOR (self->filtered_color)) color = self->filtered_color; else color = self->color; if (target == gdk_atom_intern_static_string ("GSTYLE_COLOR_WIDGET")) gtk_selection_data_set (data, target, 8, (void*)&color, sizeof (gpointer)); else if (target == gdk_atom_intern_static_string ("application/x-color")) { gstyle_color_fill_rgba (color, &rgba); data_rgba[0] = (guint16) (rgba.red * 65535); data_rgba[1] = (guint16) (rgba.green * 65535); data_rgba[2] = (guint16) (rgba.blue * 65535); data_rgba[3] = (guint16) (rgba.alpha * 65535); gtk_selection_data_set (data, target, 16, (void*)&data_rgba, 8); } else if (gtk_targets_include_text (&target, 1)) { g_autofree gchar *name = NULL; name = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_ORIGINAL); if (name == NULL) name = gstyle_color_to_string (color, GSTYLE_COLOR_KIND_RGB_HEX6); gtk_selection_data_set_text (data, name, -1); } }
static gboolean gstyle_color_widget_draw (GtkWidget *widget, cairo_t *cr) { GstyleColorWidget *self = (GstyleColorWidget *)widget; GtkStyleContext *style_context; GdkRectangle margin_box; GdkRectangle border_box; cairo_matrix_t matrix; GdkRGBA bg_color = {0}; gint radius; g_assert (GSTYLE_IS_COLOR_WIDGET (self)); g_assert (cr != NULL); style_context = gtk_widget_get_style_context (GTK_WIDGET (self)); gtk_widget_get_allocation (widget, &margin_box); margin_box.x = margin_box.y = 0; gstyle_utils_get_rect_resized_box (margin_box, &margin_box, &self->cached_margin); gstyle_utils_get_rect_resized_box (margin_box, &border_box, &self->cached_border); cairo_save (cr); if (self->color != NULL) { gtk_style_context_get (style_context, gtk_style_context_get_state (style_context), "border-radius", &radius, NULL); gstyle_color_fill_rgba (self->color, &bg_color); if (self->filter_func != NULL) self->filter_func (&bg_color, &bg_color, self->filter_user_data); cairo_new_path (cr); draw_cairo_round_box (cr, border_box, radius, radius, radius, radius); } else cairo_rectangle (cr, border_box.x, border_box.y, border_box.width, border_box.height); cairo_clip_preserve (cr); cairo_set_source_rgb (cr, 0.20, 0.20, 0.20); cairo_paint (cr); cairo_set_source_rgb (cr, 0.80, 0.80, 0.80); cairo_matrix_init_scale (&matrix, 0.1, 0.1); cairo_matrix_translate (&matrix, -border_box.x, -border_box.y); cairo_pattern_set_matrix (self->checkered_pattern, &matrix); cairo_mask (cr, self->checkered_pattern); if (self->color != NULL) { gdk_cairo_set_source_rgba (cr, &bg_color); cairo_fill (cr); } else gtk_render_background (style_context, cr, border_box.x, border_box.y, border_box.width, border_box.height); cairo_restore (cr); gtk_render_frame (gtk_widget_get_style_context (widget), cr, margin_box.x, margin_box.y, margin_box.width, margin_box.height); return GTK_WIDGET_CLASS (gstyle_color_widget_parent_class)->draw (widget, cr); }