style: Convert draw_hline vfunc to Cairo version

This commit is contained in:
Benjamin Otte 2010-08-16 15:35:58 +02:00
parent 07662f288d
commit abaecf4308
3 changed files with 86 additions and 36 deletions

View File

@ -101,9 +101,8 @@ static GdkPixbuf *gtk_default_render_icon (GtkStyle *style,
GtkWidget *widget, GtkWidget *widget,
const gchar *detail); const gchar *detail);
static void gtk_default_draw_hline (GtkStyle *style, static void gtk_default_draw_hline (GtkStyle *style,
GdkWindow *window, cairo_t *cr,
GtkStateType state_type, GtkStateType state_type,
GdkRectangle *area,
GtkWidget *widget, GtkWidget *widget,
const gchar *detail, const gchar *detail,
gint x1, gint x1,
@ -1647,16 +1646,14 @@ _cairo_draw_point (cairo_t *cr,
static void static void
gtk_default_draw_hline (GtkStyle *style, gtk_default_draw_hline (GtkStyle *style,
GdkWindow *window, cairo_t *cr,
GtkStateType state_type, GtkStateType state_type,
GdkRectangle *area,
GtkWidget *widget, GtkWidget *widget,
const gchar *detail, const gchar *detail,
gint x1, gint x1,
gint x2, gint x2,
gint y) gint y)
{ {
cairo_t *cr;
gint thickness_light; gint thickness_light;
gint thickness_dark; gint thickness_dark;
gint i; gint i;
@ -1664,15 +1661,8 @@ gtk_default_draw_hline (GtkStyle *style,
thickness_light = style->ythickness / 2; thickness_light = style->ythickness / 2;
thickness_dark = style->ythickness - thickness_light; thickness_dark = style->ythickness - thickness_light;
cr = gdk_cairo_create (window);
cairo_set_line_width (cr, 1.0); cairo_set_line_width (cr, 1.0);
if (area)
{
gdk_cairo_rectangle (cr, area);
cairo_clip (cr);
}
if (detail && !strcmp (detail, "label")) if (detail && !strcmp (detail, "label"))
{ {
if (state_type == GTK_STATE_INSENSITIVE) if (state_type == GTK_STATE_INSENSITIVE)
@ -1694,8 +1684,6 @@ gtk_default_draw_hline (GtkStyle *style,
_cairo_draw_line (cr, &style->light[state_type], x1 + thickness_light - i, y + i, x2, y + i); _cairo_draw_line (cr, &style->light[state_type], x1 + thickness_light - i, y + i, x2, y + i);
} }
} }
cairo_destroy (cr);
} }
@ -4795,6 +4783,22 @@ hls_to_rgb (gdouble *h,
} }
static cairo_t *
gtk_style_cairo_create (GdkWindow *window, const GdkRectangle *area)
{
cairo_t *cr;
cr = gdk_cairo_create (window);
if (area)
{
gdk_cairo_rectangle (cr, area);
cairo_clip (cr);
}
return cr;
}
/** /**
* gtk_paint_hline: * gtk_paint_hline:
* @style: a #GtkStyle * @style: a #GtkStyle
@ -4822,13 +4826,56 @@ gtk_paint_hline (GtkStyle *style,
gint x2, gint x2,
gint y) gint y)
{ {
cairo_t *cr;
g_return_if_fail (GTK_IS_STYLE (style)); g_return_if_fail (GTK_IS_STYLE (style));
g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_hline != NULL); g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_hline != NULL);
g_return_if_fail (style->depth == gdk_drawable_get_depth (window)); g_return_if_fail (style->depth == gdk_drawable_get_depth (window));
GTK_STYLE_GET_CLASS (style)->draw_hline (style, window, state_type, cr = gtk_style_cairo_create (window, area);
(GdkRectangle *) area, widget, detail,
gtk_cairo_paint_hline (style, cr, state_type,
widget, detail,
x1, x2, y); x1, x2, y);
cairo_destroy (cr);
}
/**
* gtk_cairo_paint_hline:
* @style: a #GtkStyle
* @cr: a #caio_t
* @state_type: a state
* @widget: (allow-none): the widget
* @detail: (allow-none): a style detail
* @x1: the starting x coordinate
* @x2: the ending x coordinate
* @y: the y coordinate
*
* Draws a horizontal line from (@x1, @y) to (@x2, @y) in @cr
* using the given style and state.
**/
void
gtk_cairo_paint_hline (GtkStyle *style,
cairo_t *cr,
GtkStateType state_type,
GtkWidget *widget,
const gchar *detail,
gint x1,
gint x2,
gint y)
{
g_return_if_fail (GTK_IS_STYLE (style));
g_return_if_fail (cr != NULL);
g_return_if_fail (GTK_STYLE_GET_CLASS (style)->draw_hline != NULL);
cairo_save (cr);
GTK_STYLE_GET_CLASS (style)->draw_hline (style, cr, state_type,
widget, detail,
x1, x2, y);
cairo_restore (cr);
} }
/** /**

View File

@ -166,9 +166,8 @@ struct _GtkStyleClass
*/ */
void (*draw_hline) (GtkStyle *style, void (*draw_hline) (GtkStyle *style,
GdkWindow *window, cairo_t *cr,
GtkStateType state_type, GtkStateType state_type,
GdkRectangle *area,
GtkWidget *widget, GtkWidget *widget,
const gchar *detail, const gchar *detail,
gint x1, gint x1,
@ -463,6 +462,14 @@ void gtk_paint_hline (GtkStyle *style,
gint x1, gint x1,
gint x2, gint x2,
gint y); gint y);
void gtk_cairo_paint_hline (GtkStyle *style,
cairo_t *cr,
GtkStateType state_type,
GtkWidget *widget,
const gchar *detail,
gint x1,
gint x2,
gint y);
void gtk_paint_vline (GtkStyle *style, void gtk_paint_vline (GtkStyle *style,
GdkWindow *window, GdkWindow *window,
GtkStateType state_type, GtkStateType state_type,

View File

@ -386,9 +386,8 @@ draw_gap_image_no_cairo(GtkStyle *style,
static void static void
draw_hline (GtkStyle *style, draw_hline (GtkStyle *style,
GdkWindow *window, cairo_t *cr,
GtkStateType state, GtkStateType state,
GdkRectangle *area,
GtkWidget *widget, GtkWidget *widget,
const gchar *detail, const gchar *detail,
gint x1, gint x1,
@ -398,9 +397,6 @@ draw_hline (GtkStyle *style,
ThemeImage *image; ThemeImage *image;
ThemeMatchData match_data; ThemeMatchData match_data;
g_return_if_fail(style != NULL);
g_return_if_fail(window != NULL);
match_data.function = TOKEN_D_HLINE; match_data.function = TOKEN_D_HLINE;
match_data.detail = (gchar *)detail; match_data.detail = (gchar *)detail;
match_data.flags = THEME_MATCH_ORIENTATION | THEME_MATCH_STATE; match_data.flags = THEME_MATCH_ORIENTATION | THEME_MATCH_STATE;
@ -411,12 +407,12 @@ draw_hline (GtkStyle *style,
if (image) if (image)
{ {
if (image->background) if (image->background)
theme_pixbuf_render_no_cairo (image->background, theme_pixbuf_render (image->background,
window, area, COMPONENT_ALL, FALSE, cr, COMPONENT_ALL, FALSE,
x1, y, (x2 - x1) + 1, 2); x1, y, (x2 - x1) + 1, 2);
} }
else else
parent_class->draw_hline (style, window, state, area, widget, detail, parent_class->draw_hline (style, cr, state, widget, detail,
x1, x2, y); x1, x2, y);
} }