Use cairo_push_group() for all double buffering, drop window_copy_*()

This commit is contained in:
Kristian Høgsberg 2011-01-21 11:35:05 -05:00
parent f39a9ccbb3
commit e164e4ef72
4 changed files with 24 additions and 55 deletions

View File

@ -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);
} }

View File

@ -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);
} }

View File

@ -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)
{ {

View File

@ -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);