summaryrefslogtreecommitdiff
path: root/gtk/gtkcssimagegradient.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-09-18 13:26:20 +0200
committerBenjamin Otte <otte@redhat.com>2012-09-18 13:26:20 +0200
commit8c3caae33fe70a9e9e7b721212854c420b97c917 (patch)
tree0d283fdbcb8a3d18fc9c679e508a0ffbc4bed39a /gtk/gtkcssimagegradient.c
parentdb089f4b8a5f95ffe03d3e8e8ec72124c1a13c60 (diff)
downloadgtk+-8c3caae33fe70a9e9e7b721212854c420b97c917.tar.gz
cssimage: Add a hack to get antialiased circles
We like to draw circles in themes, and as radial gradients are the only okayish way to do that, at least make them antialiased.
Diffstat (limited to 'gtk/gtkcssimagegradient.c')
-rw-r--r--gtk/gtkcssimagegradient.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/gtk/gtkcssimagegradient.c b/gtk/gtkcssimagegradient.c
index adaee94df5..d8db2e2d77 100644
--- a/gtk/gtkcssimagegradient.c
+++ b/gtk/gtkcssimagegradient.c
@@ -46,6 +46,54 @@ gtk_css_image_gradient_compute (GtkCssImage *image,
return GTK_CSS_IMAGE (copy);
}
+static gboolean
+gtk_css_image_gradient_draw_circle (GtkCssImageGradient *image,
+ cairo_t *cr,
+ double width,
+ double height)
+{
+ cairo_pattern_t *pattern = image->pattern;
+ double x0, y0, x1, y1, r0, r1;
+ GdkRGBA color0, color1;
+ double offset0, offset1;
+ int n_stops;
+
+ if (cairo_pattern_get_type (pattern) != CAIRO_PATTERN_TYPE_RADIAL)
+ return FALSE;
+ if (cairo_pattern_get_extend (pattern) != CAIRO_EXTEND_PAD)
+ return FALSE;
+
+ cairo_pattern_get_radial_circles (pattern, &x0, &y0, &r0, &x1, &y1, &r1);
+
+ if (x0 != x1 ||
+ y0 != y1 ||
+ r0 != 0.0)
+ return FALSE;
+
+ cairo_pattern_get_color_stop_count (pattern, &n_stops);
+ if (n_stops != 2)
+ return FALSE;
+
+ cairo_pattern_get_color_stop_rgba (pattern, 0, &offset0, &color0.red, &color0.green, &color0.blue, &color0.alpha);
+ cairo_pattern_get_color_stop_rgba (pattern, 1, &offset1, &color1.red, &color1.green, &color1.blue, &color1.alpha);
+ if (offset0 != offset1)
+ return FALSE;
+
+ cairo_scale (cr, width, height);
+
+ cairo_rectangle (cr, 0, 0, 1, 1);
+ cairo_clip (cr);
+
+ gdk_cairo_set_source_rgba (cr, &color1);
+ cairo_paint (cr);
+
+ gdk_cairo_set_source_rgba (cr, &color0);
+ cairo_arc (cr, x1, y1, r1 * offset1, 0, 2 * G_PI);
+ cairo_fill (cr);
+
+ return TRUE;
+}
+
static void
gtk_css_image_gradient_draw (GtkCssImage *image,
cairo_t *cr,
@@ -60,6 +108,9 @@ gtk_css_image_gradient_draw (GtkCssImage *image,
return;
}
+ if (gtk_css_image_gradient_draw_circle (gradient, cr, width, height))
+ return;
+
cairo_scale (cr, width, height);
cairo_rectangle (cr, 0, 0, 1, 1);