static gboolean color_value_parse (GtkCssParser *parser, GFile *base, GValue *value) { GtkSymbolicColor *symbolic; GdkRGBA rgba; symbolic = _gtk_css_parser_read_symbolic_color (parser); if (symbolic == NULL) return FALSE; if (gtk_symbolic_color_resolve (symbolic, NULL, &rgba)) { GdkColor color; color.red = rgba.red * 65535. + 0.5; color.green = rgba.green * 65535. + 0.5; color.blue = rgba.blue * 65535. + 0.5; g_value_set_boxed (value, &color); } else { g_value_unset (value); g_value_init (value, GTK_TYPE_SYMBOLIC_COLOR); g_value_take_boxed (value, symbolic); } return TRUE; }
/** * gtk_gradient_resolve: * @gradient: a #GtkGradient * @props: #GtkStyleProperties to use when resolving named colors * @resolved_gradient: (out): return location for the resolved pattern * * If @gradient is resolvable, @resolved_gradient will be filled in * with the resolved gradient as a cairo_pattern_t, and %TRUE will * be returned. Generally, if @gradient can't be resolved, it is * due to it being defined on top of a named color that doesn't * exist in @props. * * Returns: %TRUE if the gradient has been resolved * * Since: 3.0 * * Deprecated: 3.8: #GtkGradient is deprecated. **/ gboolean gtk_gradient_resolve (GtkGradient *gradient, GtkStyleProperties *props, cairo_pattern_t **resolved_gradient) { cairo_pattern_t *pattern; guint i; g_return_val_if_fail (gradient != NULL, FALSE); g_return_val_if_fail (GTK_IS_STYLE_PROPERTIES (props), FALSE); g_return_val_if_fail (resolved_gradient != NULL, FALSE); if (gradient->radius0 == 0 && gradient->radius1 == 0) pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0, gradient->x1, gradient->y1); else pattern = cairo_pattern_create_radial (gradient->x0, gradient->y0, gradient->radius0, gradient->x1, gradient->y1, gradient->radius1); for (i = 0; i < gradient->stops->len; i++) { ColorStop *stop; GdkRGBA color; stop = &g_array_index (gradient->stops, ColorStop, i); if (!gtk_symbolic_color_resolve (stop->color, props, &color)) { cairo_pattern_destroy (pattern); return FALSE; } cairo_pattern_add_color_stop_rgba (pattern, stop->offset, color.red, color.green, color.blue, color.alpha); } *resolved_gradient = pattern; return TRUE; }