API: Change cellrenderer->render vfunc to take a cairo_t

Also constify the rectangle arguments. They were const anyway.
This commit is contained in:
Benjamin Otte 2010-08-21 13:18:14 +02:00
parent 4138e86ad4
commit e31e77eeb8
7 changed files with 136 additions and 148 deletions

View File

@ -641,30 +641,32 @@ gtk_cell_renderer_render (GtkCellRenderer *cell,
{ {
gboolean selected = FALSE; gboolean selected = FALSE;
GtkCellRendererPrivate *priv = cell->priv; GtkCellRendererPrivate *priv = cell->priv;
cairo_t *cr;
g_return_if_fail (GTK_IS_CELL_RENDERER (cell)); g_return_if_fail (GTK_IS_CELL_RENDERER (cell));
g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL); g_return_if_fail (GTK_CELL_RENDERER_GET_CLASS (cell)->render != NULL);
selected = (flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED; selected = (flags & GTK_CELL_RENDERER_SELECTED) == GTK_CELL_RENDERER_SELECTED;
cr = gdk_cairo_create (window);
gdk_cairo_rectangle (cr, expose_area);
cairo_clip (cr);
if (priv->cell_background_set && !selected) if (priv->cell_background_set && !selected)
{ {
cairo_t *cr = gdk_cairo_create (window);
gdk_cairo_rectangle (cr, background_area); gdk_cairo_rectangle (cr, background_area);
gdk_cairo_set_source_color (cr, &priv->cell_background); gdk_cairo_set_source_color (cr, &priv->cell_background);
cairo_fill (cr); cairo_fill (cr);
cairo_destroy (cr);
} }
GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell, GTK_CELL_RENDERER_GET_CLASS (cell)->render (cell,
window, cr,
widget, widget,
(GdkRectangle *) background_area, background_area,
(GdkRectangle *) cell_area, cell_area,
(GdkRectangle *) expose_area,
flags); flags);
cairo_destroy (cr);
} }
/** /**

View File

@ -77,11 +77,10 @@ struct _GtkCellRendererClass
gint *width, gint *width,
gint *height); gint *height);
void (* render) (GtkCellRenderer *cell, void (* render) (GtkCellRenderer *cell,
GdkDrawable *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags); GtkCellRendererState flags);
gboolean (* activate) (GtkCellRenderer *cell, gboolean (* activate) (GtkCellRenderer *cell,
GdkEvent *event, GdkEvent *event,

View File

@ -45,11 +45,10 @@ static void gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cel
gint *width, gint *width,
gint *height); gint *height);
static void gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell, static void gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
GdkDrawable *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags); GtkCellRendererState flags);
@ -743,11 +742,10 @@ gtk_cell_renderer_pixbuf_get_size (GtkCellRenderer *cell,
static void static void
gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell, gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags) GtkCellRendererState flags)
{ {
@ -759,11 +757,10 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
GdkPixbuf *symbolic = NULL; GdkPixbuf *symbolic = NULL;
GdkRectangle pix_rect; GdkRectangle pix_rect;
GdkRectangle draw_rect; GdkRectangle draw_rect;
cairo_t *cr;
gboolean is_expander; gboolean is_expander;
gint xpad, ypad; gint xpad, ypad;
gtk_cell_renderer_pixbuf_get_size (cell, widget, cell_area, gtk_cell_renderer_pixbuf_get_size (cell, widget, (GdkRectangle *) cell_area,
&pix_rect.x, &pix_rect.x,
&pix_rect.y, &pix_rect.y,
&pix_rect.width, &pix_rect.width,
@ -775,8 +772,7 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
pix_rect.width -= xpad * 2; pix_rect.width -= xpad * 2;
pix_rect.height -= ypad * 2; pix_rect.height -= ypad * 2;
if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) || if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect))
!gdk_rectangle_intersect (expose_area, &draw_rect, &draw_rect))
return; return;
pixbuf = priv->pixbuf; pixbuf = priv->pixbuf;
@ -852,14 +848,10 @@ gtk_cell_renderer_pixbuf_render (GtkCellRenderer *cell,
} }
} }
cr = gdk_cairo_create (window);
gdk_cairo_set_source_pixbuf (cr, pixbuf, pix_rect.x, pix_rect.y); gdk_cairo_set_source_pixbuf (cr, pixbuf, pix_rect.x, pix_rect.y);
gdk_cairo_rectangle (cr, &draw_rect); gdk_cairo_rectangle (cr, &draw_rect);
cairo_fill (cr); cairo_fill (cr);
cairo_destroy (cr);
if (invisible) if (invisible)
g_object_unref (invisible); g_object_unref (invisible);

View File

@ -89,11 +89,10 @@ static void gtk_cell_renderer_progress_get_size (GtkCellRenderer *ce
gint *width, gint *width,
gint *height); gint *height);
static void gtk_cell_renderer_progress_render (GtkCellRenderer *cell, static void gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
guint flags); guint flags);
@ -527,13 +526,12 @@ get_bar_position (gint start,
} }
static void static void
gtk_cell_renderer_progress_render (GtkCellRenderer *cell, gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area, GtkCellRendererState flags)
guint flags)
{ {
GtkCellRendererProgress *cellprogress = GTK_CELL_RENDERER_PROGRESS (cell); GtkCellRendererProgress *cellprogress = GTK_CELL_RENDERER_PROGRESS (cell);
GtkCellRendererProgressPrivate *priv= cellprogress->priv; GtkCellRendererProgressPrivate *priv= cellprogress->priv;
@ -559,11 +557,11 @@ gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
* but some engines don't paint anything with that detail for * but some engines don't paint anything with that detail for
* non-GtkProgressBar widgets. * non-GtkProgressBar widgets.
*/ */
gtk_paint_box (style, gtk_cairo_paint_box (style,
window, cr,
GTK_STATE_NORMAL, GTK_SHADOW_IN, GTK_STATE_NORMAL, GTK_SHADOW_IN,
NULL, widget, NULL, widget, NULL,
x, y, w, h); x, y, w, h);
if (priv->orientation == GTK_ORIENTATION_HORIZONTAL) if (priv->orientation == GTK_ORIENTATION_HORIZONTAL)
{ {
@ -606,12 +604,12 @@ gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
clip.y = bar_position; clip.y = bar_position;
} }
gtk_paint_box (style, gtk_cairo_paint_box (style,
window, cr,
GTK_STATE_SELECTED, GTK_SHADOW_OUT, GTK_STATE_SELECTED, GTK_SHADOW_OUT,
&clip, widget, "bar", widget, "bar",
clip.x, clip.y, clip.x, clip.y,
clip.width, clip.height); clip.width, clip.height);
if (priv->label) if (priv->label)
{ {
@ -631,11 +629,17 @@ gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
y_pos = y + style->ythickness + priv->text_yalign * y_pos = y + style->ythickness + priv->text_yalign *
(h - 2 * style->ythickness - logical_rect.height); (h - 2 * style->ythickness - logical_rect.height);
gtk_paint_layout (style, window, cairo_save (cr);
GTK_STATE_SELECTED, gdk_cairo_rectangle (cr, &clip);
FALSE, &clip, widget, "progressbar", cairo_clip (cr);
x_pos, y_pos,
layout); gtk_cairo_paint_layout (style, cr,
GTK_STATE_SELECTED,
FALSE, widget, "progressbar",
x_pos, y_pos,
layout);
cairo_restore (cr);
if (bar_position > start) if (bar_position > start)
{ {
@ -650,11 +654,17 @@ gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
clip.height = bar_position - y; clip.height = bar_position - y;
} }
gtk_paint_layout (style, window, cairo_save (cr);
GTK_STATE_NORMAL, gdk_cairo_rectangle (cr, &clip);
FALSE, &clip, widget, "progressbar", cairo_clip (cr);
x_pos, y_pos,
layout); gtk_cairo_paint_layout (style, cr,
GTK_STATE_NORMAL,
FALSE, widget, "progressbar",
x_pos, y_pos,
layout);
cairo_restore (cr);
} }
if (bar_position + bar_size < start + full_size) if (bar_position + bar_size < start + full_size)
@ -670,11 +680,17 @@ gtk_cell_renderer_progress_render (GtkCellRenderer *cell,
clip.height = y + h - (bar_position + bar_size); clip.height = y + h - (bar_position + bar_size);
} }
gtk_paint_layout (style, window, cairo_save (cr);
GTK_STATE_NORMAL, gdk_cairo_rectangle (cr, &clip);
FALSE, &clip, widget, "progressbar", cairo_clip (cr);
x_pos, y_pos,
layout); gtk_cairo_paint_layout (style, cr,
GTK_STATE_NORMAL,
FALSE, widget, "progressbar",
x_pos, y_pos,
layout);
cairo_restore (cr);
} }
g_object_unref (layout); g_object_unref (layout);

View File

@ -85,13 +85,12 @@ static void gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cell,
gint *y_offset, gint *y_offset,
gint *width, gint *width,
gint *height); gint *height);
static void gtk_cell_renderer_spinner_render (GtkCellRenderer *cell, static void gtk_cell_renderer_spinner_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area, GtkCellRendererState flags);
guint flags);
G_DEFINE_TYPE (GtkCellRendererSpinner, gtk_cell_renderer_spinner, GTK_TYPE_CELL_RENDERER) G_DEFINE_TYPE (GtkCellRendererSpinner, gtk_cell_renderer_spinner, GTK_TYPE_CELL_RENDERER)
@ -320,13 +319,12 @@ gtk_cell_renderer_spinner_get_size (GtkCellRenderer *cellr,
} }
static void static void
gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr, gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area, GtkCellRendererState flags)
guint flags)
{ {
GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr); GtkCellRendererSpinner *cell = GTK_CELL_RENDERER_SPINNER (cellr);
GtkCellRendererSpinnerPrivate *priv = cell->priv; GtkCellRendererSpinnerPrivate *priv = cell->priv;
@ -338,7 +336,7 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
if (!priv->active) if (!priv->active)
return; return;
gtk_cell_renderer_spinner_get_size (cellr, widget, cell_area, gtk_cell_renderer_spinner_get_size (cellr, widget, (GdkRectangle *) cell_area,
&pix_rect.x, &pix_rect.y, &pix_rect.x, &pix_rect.y,
&pix_rect.width, &pix_rect.height); &pix_rect.width, &pix_rect.height);
@ -351,11 +349,8 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
pix_rect.width -= xpad * 2; pix_rect.width -= xpad * 2;
pix_rect.height -= ypad * 2; pix_rect.height -= ypad * 2;
if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect) || if (!gdk_rectangle_intersect (cell_area, &pix_rect, &draw_rect))
!gdk_rectangle_intersect (expose_area, &pix_rect, &draw_rect)) return;
{
return;
}
state = GTK_STATE_NORMAL; state = GTK_STATE_NORMAL;
if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE || if (gtk_widget_get_state (widget) == GTK_STATE_INSENSITIVE ||
@ -376,13 +371,12 @@ gtk_cell_renderer_spinner_render (GtkCellRenderer *cellr,
state = GTK_STATE_PRELIGHT; state = GTK_STATE_PRELIGHT;
} }
gtk_paint_spinner (gtk_widget_get_style (widget), gtk_cairo_paint_spinner (gtk_widget_get_style (widget),
window, cr,
state, state,
expose_area, widget,
widget, "cell",
"cell", priv->pulse,
priv->pulse, draw_rect.x, draw_rect.y,
draw_rect.x, draw_rect.y, draw_rect.width, draw_rect.height);
draw_rect.width, draw_rect.height);
} }

View File

@ -44,11 +44,10 @@ static void gtk_cell_renderer_text_set_property (GObject *obje
const GValue *value, const GValue *value,
GParamSpec *pspec); GParamSpec *pspec);
static void gtk_cell_renderer_text_render (GtkCellRenderer *cell, static void gtk_cell_renderer_text_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags); GtkCellRendererState flags);
static GtkCellEditable *gtk_cell_renderer_text_start_editing (GtkCellRenderer *cell, static GtkCellEditable *gtk_cell_renderer_text_start_editing (GtkCellRenderer *cell,
@ -1434,7 +1433,7 @@ add_attr (PangoAttrList *attr_list,
static PangoLayout* static PangoLayout*
get_layout (GtkCellRendererText *celltext, get_layout (GtkCellRendererText *celltext,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GtkCellRendererState flags) GtkCellRendererState flags)
{ {
GtkCellRendererTextPrivate *priv = celltext->priv; GtkCellRendererTextPrivate *priv = celltext->priv;
@ -1694,11 +1693,10 @@ get_size (GtkCellRenderer *cell,
static void static void
gtk_cell_renderer_text_render (GtkCellRenderer *cell, gtk_cell_renderer_text_render (GtkCellRenderer *cell,
GdkDrawable *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags) GtkCellRendererState flags)
{ {
@ -1711,7 +1709,7 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
gint xpad, ypad; gint xpad, ypad;
layout = get_layout (celltext, widget, cell_area, flags); layout = get_layout (celltext, widget, cell_area, flags);
get_size (cell, widget, cell_area, layout, &x_offset, &y_offset, NULL, NULL); get_size (cell, widget, (GdkRectangle *) cell_area, layout, &x_offset, &y_offset, NULL, NULL);
if (!gtk_cell_renderer_get_sensitive (cell)) if (!gtk_cell_renderer_get_sensitive (cell))
{ {
@ -1740,22 +1738,12 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
if (priv->background_set && if (priv->background_set &&
(flags & GTK_CELL_RENDERER_SELECTED) == 0) (flags & GTK_CELL_RENDERER_SELECTED) == 0)
{ {
cairo_t *cr = gdk_cairo_create (window);
if (expose_area)
{
gdk_cairo_rectangle (cr, expose_area);
cairo_clip (cr);
}
gdk_cairo_rectangle (cr, background_area); gdk_cairo_rectangle (cr, background_area);
cairo_set_source_rgb (cr, cairo_set_source_rgb (cr,
priv->background.red / 65535., priv->background.red / 65535.,
priv->background.green / 65535., priv->background.green / 65535.,
priv->background.blue / 65535.); priv->background.blue / 65535.);
cairo_fill (cr); cairo_fill (cr);
cairo_destroy (cr);
} }
gtk_cell_renderer_get_padding (cell, &xpad, &ypad); gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
@ -1766,16 +1754,15 @@ gtk_cell_renderer_text_render (GtkCellRenderer *cell,
else if (priv->wrap_width == -1) else if (priv->wrap_width == -1)
pango_layout_set_width (layout, -1); pango_layout_set_width (layout, -1);
gtk_paint_layout (gtk_widget_get_style (widget), gtk_cairo_paint_layout (gtk_widget_get_style (widget),
window, cr,
state, state,
TRUE, TRUE,
expose_area, widget,
widget, "cellrenderertext",
"cellrenderertext", cell_area->x + x_offset + xpad,
cell_area->x + x_offset + xpad, cell_area->y + y_offset + ypad,
cell_area->y + y_offset + ypad, layout);
layout);
g_object_unref (layout); g_object_unref (layout);
} }
@ -2145,7 +2132,7 @@ gtk_cell_renderer_text_get_height_for_width (GtkCellSizeRequest *cell,
gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad); gtk_cell_renderer_get_padding (GTK_CELL_RENDERER (cell), &xpad, &ypad);
layout = get_layout (celltext, widget, FALSE, 0); layout = get_layout (celltext, widget, NULL, 0);
pango_layout_set_width (layout, (width - xpad * 2) * PANGO_SCALE); pango_layout_set_width (layout, (width - xpad * 2) * PANGO_SCALE);
pango_layout_get_pixel_size (layout, NULL, &text_height); pango_layout_get_pixel_size (layout, NULL, &text_height);

View File

@ -42,11 +42,10 @@ static void gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cel
gint *width, gint *width,
gint *height); gint *height);
static void gtk_cell_renderer_toggle_render (GtkCellRenderer *cell, static void gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
GdkWindow *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags); GtkCellRendererState flags);
static gboolean gtk_cell_renderer_toggle_activate (GtkCellRenderer *cell, static gboolean gtk_cell_renderer_toggle_activate (GtkCellRenderer *cell,
GdkEvent *event, GdkEvent *event,
@ -324,11 +323,10 @@ gtk_cell_renderer_toggle_get_size (GtkCellRenderer *cell,
static void static void
gtk_cell_renderer_toggle_render (GtkCellRenderer *cell, gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
GdkDrawable *window, cairo_t *cr,
GtkWidget *widget, GtkWidget *widget,
GdkRectangle *background_area, const GdkRectangle *background_area,
GdkRectangle *cell_area, const GdkRectangle *cell_area,
GdkRectangle *expose_area,
GtkCellRendererState flags) GtkCellRendererState flags)
{ {
GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (cell); GtkCellRendererToggle *celltoggle = GTK_CELL_RENDERER_TOGGLE (cell);
@ -339,7 +337,7 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
GtkShadowType shadow; GtkShadowType shadow;
GtkStateType state = 0; GtkStateType state = 0;
gtk_cell_renderer_toggle_get_size (cell, widget, cell_area, gtk_cell_renderer_toggle_get_size (cell, widget, (GdkRectangle *) cell_area,
&x_offset, &y_offset, &x_offset, &y_offset,
&width, &height); &width, &height);
gtk_cell_renderer_get_padding (cell, &xpad, &ypad); gtk_cell_renderer_get_padding (cell, &xpad, &ypad);
@ -376,23 +374,23 @@ gtk_cell_renderer_toggle_render (GtkCellRenderer *cell,
if (priv->radio) if (priv->radio)
{ {
gtk_paint_option (gtk_widget_get_style (widget), gtk_cairo_paint_option (gtk_widget_get_style (widget),
window, cr,
state, shadow, state, shadow,
expose_area, widget, "cellradio", widget, "cellradio",
cell_area->x + x_offset + xpad, cell_area->x + x_offset + xpad,
cell_area->y + y_offset + ypad, cell_area->y + y_offset + ypad,
width, height); width, height);
} }
else else
{ {
gtk_paint_check (gtk_widget_get_style (widget), gtk_cairo_paint_check (gtk_widget_get_style (widget),
window, cr,
state, shadow, state, shadow,
expose_area, widget, "cellcheck", widget, "cellcheck",
cell_area->x + x_offset + xpad, cell_area->x + x_offset + xpad,
cell_area->y + y_offset + ypad, cell_area->y + y_offset + ypad,
width, height); width, height);
} }
} }