gdk: Use gdk_window_get_background_pixmap() when setting up paint
This commit is contained in:
@ -3660,49 +3660,31 @@ static cairo_t *
|
|||||||
setup_backing_rect (GdkWindow *window, GdkWindowPaint *paint, int x_offset_cairo, int y_offset_cairo)
|
setup_backing_rect (GdkWindow *window, GdkWindowPaint *paint, int x_offset_cairo, int y_offset_cairo)
|
||||||
{
|
{
|
||||||
GdkWindowObject *private = (GdkWindowObject *) window;
|
GdkWindowObject *private = (GdkWindowObject *) window;
|
||||||
|
GdkWindowObject *bg_private;
|
||||||
|
cairo_pattern_t *pattern;
|
||||||
|
int x_offset = 0, y_offset = 0;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
|
|
||||||
if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG && private->parent)
|
|
||||||
{
|
|
||||||
GdkWindowPaint tmp_paint;
|
|
||||||
|
|
||||||
tmp_paint = *paint;
|
|
||||||
tmp_paint.x_offset += private->x;
|
|
||||||
tmp_paint.y_offset += private->y;
|
|
||||||
|
|
||||||
x_offset_cairo += private->x;
|
|
||||||
y_offset_cairo += private->y;
|
|
||||||
|
|
||||||
cr = setup_backing_rect (GDK_WINDOW (private->parent), &tmp_paint, x_offset_cairo, y_offset_cairo);
|
|
||||||
}
|
|
||||||
else if (private->bg_pixmap &&
|
|
||||||
private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
|
|
||||||
private->bg_pixmap != GDK_NO_BG)
|
|
||||||
{
|
|
||||||
cairo_surface_t *surface = _gdk_drawable_ref_cairo_surface (private->bg_pixmap);
|
|
||||||
cairo_pattern_t *pattern = cairo_pattern_create_for_surface (surface);
|
|
||||||
cairo_surface_destroy (surface);
|
|
||||||
|
|
||||||
if (x_offset_cairo != 0 || y_offset_cairo != 0)
|
|
||||||
{
|
|
||||||
cairo_matrix_t matrix;
|
|
||||||
cairo_matrix_init_translate (&matrix, x_offset_cairo, y_offset_cairo);
|
|
||||||
cairo_pattern_set_matrix (pattern, &matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
|
|
||||||
|
|
||||||
cr = cairo_create (paint->surface);
|
cr = cairo_create (paint->surface);
|
||||||
|
|
||||||
|
for (bg_private = private; bg_private; bg_private = bg_private->parent)
|
||||||
|
{
|
||||||
|
pattern = gdk_window_get_background_pattern ((GdkWindow *) bg_private);
|
||||||
|
if (pattern)
|
||||||
|
break;
|
||||||
|
|
||||||
|
x_offset += bg_private->x;
|
||||||
|
y_offset += bg_private->y;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pattern)
|
||||||
|
{
|
||||||
|
cairo_translate (cr, -x_offset, -y_offset);
|
||||||
cairo_set_source (cr, pattern);
|
cairo_set_source (cr, pattern);
|
||||||
cairo_pattern_destroy (pattern);
|
cairo_translate (cr, x_offset, y_offset);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
|
||||||
cr = cairo_create (paint->surface);
|
|
||||||
|
|
||||||
gdk_cairo_set_source_color (cr, &private->bg_color);
|
gdk_cairo_set_source_color (cr, &private->bg_color);
|
||||||
}
|
|
||||||
|
|
||||||
return cr;
|
return cr;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user