summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
authorKristian Rietveld <kris@gtk.org>2010-12-16 00:07:08 +0100
committerKristian Rietveld <kris@gtk.org>2010-12-16 00:07:08 +0100
commita28c11a27f410121de949aac92dbeaad73401dbc (patch)
tree700ab8749ef84fbb57f23ae6adb944e82db72dd4 /gtk
parentc8d130efa7a0d807bdaa50381d12c3f4223e8e2c (diff)
downloadgtk+-a28c11a27f410121de949aac92dbeaad73401dbc.tar.gz
Clip to cell_area when rendering cell content
This fixes a GTK+ 3.0 regression. In GTK+ 2, the render method on GtkCellRenderer had a expose_area parameter, typically set to cell_area. This parameter was used for clipping cell content to be rendered to the cell area (and thus clipping to within the focus rectangle). During the rendering clean up this parameter was removed and no clipping put back into place. Since expose_area was usually equal to cell_area anyway, it does not make sense to reintroduce the expose_area parameter. Instead, we do clipping at two levels: - in gtk_cell_renderer_render() we clip to background_area. We cannot clip to cell_area here because we want to allow cell renderers to render in the background area (e.g. background color/effect). - cell renderers should clip to clip_area when rendering cell content individually (as they had to individually clip to expose_region before).
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtkcellrenderer.c3
-rw-r--r--gtk/gtkcellrendererspinner.c7
-rw-r--r--gtk/gtkcellrenderertext.c7
-rw-r--r--gtk/gtkcellrenderertoggle.c7
4 files changed, 24 insertions, 0 deletions
diff --git a/gtk/gtkcellrenderer.c b/gtk/gtkcellrenderer.c
index a60b8885cc..e15323e830 100644
--- a/gtk/gtkcellrenderer.c
+++ b/gtk/gtkcellrenderer.c
@@ -698,6 +698,9 @@ gtk_cell_renderer_render (GtkCellRenderer *cell,
cairo_fill (cr);
}
+ gdk_cairo_rectangle (cr, background_area);
+ cairo_clip (cr);
+
GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell,
cr,
widget,
diff --git a/gtk/gtkcellrendererspinner.c b/gtk/gtkcellrendererspinner.c
index 5d50f8dfdd..bc63b5ea90 100644
--- a/gtk/gtkcellrendererspinner.c
+++ b/gtk/gtkcellrendererspinner.c
@@ -372,6 +372,11 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
state = GTK_STATE_PRELIGHT;
}
+ cairo_save (cr);
+
+ gdk_cairo_rectangle (cr, cell_area);
+ cairo_clip (cr);
+
gtk_paint_spinner (gtk_widget_get_style (widget),
cr,
state,
@@ -380,4 +385,6 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
priv->pulse,
draw_rect.x, draw_rect.y,
draw_rect.width, draw_rect.height);
+
+ cairo_restore (cr);
}
diff --git a/gtk/gtkcellrenderertext.c b/gtk/gtkcellrenderertext.c
index a61e8c6ea6..2cff3a47c3 100644
--- a/gtk/gtkcellrenderertext.c
+++ b/gtk/gtkcellrenderertext.c
@@ -1833,6 +1833,11 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
else if (priv->wrap_width == -1)
pango_layout_set_width (layout, -1);
+ cairo_save (cr);
+
+ gdk_cairo_rectangle (cr, cell_area);
+ cairo_clip (cr);
+
gtk_paint_layout (gtk_widget_get_style (widget),
cr,
state,
@@ -1843,6 +1848,8 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
cell_area->y + y_offset + ypad,
layout);
+ cairo_restore (cr);
+
g_object_unref (layout);
}
diff --git a/gtk/gtkcellrenderertoggle.c b/gtk/gtkcellrenderertoggle.c
index e1aa78e03f..177cafd32a 100644
--- a/gtk/gtkcellrenderertoggle.c
+++ b/gtk/gtkcellrenderertoggle.c
@@ -372,6 +372,11 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
state = GTK_STATE_INSENSITIVE;
}
+ cairo_save (cr);
+
+ gdk_cairo_rectangle (cr, cell_area);
+ cairo_clip (cr);
+
if (priv->radio)
{
gtk_paint_option (gtk_widget_get_style (widget),
@@ -392,6 +397,8 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
cell_area->y + y_offset + ypad,
width, height);
}
+
+ cairo_restore (cr);
}
static gint