Use cairo_push_group() for all double buffering, drop window_copy_*()
This commit is contained in:
parent
f39a9ccbb3
commit
e164e4ef72
@ -171,21 +171,20 @@ dnd_draw(struct dnd *dnd)
|
|||||||
{
|
{
|
||||||
struct rectangle allocation;
|
struct rectangle allocation;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
cairo_surface_t *wsurface, *surface;
|
cairo_surface_t *surface;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
window_draw(dnd->window);
|
window_draw(dnd->window);
|
||||||
|
|
||||||
window_get_child_allocation(dnd->window, &allocation);
|
surface = window_get_surface(dnd->window);
|
||||||
|
|
||||||
wsurface = window_get_surface(dnd->window);
|
|
||||||
surface = cairo_surface_create_similar(wsurface,
|
|
||||||
CAIRO_CONTENT_COLOR_ALPHA,
|
|
||||||
allocation.width,
|
|
||||||
allocation.height);
|
|
||||||
cairo_surface_destroy(wsurface);
|
|
||||||
|
|
||||||
cr = cairo_create(surface);
|
cr = cairo_create(surface);
|
||||||
|
window_get_child_allocation(dnd->window, &allocation);
|
||||||
|
cairo_rectangle(cr, allocation.x, allocation.y,
|
||||||
|
allocation.width, allocation.height);
|
||||||
|
cairo_clip(cr);
|
||||||
|
cairo_push_group(cr);
|
||||||
|
|
||||||
|
cairo_translate(cr, allocation.x, allocation.y);
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 0.8);
|
cairo_set_source_rgba(cr, 0, 0, 0, 0.8);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
@ -199,9 +198,9 @@ dnd_draw(struct dnd *dnd)
|
|||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cairo_pop_group_to_source(cr);
|
||||||
|
cairo_paint(cr);
|
||||||
cairo_destroy(cr);
|
cairo_destroy(cr);
|
||||||
|
|
||||||
window_copy_surface(dnd->window, &allocation, surface);
|
|
||||||
cairo_surface_destroy(surface);
|
cairo_surface_destroy(surface);
|
||||||
window_flush(dnd->window);
|
window_flush(dnd->window);
|
||||||
}
|
}
|
||||||
|
@ -140,7 +140,7 @@ image_draw(struct image *image)
|
|||||||
struct rectangle allocation;
|
struct rectangle allocation;
|
||||||
GdkPixbuf *pb;
|
GdkPixbuf *pb;
|
||||||
cairo_t *cr;
|
cairo_t *cr;
|
||||||
cairo_surface_t *wsurface, *surface;
|
cairo_surface_t *surface;
|
||||||
|
|
||||||
window_draw(image->window);
|
window_draw(image->window);
|
||||||
|
|
||||||
@ -153,14 +153,15 @@ image_draw(struct image *image)
|
|||||||
if (pb == NULL)
|
if (pb == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
wsurface = window_get_surface(image->window);
|
surface = window_get_surface(image->window);
|
||||||
surface = cairo_surface_create_similar(wsurface,
|
|
||||||
CAIRO_CONTENT_COLOR_ALPHA,
|
|
||||||
allocation.width,
|
|
||||||
allocation.height);
|
|
||||||
|
|
||||||
cairo_surface_destroy(wsurface);
|
|
||||||
cr = cairo_create(surface);
|
cr = cairo_create(surface);
|
||||||
|
window_get_child_allocation(image->window, &allocation);
|
||||||
|
cairo_rectangle(cr, allocation.x, allocation.y,
|
||||||
|
allocation.width, allocation.height);
|
||||||
|
cairo_clip(cr);
|
||||||
|
cairo_push_group(cr);
|
||||||
|
cairo_translate(cr, allocation.x, allocation.y);
|
||||||
|
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
|
||||||
cairo_set_source_rgba(cr, 0, 0, 0, 1);
|
cairo_set_source_rgba(cr, 0, 0, 0, 1);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
@ -169,11 +170,13 @@ image_draw(struct image *image)
|
|||||||
allocation.width, allocation.height);
|
allocation.width, allocation.height);
|
||||||
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
|
||||||
cairo_paint(cr);
|
cairo_paint(cr);
|
||||||
cairo_destroy(cr);
|
|
||||||
|
|
||||||
g_object_unref(pb);
|
g_object_unref(pb);
|
||||||
|
|
||||||
window_copy_surface(image->window, &allocation, surface);
|
cairo_pop_group_to_source(cr);
|
||||||
|
cairo_paint(cr);
|
||||||
|
cairo_destroy(cr);
|
||||||
|
|
||||||
window_flush(image->window);
|
window_flush(image->window);
|
||||||
cairo_surface_destroy(surface);
|
cairo_surface_destroy(surface);
|
||||||
}
|
}
|
||||||
|
@ -1102,30 +1102,6 @@ window_set_child_size(struct window *window, int32_t width, int32_t height)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
window_copy_image(struct window *window,
|
|
||||||
struct rectangle *rectangle, EGLImageKHR image)
|
|
||||||
{
|
|
||||||
/* set image as read buffer, copy pixels or something... */
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
window_copy_surface(struct window *window,
|
|
||||||
struct rectangle *rectangle,
|
|
||||||
cairo_surface_t *surface)
|
|
||||||
{
|
|
||||||
cairo_t *cr;
|
|
||||||
|
|
||||||
cr = cairo_create (window->cairo_surface);
|
|
||||||
|
|
||||||
cairo_set_source_surface (cr,
|
|
||||||
surface,
|
|
||||||
rectangle->x, rectangle->y);
|
|
||||||
|
|
||||||
cairo_paint (cr);
|
|
||||||
cairo_destroy (cr);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
idle_redraw(void *data)
|
idle_redraw(void *data)
|
||||||
{
|
{
|
||||||
|
@ -141,10 +141,6 @@ window_get_child_allocation(struct window *window,
|
|||||||
void
|
void
|
||||||
window_set_child_size(struct window *window, int32_t width, int32_t height);
|
window_set_child_size(struct window *window, int32_t width, int32_t height);
|
||||||
void
|
void
|
||||||
window_copy_image(struct window *window,
|
|
||||||
struct rectangle *rectangle,
|
|
||||||
void *image);
|
|
||||||
void
|
|
||||||
window_schedule_redraw(struct window *window);
|
window_schedule_redraw(struct window *window);
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -154,11 +150,6 @@ window_damage(struct window *window, int32_t x, int32_t y,
|
|||||||
cairo_surface_t *
|
cairo_surface_t *
|
||||||
window_get_surface(struct window *window);
|
window_get_surface(struct window *window);
|
||||||
|
|
||||||
void
|
|
||||||
window_copy_surface(struct window *window,
|
|
||||||
struct rectangle *rectangle,
|
|
||||||
cairo_surface_t *surface);
|
|
||||||
|
|
||||||
void
|
void
|
||||||
window_flush(struct window *window);
|
window_flush(struct window *window);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user